STM32,can高速多数据连发,新手导向.
- 问题:STM32的can数据发送,使用后发现每次如果发送超过3个字节就得延时,不然数据会丢失.网上查了些资料发现是can只有3个邮箱,所以如果邮箱满了就发送不了了.而且不延时发送的话数据顺序还会打乱.下面直接上代码.
-
- can的库函数发送等待函数
- ↑这里是判断邮箱0是否为空,一共3个邮箱,但是如果判断三个任意一个为空就发送的话,多节点大量数据迸发的话,有可能出现发送数据顺序错乱.所以这里我只拿了邮箱0来发送.
- can的库函数底层发送函数
- ↑因为只使用了邮箱0,所以把邮箱1和2给屏蔽了,这样发送的时候只会通过邮箱0进行发送.
- 网上很多发送例程,但是实测下来发送多数据的时候会发送失败,一开始我也是没发一次数据就延时一次.CAN_TransmitStatus(CAN1, mbox)这个判断函数是判断是否发送成功,但是没有判断邮箱是否为空,很多发送函数就是只判断了是否发送成功,连续发送的时候就出问题了.
- 发送实例图
- 数据接收图
- 接收端
- **发送端**
- 这篇文章有介绍can的寄存器可以参考
2022年5月16日17:24:40更新,多节点,数据传输出现数据错乱的一点补充,具体内容补充到最下面.
问题:STM32的can数据发送,使用后发现每次如果发送超过3个字节就得延时,不然数据会丢失.网上查了些资料发现是can只有3个邮箱,所以如果邮箱满了就发送不了了.而且不延时发送的话数据顺序还会打乱.下面直接上代码.
can的库函数发送等待函数
u8 CanTx(u8 *buff,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
if(len <= 8)
{
TxMessage.StdId = TX_FILTER_ID; //标准标识符
TxMessage.ExtId = TX_FILTER_ID; //扩展标识符0x0000
TxMessage.IDE = CAN_ID_EXT; //使用扩展帧
TxMessage.RTR = CAN_RTR_DATA; //为数据帧
TxMessage.DLC = len; //消息的数据长度为2个字节
CAN1->TSR &=~ CAN_IT_RQCP0; //清除邮箱0的的完成位,该位被清’0’时,邮箱0的其它发送状态位(TXOK0, ALST0和TERR0)也被清’0’。
memcpy(TxMessage.Data,buff,len);
mbox= CAN_Transmit(CAN1,&TxMessage); //发送数据
while(1)
{
i++;
//检测TXOK0位是否置1,发送成功会被置1.参考手册的TSR寄存器,第一位代表的是邮箱1发送完成位.如果需要3个邮箱同时开启,可以同时检 测mbox返回的对应的邮箱.
if((CAN1->TSR)&0x02)
{
return 1;
}
if(i>=0XFFFF)
{
Can_Config();//总线异常,重新初始化
CAN_Transmit(CAN1,&TxMessage); //再次发送数据
return 0;