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.
你好
我通过 有线连接将 TCAN4550EVM 连接到我的板。
我正在尝试使用 Linux 驱动程序代码制作固件(从最新版本开始.. 5.12.xxx)。
我的板不使用 Linux、但我找不到其他驱动程序源代码。
无论如何、 它在北向工作、但有时 SPI 总线会进入错误状态。
根据 Linux 代码、我第一次将 MO 设置为正常。
置位后、我的代码中的该值不会改变。
h0800:0xc8004a8
我想手动控制 CAN 总线启动/停止。
当处于停止状态时、我希望 CAN 总线忽略所有信号。 (不要做出反应或重新侦察)
希望 CAN 总线以新的通信包接收器启动条件开始。
我制作了我的固件源、如 Linux 代码流- m_CAN_start()/ m_CAN_stop()
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 */ m_can_disable_all_interrupts(cdev); /* Set init mode to disengage from the network */ m_can_config_endisable(cdev, true); /* set the state as STOPPED */ cdev->can.state = CAN_STATE_STOPPED; }
开始时间 TCAN 寄存器像这样进行控制(m_CAN_start()函数代码)
我不介绍 M_CAN FIFO 清除操作
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 W 0x1058 val:0x00000000 W 0x101c val:0x00003a13 W 0x100c val:0x00000e30 R 0x1018 val:0x00000303 W 0x1018 val:0x00000300 R 0x1018 val:0x00000300 W 0x105c val:0x00000001
像这样停止状态运行(m_CAN_STOP()函数代码)
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
通常、它在启动状态下工作良好。
但是、如果处于停止状态、如果 CAN 总线中存在数据包、
TCAN 保存此数据包、在启动状态后出现中断信号。
此时、SPI 总线进入某种错误状态。
如果我读取 reg、我无法立即读取它。
读取两次、读取寄存器值正确。
这是正常的中断句柄流程
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
这是错误的 SPI 状态
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
之后、我尝试手动注册、我必须读取两次。
我认为 SPI 总线似乎不能以4字节宽度工作。 LT 看起来像2字节宽度。
我检查了具有振荡器的 SPI 读取命令信号、它发送了正确的命令信号
Q1是否有可能发生这种情况? 或者这是我的错误控制吗?
Q2、我希望 CAN 总线在停止状态时忽略所有内容。
我应该控制 TCAN 运行模式以待机吗?
问题3. 是否有任何有关 TCAN4550 (不是 Linux 代码)的其他驱动程序示例?
谢谢你
我发现了此问题的再次出现。 它不是 TCAN 问题。