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.

AM335X 在CAN 总线满负荷时,发送高ID优先级帧竞争失败

我们使用AM335x ,Linux内核版本为4.4.12,QT5.8 开发时发现ID高优先级帧仲裁失败问题。具体如下

如果CAN总线上数据量非常大,几乎到达100%占用的时候,即便是我们使用socket write的数据包ID优先级高于总线上的数据包,依然会仲裁失败,然后一直堵着直到CAN TX 缓冲区满为止。如果测试满负荷用的设备停止发送,则马上恢复正常。

CAN ID越小优先级越高,这个我应该没有理解错误。我们只是用了29bit ID的数据帧这一个类型。

期初怀疑是否CAN驱动不会按照ID的优先级排序,因此上位机停止发送低优先级数据,只发送高于总线数据优先级的数据,但是在断断续续的成功发送之后,又无法仲裁成功,直到CAN Tx buffer满错误为止。

按CAN总线的原理,这种情况不应该出现,AM335x应当总是能总线仲裁成功。

下位机是使用STM32实现参数如下:

Prop-Seg+Phase_Seg1=8
PropSeg2=7
SJW=4
TQ=500ns,
上位机AM335x参数如下:
tq=500,bitrate=125000,sample-point=0.875,Prop-Seg=6,Phase-seg1=7,Phase-seg2=2,sjw=1
c_can:tseg1 2..16  tseg2 1..8 sjw 1..4  brp 1..1024 brp-inc 1
我打算试试把Prop-Seg,Phase_Seg1,PropSeg2,SJW参数调整成一致试试。
但理论上即便这些参数不一致,也不会有问题。有效跳变在SYNC_SEG段应该启动,而我测试总线长度不及30厘米,stm32下位机全部使用的外部200PPM的爱普生高速晶振,所以应该不会有如此大的时钟误差。
因此想请教一下,这种仲裁失败是什么原因引起的?