嵌入式技术论坛
直播中

贾大林

7年用户 1336经验值
私信 关注
[问答]

RTThread发送CAN数据异常是什么原因造成的

开发环境: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卡。

1.jpg

6.在发送数据乱的不行,正确的数据,发出来是错的,已经把我的机器人搞伤了。实在没法子,只能一步一步跟踪底层了。突然发现一个问题:

官方强制将pmsg移位后的数据强制转变成32位的,这样原本是0的值就会变成ff。

1.jpg

不改的情况下,发送的数据是:

1.jpg

CAN卡接收到的数据是:

1.jpg

修改官方底层代码为:

1.jpg

can卡收到的数据就正常了:

1.jpg

心疼我的代码,改了好久。还没得深究,宏定义有问题?

回帖(5)

刘静

2022-10-10 15:26:39
这些不对的数据都具备哪样的特征呢?具体讲讲
比如复现频率,出现错误的位置是否固定,或者从你认为可能出现错误的点出发,设计更多的tripple例程
举报

贾大林

2022-10-10 15:27:37
我不完全统计和确认,但是好像每个字节的数值越大越不对,比如08没错,但是bb可能就错了。我后面在测试测试!

跟发送太快,CAN缓冲不够,被数据覆盖有联系不?或者这一方面的类似问题?

我跟踪到底,发现drv_can文件里的这里是这样的。其中pmsg的值是对的,但是赋值到邮箱时,像是错了?

1.jpg

2.jpg


举报

刘静

2022-10-10 15:27:46
看起来是data[]有符号号的,强转无符号时出现补码了,你指令级单步确认下,或修改下数据类型。
举报

贾大林

2022-10-10 15:28:20
是的,一开始我也觉得本身是8位的,我试着把rt_uint8_t也去掉还是不行,保留才行。

你这么说应该是,是补码造成的。

为啥我们的官网看图不能放大呢?

int main()
{
  rt_int8_t a=0x11,b=0x22;
    uint32_t c=0;
    while (1)
    {
        c=(uint32_t)a<<24|(uint32_t)b<<8;
        LOG_I("%08x",c);
        rt_thread_delay(500);
    }
}
但是这种他又没出错啵

1.jpg
举报

刘静

2022-10-10 15:28:29
好像只能先按住ctrl键再滑动鼠标中键来放大图片
举报

更多回帖

发帖
×
20
完善资料,
赚取积分