嵌入式技术论坛
直播中

fansz

8年用户 1249经验值
擅长:制造/封装
私信 关注
[问答]

RTT4.1.0使用CAN发送数据出错是何原因

开发环境:RTT4.1.0+STM32F407VET6
功能描述:基于CAN,实现CANopen基本的操作。
遇到问题:参考RTT官网的CAN例程,修改后,确实可以发送数据。但是,突然发现某个伺服电机不动,后来采集报文,发现数据不对。举个例子。我发的是4个字节的,0x00000b8f;但是通过CAN总线收到的确是0xffffbf8f,就像是0的地方都变成了f。试了很多次都是这样,发送其他数据又正常。

CAN发送数据的函数如下:

rt_err_t servo_send(rt_uint32_t nodeid, rt_uint16_t cmd, rt_int32_t speed)
{
rt_err_t ret = RT_EOK;
rt_size_t size = 0;
struct rt_can_msg msg = { 0 };
msg.id = nodeid;
msg.ide = RT_CAN_STDID; /* 标准格式 /
msg.rtr = RT_CAN_DTR; /
数据帧 /
msg.len = 6; /
数据长度为 8 /
/
待发送的 8 字节数据 /
msg.data[0] = cmd;
msg.data[1] = cmd >> 8;
msg.data[2] = speed&0x000000ff;
msg.data[3] = (speed&0x0000ff00) >> 8;
msg.data[4] = (speed&0x00ff0000) >> 16;
msg.data[5] = (speed&0xff000000) >> 24;
/
发送一帧 CAN 数据 */
size = rt_device_write(can_dev, 0, &msg, sizeof(msg));
if (size == 0)
{
ret = RT_ERROR;
rt_kprintf("can dev write data failed!\n");
}
return ret;
}

回帖(5)

李燕

2022-9-22 10:12:10
可以在这个函数中加LOG,发送的数据打印出来,
举报

fansz

2022-9-22 10:12:44
1.jpg
其他数据,后面也不对。是不是采样点那些没设置好?
不得不服 2.jpg
举报

李燕

2022-9-22 10:13:07
可以试试裸机,排除操作系统问题,看上去像是通讯除了问题,降降速率、设置一下CAN的参数看看,标准CAN应该有三个采样参数需要配
举报

fansz

2022-9-22 10:13:15
一般陪多少合适呢?我也觉得是速率和采样的问题,但是不知道设多少合适,试着设几个采样点都通讯不上!目前是走网线,然后500k的波特率!
举报

李燕

2022-9-22 10:13:24
这个要跟从机统一起来,设置方法

/* STM32F103C8T6 CAN 波特率400Kbps 计算的方法
* 这里CAN 总线挂在APB1总线上,而APB1总线最高的频率不是72MHz,最大36MHz,默认配置的为36MHz。
* BaudRate = 1/ NominalBitTime
* NominalBitTime = 1*tq + tBS1 + tBS2,与SJW无关。
* tBS1 = 6*tq  tBS2 = 3*tq,因此 NominalBitTime = (1 + 6 + 3)*tq
* 注意,这里还有个分频为9。
* 1tq = 1/(APB1_Freq/分频) = 1/(36MHz/9) = 4MHz。
* BaudRate = 1 / (1/4Mhz * (1 + 6 + 3)) = 4Mhz/(1+6+3) = 4Mhz/10 = 400K (bps)
*/
举报

更多回帖

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