两块板子做can通讯测试,两个代码都是一样的,发送的CAN数据也是一样的,并且都同时接受,也同时发送,运行一段时间后,发现两个板子不通讯了,复位一个板子能同时通讯上。
我修改一个板子上 CAN_TxMessage.ExtId数据,就是两个板子上的29码不同,运行一夜,通讯一直能成功。
进一步分析问题,如果两个板子都发送同样的ID码( 29位码),CAN通讯会出错,我仿真过了,程序是正常的,在发送数据的时候temp = CAN_Transmit(&CAN_TxMessage);返回数据是temp = CAN_NO_MB,也就是说发送邮箱满了,不能发送了。
我的问题是,CAN节点都发送同样的ID码,CAN总线会阻塞吗?是什么原因造成阻塞的?
LZ 相同ID怎么判断优先级????????????怎么进行传输??????
两个板之发同样的数据,在实际应用没意义。29位码可以一样,后面8个字节不一样就可以总线总裁了。
29位码一样?
29位码一样?这怎么行?如果没有记错,CAN的总线仲裁是根据ID(11位或29位)、帧的类型(远程帧、数据帧),29位码如果相同,可能很快就会出错。
不知道顶楼的是否知道CAN Bus的仲裁方式?
在同一总线上出现了,扩展帧的29为ID全部相同,意味什么?不解释你也知道。
1、当存在仲裁是,报文退出发送状态,邮箱中数据发不出去,等待下一次的发送;
2、邮箱出不去,发送错误计数器(Transmit Error Counter (TEC))+8,加到127进入“错误被动(Error Passive)”模式,如果还不处理,TEC加到+255,节点自动退出总线;
3、如有数据发送成功,TEC会-1的,发送和接收都是一样。
你所说的“通讯阻塞”大概就是这个原因吧,换个说法:你做好了错误管理吗?发送是TEC,接收是REC,看STM32的CAN Bus模块的“CAN错误状态寄存器 (CAN_ESR)”
把两个邮箱的ID设成一致,确实没有什么实在的意义,CAN通信之所以能够广播式发送,就是通过ID来区分的