工具/软件:Code Composer Studio
现在我使用 CAN 通信来连接16个器件、所有这些器件都是 F28377板、运行相同的程序、但通常会出现通信超时、总线负载为160帧/秒、端子电阻为120欧姆、波特率为500k。 采样点为80%。 两个器件之间的通信没有问题。 超时次数越多、超时现象发生的频率就越高。 司机是按照官方程序完成的。 解决方案是什么?
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.
工具/软件:Code Composer Studio
现在我使用 CAN 通信来连接16个器件、所有这些器件都是 F28377板、运行相同的程序、但通常会出现通信超时、总线负载为160帧/秒、端子电阻为120欧姆、波特率为500k。 采样点为80%。 两个器件之间的通信没有问题。 超时次数越多、超时现象发生的频率就越高。 司机是按照官方程序完成的。 解决方案是什么?
请说明“超时”的含义。 您是否指的是总线关闭情况? 如果是这样、您应该会在总线上看到很多错误帧。 您是否有显示总线活动的 CAN 总线分析器?
[报价]两个器件之间的通信没有问题。[/报价]
您是否说总线上只有2个器件时没有问题? 或者、您是否说只有2个器件在总线上通信时没有问题、即使其他14个器件在总线上仍然存在? 正在通信的两个节点是否位于总线的两端?
[引用]超时次数越多,超时现象就越频繁。 [/报价]
很抱歉,我不明白你在上述发言中想说什么。
请查看 SPRA876中的调试检查清单。
//读取 CAN-A 中断状态以查找中断原因 状态= CANIntStatus (CAN_BASE、CAN_INT_STS_CAUST); //如果原因是控制器状态中断,则获取状态 if (status = CAN_INT_INT0ID_STATUS){ // //读取控制器状态。 这将返回状态字段 //可以指示各种错误的错误位。 错误处理 //本示例中不是为了简单起见。 请参阅 // API 文档,了解有关错误状态位的详细信息。 //读取此状态的操作将清除中断。 // STATUS = CANStatusGet (CAN_BASE、CAN_STS_CONTROL); //检查是否发生错误。 if (status = CAN_ES_RXOK){ STATUS = CANStatusGet (CAN_BASE、CAN_STS_NEWDAT); if (status =(1ul<<(rx_obj_id-1))){ 状态= dcsRx; } 如果(rx_objs 和 status){ obj_mask = status; 状态= dcsRxs; } 如果(0!= status){ obj_mask = status; State = dcsErrs; }
--------------------------------------------------
我有这样一段代码、CAN_STS_CONTROL 寄存器的值返回为 CAN_ES_RXOK、然后 CAN_STS_NEWDAT 寄存器的值返回为0。 我看到 f28377数据表显示、当没有写入数据时、返回值为0、为什么会出现? ? 如何解决这一问题?
CANES 寄存器中的 RXoK 位置位、即可得知节点在总线上监控了一个帧、没有任何错误。 即、节点目睹了一个完整的帧而没有错误。 这并不一定意味着帧被接收到其中一个接收邮箱中。 您需要监视邮箱 RAM 以验证您所期望的帧是否已在您所期望的 MBX 中被实际接收。 我建议您在开始时不要使用任何类型的筛选。 并首先使用轮询、而不是中断。 一旦您知道邮箱正确接收了数据、您就可以添加滤波和中断、前提是您的应用有此保证。