你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Can通讯,9个Can节点中一个节点错误引发的巨大问题

[复制链接]
wilmer 提问时间:2020-12-5 16:04 /
最近做的一个项目,我设备有9个can,一个can作主机去循环召唤下面8个can作从机的数据(所有设备能正常收发)。当人为把从机的一个can通讯线给断掉,再把它重新接上之后,会出现主机can发送邮箱已满,无法继续发送的问题,重启一下主机程序之后,就可正常使用了,所以可排除硬件问题(已有匹配电阻)

程序在循环召唤时调用HAL_CAN_AddTxMessage时,一直进入 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
  1. HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox)
  2. {
  3.   uint32_t transmitmailbox;
  4.   HAL_CAN_StateTypeDef state = hcan->State;
  5.   uint32_t tsr = READ_REG(hcan->Instance->TSR);

  6.   /* Check the parameters */
  7.   assert_param(IS_CAN_IDTYPE(pHeader->IDE));
  8.   assert_param(IS_CAN_RTR(pHeader->RTR));
  9.   assert_param(IS_CAN_DLC(pHeader->DLC));
  10.   if (pHeader->IDE == CAN_ID_STD)
  11.   {
  12.     assert_param(IS_CAN_STDID(pHeader->StdId));
  13.   }
  14.   else
  15.   {
  16.     assert_param(IS_CAN_EXTID(pHeader->ExtId));
  17.   }
  18.   assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime));

  19.   if ((state == HAL_CAN_STATE_READY) ||
  20.       (state == HAL_CAN_STATE_LISTENING))
  21.   {
  22.     /* Check that all the Tx mailboxes are not full */
  23.     if (((tsr & CAN_TSR_TME0) != 0U) ||
  24.         ((tsr & CAN_TSR_TME1) != 0U) ||
  25.         ((tsr & CAN_TSR_TME2) != 0U))
  26.     {
  27.       /* Select an empty transmit mailbox */
  28.       transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;

  29.       /* Check transmit mailbox value */
  30.       if (transmitmailbox > 2U)
  31.       {
  32.         /* Update error code */
  33.         hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL;

  34.         return HAL_ERROR;
  35.       }

  36.       /* Store the Tx mailbox */
  37.       *pTxMailbox = (uint32_t)1 << transmitmailbox;

  38.       /* Set up the Id */
  39.       if (pHeader->IDE == CAN_ID_STD)
  40.       {
  41.         hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) |
  42.                                                            pHeader->RTR);
  43.       }
  44.       else
  45.       {
  46.         hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) |
  47.                                                            pHeader->IDE |
  48.                                                            pHeader->RTR);
  49.       }

  50.       /* Set up the DLC */
  51.       hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC);

  52.       /* Set up the Transmit Global Time mode */
  53.       if (pHeader->TransmitGlobalTime == ENABLE)
  54.       {
  55.         SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT);
  56.       }

  57.       /* Set up the data field */
  58.       WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR,
  59.                 ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) |
  60.                 ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) |
  61.                 ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) |
  62.                 ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos));
  63.       WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR,
  64.                 ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) |
  65.                 ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) |
  66.                 ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) |
  67.                 ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos));

  68.       /* Request transmission */
  69.       SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ);

  70.       /* Return function status */
  71.       return HAL_OK;
  72.     }
  73.     else
  74.     {
  75.       /* Update error code */
  76.       hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; <font color="#ff0000">//程序最终来了这里</font>

  77.       return HAL_ERROR;
  78.     }
  79.   }
  80.   else
  81.   {
  82.     /* Update error code */
  83.     hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;

  84.     return HAL_ERROR;
  85.   }
  86. }
复制代码



收藏 评论5 发布时间:2020-12-5 16:04

举报

5个回答
废鱼 回答时间:2020-12-5 16:20:53
连接设备的CAN总线影响了CAN总线,建议查看一下现象发生在接入后,CAN设备启动前还是启动后,如果是启动后,建议看一下CAN设备是否在启动时配置了其他的CAN波特率,一般是因为这个CAN设备修改波特率导致CAN总线异常。建议先设置为监听模式,正常后,再切入正常模式。
wilmer 回答时间:2020-12-7 09:34:31
安 发表于 2020-12-5 16:20
连接设备的CAN总线影响了CAN总线,建议查看一下现象发生在接入后,CAN设备启动前还是启动后,如果是启动后 ...

波特率是一样的,就是在原有正常通讯的条件下,人为断开其中一个节点的通讯
废鱼 回答时间:2020-12-7 18:17:09
我明白时人为断掉,确认重新接入CAN网络时,接入的节点时在配置CAN之前还是配置CAN之后。
wilmer 回答时间:2020-12-8 15:14:19
安 发表于 2020-12-7 18:17
我明白时人为断掉,确认重新接入CAN网络时,接入的节点时在配置CAN之前还是配置CAN之后。 ...

配置之后的
废鱼 回答时间:2020-12-8 17:37:33
重新配置CAN引起CAN总线错误,CAN使用过程中,如果发生类似问题,建议其他节点增加自动初始化CAN总线的处理。如果节点用监听模式是不是可以避免这种情况发生?

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版