问题遇到的现象和发生背景
将STM32ZET6的CAN通信代码移植到RCT6里,无法通信
问题相关代码,请勿粘贴截图
主函数进入: Can_Send_Msg(canbuf,8);CAN发送函数后,
u8 Can_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0; // 标准标识符
TxMessage.ExtId=PASS_ID; // 设置扩展标示符
TxMessage.IDE=CAN_Id_Extended; // 扩展帧
TxMessage.RTR=CAN_RTR_Data; // 数据帧
TxMessage.DLC=len; // 要发送的数据长度
for(i=0;i<len;i++)
TxMessage.Data[i]=msg[i];
mbox= CAN_Transmit(CAN1, &TxMessage); //返回发送邮箱号
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束
if(i>=0XFFF)return 1;
return 0;
}
在 mbox= CAN_Transmit(CAN1, &TxMessage); //返回发送邮箱号 这报错
运行结果及报错内容
通过DEBUG调试, mbox= CAN_Transmit(CAN1, &TxMessage); 发现在这出错:
正常发送:
其TSR寄存器的值为3,但是移植到RCT6后其值为9.
9就是位3和位1为1,查看CAN的发送管理:
位3 :
TERR0: 邮箱0发送失败
当邮箱0因为出错而导致发送失败时,对该位置1。
我的解答思路和尝试过的方法
查资料说CAN.c和.h文件的配置都是通用的,只用考虑不同型号的单片机对CAN通信的时钟频率不一样的问题,但是通过函数发现其时钟都是36M都不用修改。
参考:https://liu-endong.blog.csdn.net/article/details/112016178
我想要达到的结果
知道TERR0出错的原因,如何修改