[技术问答] AC78xx CAN模块使用TSONE发送漏帧问题

[复制链接]
 楼主| JasonLee27 发表于 2021-7-15 14:08 | 显示全部楼层 |阅读模式
硬件环境:AC7801x 通用开发板
软件环境:keil 5.23

我们在使用STB次发送缓冲区,采用TSONE方式发送的时候,有时候会发现少发了数据帧,特别是高频率发送的时候,这是因为连续多次的调用发送函数,实际只触发了一次发送。
使用STB TSONE的发送流程是,选择STB缓冲区,填入报文,触发TSONE发送。此时报文处于发送状态。如果这个时候再次调用发送函数,会重复执行上述步骤,但因为此时正处于发送状态,TSONE本就为1,再次写1不会触发新的发送。当上一帧报文发送结束后,硬件清除TSONE,这时候后填入的这帧报文就被遗留在缓冲区中。哪怕再次调用发送函数,填入了新的报文,但触发发送只会发送最早填入的一帧报文,这样又有新报文被遗留下来,多次累积,最终结果会导致缓存溢出,总线上的现象就是报文发送延迟,有报文没有发出等。

在AC7801x的应用笔记里面对这个问题提供了解决办法,那就是在发送成功中断中对缓冲区进行判断:
  1. if (wpara & CAN_CTRL1_TSIF_Msk)
  2.     {
  3.         if (!CAN_IsTransmitIdle((CAN_Type*)device, CAN_TRANSMIT_SECONDARY))
  4.         {
  5.             CAN_StartTransmission((CAN_Type*)device, CAN_TRANSMIT_SECONDARY, CAN_TRANSMIT_ONE);
  6.         }
  7.     }
上述是中断中判断STB发送成功的代码,当STB发送成功后,对STB缓冲区的状态进行判断,若不为空,表明缓冲区有报文,则此时只需要触发TSONE发送即可,不需要额外填充报文。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部