你好
我通过 有线连接将 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 代码)的其他驱动程序示例?
谢谢你