硬件环境: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发送即可,不需要额外填充报文。
|