STM32CAN通信

问题遇到的现象和发生背景

将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); 发现在这出错:
正常发送:

img

其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出错的原因,如何修改