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

关于STM32F103 CAN通信若干问题

[复制链接]
yllqabz 提问时间:2019-8-12 20:24 /
使用STM32F103作为CAN从机发送和接收数据,从机是被动发送,在收到主机特定命令帧后才会发送数据,其余时候只接收:问题1:单个发送没有问题,多个CAN并在一起,其中某个会出现只能接收并未发送的情况(主机下发内容能收到,但主机无法收到该ID上的数据内容),不知道为什么会出现这样的问题?现在就想试一下,在这种情况下重新初始化CAN模块能不能恢复CAN正常通信?我的想法是通过主机告知从机,让从机自己重新初始化CAN。
问题2:如果将主机挂在总线上,存在某些从机在重新上电后无法正常启动的情况,大多数都能正常运行。


请问有遇到类似情况的人能解答下没有?欢迎探讨!

附CAN通信配置:
void MX_CAN_Init(void)
{
  CAN_FilterConfTypeDef  sFilterConfig;

  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 8;                                       
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_15TQ;
  hcan.Init.BS2 = CAN_BS2_2TQ;       
  hcan.Init.TTCM = DISABLE;                                                        // ʱ¼ä´¥·¢Ä£Ê½
  hcan.Init.ABOM = DISABLE;                                                        // ×Ô¶¯ÀëÏß¹ÜÀí
  hcan.Init.AWUM = DISABLE;                                                        // ×Ô¶¯»½ÐÑģʽ
  hcan.Init.NART = DISABLE;                                                        // ·Ç×Ô¶¯ÖØ´«Ä£Ê½
  hcan.Init.RFLM = DISABLE;                                                        // ½ÓÊÕFIFOËø¶¨Ä£Ê½
  hcan.Init.TXFP = DISABLE;                                                        // ·¢ËÍFIFOÓÅÏȼ¶

  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }

sFilterConfig.FilterNumber = 0;                                                                                                                                                                                                        //
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;                                                                                               
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;                                                                                                               
  sFilterConfig.FilterIdHigh = (((uint32_t)PS << 3) & 0xFFFF0000) >> 16;                                        // ¹ýÂËID¸ßλ
  sFilterConfig.FilterIdLow = ((uint32_t)PS << 3) | CAN_RTR_DATA | CAN_ID_EXT;                // ¹ýÂËIDµÍλ
  sFilterConfig.FilterMaskIdHigh = 0x0000;
  sFilterConfig.FilterMaskIdLow = 0x00FF;                                                                                                                                                                        // ¹ýÂ˱êʶ·ûµÍλ
  sFilterConfig.FilterFIFOAssignment = 0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;
       
  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
    Error_Handler();
  }       
}

收藏 评论3 发布时间:2019-8-12 20:24

举报

3个回答
七哥 回答时间:2019-8-12 22:45:25
你说的“多个CAN并在一起”,是什么情况?
CAN只能手拉手串联,然后在首尾两个端点并联120欧匹配电阻。不能随便并联,如果要星形并联的话,每个都得并电阻,但电阻的值是相等的,并联后在星形结点处,等效电阻为60欧。
springvirus 回答时间:2019-8-13 09:10:43
学习了
yllqabz 回答时间:2019-8-13 17:42:10
toofree 发表于 2019-8-12 22:45
你说的“多个CAN并在一起”,是什么情况?
CAN只能手拉手串联,然后在首尾两个端点并联120欧匹配电阻。不能 ...

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