最近有个项目用到CAN,由于公司外挂的设备可能越来越多,我希望最大程度的利用CAN邮箱,想通过一个邮箱发送不同的ID,以下是我根据ID寄存器手册描述配置的一段修改邮箱ID的程序,还是修改不了,有配置过朋友一起讨论一下吧

最近有个项目用到CAN,由于公司外挂的设备可能越来越多,我希望最大程度的利用CAN邮箱,想通过一个邮箱发送不同的ID,以下是我根据ID寄存器手册描述配置的一段修改邮箱ID的程序,还是修改不了,有配置过朋友一起讨论一下吧

在TI的TMS320F28335 DSP中使用eCAN模块时,确实可以通过软件在运行时动态地修改CAN邮箱的ID,但这需要正确地配置和控制eCAN的寄存器。首先,确保你已经正确初始化了eCAN模块,包括设置时钟、进入配置模式、配置邮箱等。
对于修改CAN邮箱的ID,你需要关注的是邮箱的配置寄存器,特别是与邮箱ID相关的寄存器。在F28335中,每个邮箱的配置通常包括多个寄存器,包括邮箱方向、消息ID、消息控制等。以下是一些基本的步骤和注意事项,用于在运行时修改CAN邮箱ID:
确保eCAN模块处于配置模式。这通常通过设置ECANMCTL寄存器中的INITREQ位来实现,然后等待INITACK位被设置,表示eCAN模块已进入配置模式。
// 假设ECAN_Regs为指向eCAN模块寄存器的指针
ECAN_Regs.ECANMCTL.bit.INITREQ = 1; // 请求进入配置模式
// 等待INITACK位被设置
while (!ECAN_Regs.ECANMCTL.bit.INITACK);
对于大多数TI的eCAN实现,每个邮箱的ID通常存储在多个寄存器中,特别是当使用标准ID或扩展ID时。你需要查找你的具体邮箱编号(如邮箱0、邮箱1等)对应的寄存器,并修改其中的值。
假设你正在修改邮箱0的ID,并且使用标准ID格式,你可能需要修改类似CAN0MSGID0的寄存器(注意,这里的寄存器名称和编号可能因你的具体DSP型号和开发环境而异)。
// 假设使用标准ID,且邮箱0的ID寄存器为CAN0MSGID0
// 设置邮箱0的ID为0x123(注意:这可能需要适当的位移和掩码操作)
ECAN_Regs.MAILBOXES.MBOX0.CANMD.bit.STDID = 0x123; // 假设STDID是直接可设置的,实际情况可能需要更复杂的操作
// 注意:上述代码仅为示例,实际中可能需要更详细的配置
修改完成后,需要将eCAN模块从配置模式切换到操作模式。这通过清除INITREQ位实现。
ECAN_Regs.ECANMCTL.bit.INITREQ = 0; // 退出配置模式
// 再次等待INITACK位被清除,表示已退出配置模式(可选)
while (ECAN_Regs.ECANMCTL.bit.INITACK);
CANMXIDE(X为邮箱编号)寄存器中的IDE位和相应的ID寄存器。如果上述步骤仍然无法解决问题,建议检查你的硬件连接和DSP的硬件手册,确保没有硬件相关的问题。此外,查看TI的官方文档和社区论坛也可能提供额外的帮助。