This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TCAN4550:TCAN4550 SPI 操作进入错误状态

Guru**** 1963975 points
Other Parts Discussed in Thread: TCAN4550EVM, TCAN4550
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/995339/tcan4550-tcan4550-spi-operation-goes-to-wrong-state

器件型号:TCAN4550

你好

我通过 有线连接将 TCAN4550EVM 连接到我的板。

我正在尝试使用 Linux 驱动程序代码制作固件(从最新版本开始.. 5.12.xxx)。

我的板不使用 Linux、但我找不到其他驱动程序源代码。

无论如何、 它在北向工作、但有时 SPI 总线会进入错误状态

根据 Linux 代码、我第一次将 MO 设置为正常。

置位后、我的代码中的该值不会改变。

h0800:0xc8004a8

我想手动控制 CAN 总线启动/停止。

当处于停止状态时、我希望 CAN 总线忽略所有信号。 (不要做出反应或重新侦察)

希望 CAN 总线以新的通信包接收器启动条件开始。

我制作了我的固件源、如 Linux 代码流- m_CAN_start()/ m_CAN_stop()

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void m_can_start(struct net_device *dev)
{
struct m_can_classdev *cdev = netdev_priv(dev);
/* basic m_can configuration */
m_can_chip_config(dev);
cdev->can.state = CAN_STATE_ERROR_ACTIVE;
m_can_enable_all_interrupts(cdev);
}
static void m_can_stop(struct net_device *dev)
{
struct m_can_classdev *cdev = netdev_priv(dev);
/* disable interrupts */
m_can_write(cdev, M_CAN_IR, IR_ALL_INT);
m_can_write(cdev, M_CAN_IE, 0);
/* disable all interrupts */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

开始时间 TCAN 寄存器像这样进行控制(m_CAN_start()函数代码)

我不介绍 M_CAN FIFO 清除操作

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
R 0x1018 val:0x00000303
W 0x1018 val:0x00000303
W 0x1018 val:0x00000303
R 0x1018 val:0x00000303
W 0x10bc val:0x00000777
W 0x1080 val:0x00000000
W 0x10c0 val:0x01000488
W 0x10c8 val:0x00000007
W 0x10f0 val:0x00010480
W 0x10a0 val:0x00100000
W 0x10b0 val:0x00000480
R 0x1018 val:0x00000303
R 0x1010 val:0x00000080
W 0x1018 val:0x00000303
W 0x1010 val:0x00000080
W 0x000c val:0xffffffff
W 0x0824 val:0xffffffff
W 0x0820 val:0xffffffff
W 0x0010 val:0xffffffff
W 0x1050 val:0xdfffffff
W 0x1054 val:0xe7ffffff
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

像这样停止状态运行(m_CAN_STOP()函数代码)

Fullscreen
1
2
3
4
5
6
7
W 0x1050 val:0xffffffff
W 0x1054 val:0x00000000
W 0x105c val:0x00000000
R 0x1018 val:0x00000300
W 0x1018 val:0x00000301
W 0x1018 val:0x00000303
R 0x1018 val:0x00000303
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

通常、它在启动状态下工作良好。

但是、如果处于停止状态、如果 CAN 总线中存在数据包、

TCAN 保存此数据包、在启动状态后出现中断信号。

此时、SPI 总线进入某种错误状态。

如果我读取 reg、我无法立即读取它。

读取两次、读取寄存器值正确。

这是正常的中断句柄流程

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
R 0x1050 val:0x00000001
W 0x1050 val:0x00000001
W 0x000c val:0xffffffff
W 0x0824 val:0xffffffff
W 0x0820 val:0xffffffff
W 0x0010 val:0xffffffff
W 0x105c val:0x00000000
R 0x1050 val:0x00000000
R 0x1044 val:0x00000748
R 0x10a4 val:0x00010001
W 0x10a8 val:0x00000000
R 0x10a4 val:0x00010100
W 0x105c val:0x00000001
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这是错误的 SPI 状态

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
R 0x1050 val:0x00000000 // can't read first time
R 0x1050 val:0x00000000
R 0x1050 val:0x2100000d // read corectly but other flags occured
W 0x1050 val:0x2100000d
W 0x000c val:0xffffffff
W 0x0824 val:0xffffffff
W 0x0820 val:0xffffffff
W 0x0010 val:0xffffffff
W 0x105c val:0x00000000
R 0x1050 val:0x00000000
R 0x1044 val:0x00000008
R 0x10a4 val:0x00000710
W 0x10a8 val:0x00000007
R 0x10a4 val:0x00000000
W 0x105c val:0x00000001
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

之后、我尝试手动注册、我必须读取两次。

我认为 SPI 总线似乎不能以4字节宽度工作。 LT 看起来像2字节宽度。

我检查了具有振荡器的 SPI 读取命令信号、它发送了正确的命令信号

Q1是否有可能发生这种情况? 或者这是我的错误控制吗?

Q2、我希望 CAN 总线在停止状态时忽略所有内容。

     我应该控制 TCAN 运行模式以待机吗?

问题3. 是否有任何有关 TCAN4550 (不是 Linux 代码)的其他驱动程序示例?

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现了此问题的再次出现。 它不是 TCAN 问题。

x 出现错误。请重试或与管理员联系。