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.
在第2074页的《技术参考手册》中,有以下注意事项:
CAN模块使用特殊的寻址方案来支持字节访问。 这与USB模块上使用的地址相同。
为便于使用,建议只对CAN寄存器进行32位访问。 但是,在较高的优化级别,编译器可能会将32位访问拆分为两个连续的16位访问,这将破坏寄存器值。 正在开发一个编译器修复程序。 同时,可以使用16位访问作为变通办法。 较低的16位应写入寄存器的地址,而较高的16位应写入寄存器的地址加2。
然后在第2097页上有以下注意事项:
只允许32位访问CAN寄存器,因为16位访问可能无法按预期工作。
此外,在CAN控制套件中,我找到了带有以下标题的文件CAN.c:
//文件: ccan.c
//
//标题: F2807x CAN初始化和支持功能。
//
//注:CAN总线桥接器使用不同的编址方案来实现
// 允许字节访问。 因此,可以执行32位读/写操作
// 在较高的优化水平下异常。 CAN驱动器功能正常
// 已调整为显式使用两个16位读/写访问
// 完整的32位寄存器,其中HWREGH (BASE + OFFSET)表示
// 下部16位和HWREGH (BASE + OFFSET +2)代表上部
// 16位。
但是,在文件CAN.c中,我发现许多行中可以使用32位访问权限读取CAN寄存器。
所以我有点困惑。
如何访问CAN寄存器?
我是否应该在书写和阅读中都只使用16位访问?
我是否应该在写入时使用16位访问和在读取时使用32位访问?
如果我使用16位访问,并且中断位于同一寄存器的较低16位访问和较高16位访问之间,那么数据传输是否会损坏?
我是否应该禁用中断,以便16位下访问和16位上访问严格地按顺序进行?
Demis,
您引用的注释不再有效,将在TRM的下一版本中删除。 现将其替换为以下注释:
CAN模块使用特殊的寻址方案来支持字节访问。 建议使用HWREG_BP()宏(使用__byte_peripheral_32()内在过程)仅使用32位访问CAN寄存器。 如果要使用16位访问,则应将较低的16位写入寄存器的地址,而较高的16位写入寄存器的地址加2。
Demis
为了补充Hareesh提到的内容,自从您所引用的CAN驱动程序的上次更新以来,我们创建了一个编译器内在(__byte_peripheral_32()),它可以正确地处理这些32位读/写操作。 这现在是访问寄存器的首选方法。 支持该驱动程序的hw_types.h文件尚未使用必需的硬件访问宏进行更新。
下面是您要添加的宏。
#define HWREG_BP(x)__byte_peripheral_32(UINT32_t *)(x)
此外,现在还有一个新的驱动程序库,我建议您在引用该库的同时使用它。 新的软件包C2000Ware ( www.ti.com/.../c2000ware )中提供了新的软件包。 可在~/C2000Ware_1_00_00/driverlib/f2807x找到2807找到
此致
Chris
感谢您的回答。
我下载了新的CAN驱动程序,但我注意到HWREG_BP宏和HWREGH宏(16位访问!) 。 此外还有两个函数(CAN_readDataReg和CAN_writeDataReg),其中HWREGB宏(8位访问!!!) 。
所以我不知道是否可以使用对CAN寄存器的8位和16位访问。
您好,您能告诉我您从哪里下载 了TMS320F2.8075万 器件的最新CAN和CANopen驱动程序吗? 非常感谢。
不,我不知道。
我们正在开发自己的图书馆。
此致,
Demis