开发环境:RTT4.1.0+STM32F407VET6
功能描述:基于CAN,实现CANopen基本的操作。波特率500K。
遇到问题:参考RTT官网的CAN例程,修改后,确实可以发送数据。但是,发现发送的数据有不少不对。
已排除的问题:
1.不存在硬件问题,裸机测试没问题。可以正常发送任何数据!
2.在STM32F429IG上面使用500K波特率不出现错误。
3.从500K试到50K都是相同的错误。
4.发送的数据内容:
struct rt_can_msg msg = { 0 };
msg.id = 0x78; /* ID 为 0x78 */
msg.ide = RT_CAN_STDID; /* 标准格式 */
msg.rtr = RT_CAN_DTR; /* 数据帧 */
msg.len = 8; /* 数据长度为 8 */
msg.data[0]=0;
msg.data[1]=1;
msg.data[2]=2;
msg.data[3]=3;
msg.data[4]=4;
msg.data[5]=5;
msg.data[6]=6;
msg.data[7]=7;
rt_device_write(can_dev, 0, &msg, sizeof(msg));
msg.id = 0x38; /* ID 为 0x38 */
msg.ide = RT_CAN_STDID; /* 标准格式 */
msg.rtr = RT_CAN_DTR; /* 数据帧 */
msg.len = 8; /* 数据长度为 8 */
msg.data[0]=03;
msg.data[1]=0;
msg.data[2]=0xb8;
msg.data[3]=0x0b;
msg.data[4]=0;
msg.data[5]=0;
msg.data[6]=0;
msg.data[7]=0;
rt_device_write(can_dev, 0, &msg, sizeof(msg));
5.接收到的报文,存在错误。当前CAN设备连接为STM32F407VET6+周立功CAN卡。
6.在发送数据乱的不行,正确的数据,发出来是错的,已经把我的机器人搞伤了。实在没法子,只能一步一步跟踪底层了。突然发现一个问题:
官方强制将pmsg移位后的数据强制转变成32位的,这样原本是0的值就会变成ff。
不改的情况下,发送的数据是:
CAN卡接收到的数据是:
修改官方底层代码为:
can卡收到的数据就正常了:
心疼我的代码,改了好久。还没得深究,宏定义有问题?
更多回帖