打印
[STM32F1]

STM32F103C8T6的CAN通信调试问题

[复制链接]
6419|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
剡溪渡口|  楼主 | 2016-4-12 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CAN通信调试好几天了,被一个问题卡住,用到是3.5的库,发送函数先贴出代码
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)
{
  uint8_t transmit_mailbox = 0;
  /* Check the parameters */
  assert_param(IS_CAN_ALL_PERIPH(CANx));
  assert_param(IS_CAN_IDTYPE(TxMessage->IDE));
  assert_param(IS_CAN_RTR(TxMessage->RTR));
  assert_param(IS_CAN_DLC(TxMessage->DLC));

  /* Select one empty transmit mailbox */
  if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
  {
    transmit_mailbox = 0;
  }
  else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
  {
    transmit_mailbox = 1;
  }
  else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)
  {
    transmit_mailbox = 2;
  }
  else
  {
    transmit_mailbox = CAN_TxStatus_NoMailBox;
  }

  if (transmit_mailbox != CAN_TxStatus_NoMailBox)
  {
    /* Set up the Id */
    CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ;
    if (TxMessage->IDE == CAN_Id_Standard)
    {
      assert_param(IS_CAN_STDID(TxMessage->StdId));  
      CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \
                                                  TxMessage->RTR);
    }
    else
    {
      assert_param(IS_CAN_EXTID(TxMessage->ExtId));
      CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \
                                                  TxMessage->IDE | \
                                                  TxMessage->RTR);
    }

    /* Set up the DLC */
    TxMessage->DLC &= (uint8_t)0x0000000F;
    CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0;
    CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC;

    /* Set up the data field */
    CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) |
                                             ((uint32_t)TxMessage->Data[2] << 16) |
                                             ((uint32_t)TxMessage->Data[1] << 8) |
                                             ((uint32_t)TxMessage->Data[0]));
    CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) |
                                             ((uint32_t)TxMessage->Data[6] << 16) |
                                             ((uint32_t)TxMessage->Data[5] << 8) |
                                             ((uint32_t)TxMessage->Data[4]));
    /* Request transmission */
    CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ;
  }
  return transmit_mailbox;       
}

分别查询空闲发送信箱后,transmit_mailbox最后为4,导致后续无法继续发送,是因为发送完成过后缺少清空信箱的操作导致最后没有空闲信箱吗?
在transmit_mailbox为0,1,2,4时读取CAN_TSR寄存器的值分别是0x1c000000,0x19000008,0x52000008,0x82000008,一直提示TERR0=1,邮箱0因为出错导致发送失败
不知道是什么原因

评论
20161110733 2021-1-14 22:08 回复TA
楼主问题解决了吗? 遇到一样的问题,回环测试是ok的 
沙发
剡溪渡口|  楼主 | 2016-4-15 09:14 | 只看该作者
哪位大神能指点一下迷津

使用特权

评论回复
板凳
M.gtd| | 2016-4-16 15:25 | 只看该作者
can通讯必须联网调试,否则没有ack信号,触发错误,所以节点配置需要多加注意

使用特权

评论回复
地板
xmshao| | 2016-4-16 18:14 | 只看该作者
先用LOOPBACK模式测试 验证软件配置方面没问题;

然后做NORMAL模式验证,此事硬件一定都要要接好,包括匹配电阻。

使用特权

评论回复
5
vitasnokia| | 2019-1-2 18:02 | 只看该作者
楼主 你好 请问这个问题你解决了吗 可以通过qq 773464872 沟通吗 谢谢你了

使用特权

评论回复
6
zchong| | 2021-1-15 08:00 | 只看该作者
两端都要搞起

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

140

帖子

0

粉丝