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

关于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个回答
toofree 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版