OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5675|回复: 12

【全部身价悬赏】Can通讯,9个Can节点中一个节点错误引发的巨大问题

[复制链接]

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-8-13
在线时间
5 小时
发表于 2020-12-5 11:19:45 | 显示全部楼层 |阅读模式
7金钱
本帖最后由 Wilmer 于 2020-12-8 09:49 编辑

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

can配置如下
void MX_CAN_Init(void)
{

        hcan.Instance = CAN;
        hcan.Init.Prescaler = 8;
        hcan.Init.Mode = CAN_MODE_NORMAL;
        hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
        hcan.Init.TimeSeg1 = CAN_BS1_6TQ;
        hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
        hcan.Init.TimeTriggeredMode = DISABLE;
        hcan.Init.AutoBusOff = DISABLE;
        hcan.Init.AutoWakeUp = DISABLE;
        hcan.Init.AutoRetransmission = DISABLE;
        hcan.Init.ReceiveFifoLocked = DISABLE;
        hcan.Init.TransmitFifoPriority = DISABLE;

        if (HAL_CAN_Init(&hcan) != HAL_OK)
        {
                _Error_Handler(__FILE__, __LINE__);
        }

}


  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. }
复制代码






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-12-5 22:39:08 | 显示全部楼层
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2020-12-7 09:40:03 | 显示全部楼层
超时清除邮箱
茵茵猪头
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12999
金钱
12999
注册时间
2012-11-26
在线时间
3791 小时
发表于 2020-12-7 09:58:19 | 显示全部楼层
帮顶  没实战用过CAN   楼主应用层是自己写的协议还是移植类似opencan的?
学无止境
回复

使用道具 举报

10

主题

25

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1098
金钱
1098
注册时间
2018-8-10
在线时间
150 小时
发表于 2020-12-7 17:29:46 | 显示全部楼层
试试配置的时候去掉自动重传
回复

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2019-8-8
在线时间
83 小时
发表于 2020-12-7 17:54:27 | 显示全部楼层
我也类似遇到这样问题,有没有解决方法,各位大神指点
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-8-13
在线时间
5 小时
 楼主| 发表于 2020-12-8 09:50:21 | 显示全部楼层
kkkkklsq 发表于 2020-12-7 17:29
试试配置的时候去掉自动重传

我上传了我的can配置,帮我看看可以?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-8-13
在线时间
5 小时
 楼主| 发表于 2020-12-8 09:51:20 | 显示全部楼层

那清除完,之后也会重新进入该循环吧,一直清除好像也不是办法
回复

使用道具 举报

13

主题

265

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5351
金钱
5351
注册时间
2017-8-14
在线时间
239 小时
发表于 2020-12-14 11:58:09 | 显示全部楼层
我们做  给  带 60个 CAN 从站的  案例,有空  参考下  我们的 源码
StdL_1CANWeb_STMF103RCT6源程序200419.zip (764.74 KB, 下载次数: 35)
详细资料扣扣群204408503自行下载
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2020-12-15 17:10:48 | 显示全部楼层
拔掉一个,总线主CAN设备就会出现发送邮箱满?
感觉应该不会吧
一分耕耘一分收获。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-8-13
在线时间
5 小时
 楼主| 发表于 2020-12-25 09:07:57 | 显示全部楼层
本帖最后由 Wilmer 于 2020-12-25 10:32 编辑
yklstudent 发表于 2020-12-15 17:10
拔掉一个,总线主CAN设备就会出现发送邮箱满?
感觉应该不会吧

拔掉没出问题,是重新接上之后就会
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2020-4-17
在线时间
8 小时
发表于 2020-12-25 09:21:26 | 显示全部楼层
调试呀,看下发送邮箱都存的啥报文嘛
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2021-1-4 15:33:39 | 显示全部楼层
楼主这个问题解决了吗?按照你的描述,断掉再装上,主程序邮箱显示已满。感觉是重装后,将can 2条线的电压状态改变导致的吧。暂时没做过,只是猜测。希望对楼主有用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-1 05:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表