打印
[技术问答]

AC78xx CAN模块使用TSONE发送漏帧问题

[复制链接]
5708|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JasonLee27|  楼主 | 2021-7-15 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件环境:AC7801x 通用开发板
软件环境:keil 5.23

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

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

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

10

粉丝