#平台:STM32F405RGT6 库函数版本
最近在做一个CAN/2.4G冗余的通信设计,CAN在线就用CAN通信,反之则切换到无线。一般有线如RS485通信须从机返回一个应答帧来确认数据发送成功与否,但是这种方法会降低通信效率。
CAN可以通过邮箱状态来判断数据是否发送成功。如果邮箱中的报文被成功发送,那么邮箱状态变为空邮箱。如果邮箱中的报文发送失败了,那么邮箱状态变为无空闲邮箱。
void CAN1_Send_Msg(u8* msg,u8 len)
{
u8 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // 标准标识符为0
TxMessage.ExtId=0x12; // 设置扩展标示符(29位)
TxMessage.IDE=0; // 使用扩展标识符
TxMessage.RTR=0; // 消息类型为数据帧,一帧8位
TxMessage.DLC=len; // 发送两帧信息
for(i=0;i<len;i++)
TxMessage.Data[i]=msg[i]; // 第一帧信息
CAN_Transmit(CAN1, &TxMessage);
delay_ms(10);//最小时间间隙为5ms
while((CAN1->TSR&CAN_TSR_TME0) != CAN_TSR_TME0)//如果邮箱0不是空,代表数据发送失败
{
can1Error=true;
return;
}
can1Error=false;
}
特别注意,此方法只能在两台设备之间通信有用,多台设备不合适。
下面是工程文件,里面还包括CAN2的数据发送状态判断。
STM32F4 CAN怎么判断数据是否发送成功
版权声明:本文为qq_39927210原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。