stm32f4中can通信(StdId或ExtId收发数据)

8 篇文章 4 订阅
4 篇文章 1 订阅

@TOC

硬件

两套硬石开发板:YS-F4Pro

波特率

默认:1Mbps

帧信息设定

选择标准帧,而非扩展帧
选择数据帧,而非远程帧
计算数据域长度,包括数据域中的所有内容,最大值“8”,设为2

实施

以硬石提供的《YSF4_HAL-092. CAN双从机通信》(下载链接:http://www.ing10bbs.com/forum.php?mod=viewthread&tid=1458)历程为例:改动can初始化(MX_CAN_Init)配置:

  CAN_FilterConfTypeDef  sFilterConfig;
  
  /*CAN单元初始化*/
  hCAN.Instance = CANx;             /* CAN外设 */
  hCAN.pTxMsg = &TxMessage;
  hCAN.pRxMsg = &RxMessage;
  
  hCAN.Init.Prescaler = 3;          /* BTR-BRP 波特率分频器  定义了时间单元的时间长度 42/(1+6+7)/3=1Mbps */
  hCAN.Init.Mode = CAN_MODE_NORMAL; /* 正常工作模式 */
  hCAN.Init.SJW = CAN_SJW_1TQ;      /* BTR-SJW 重新同步跳跃宽度 1个时间单元 */
  hCAN.Init.BS1 = CAN_BS1_6TQ;      /* BTR-TS1 时间段1 占用了6个时间单元 */
  hCAN.Init.BS2 = CAN_BS2_7TQ;      /* BTR-TS1 时间段2 占用了7个时间单元 */
  hCAN.Init.TTCM = DISABLE;         /* MCR-TTCM  关闭时间触发通信模式使能 */
  hCAN.Init.ABOM = ENABLE;          /* MCR-ABOM  自动离线管理 */
  hCAN.Init.AWUM = ENABLE;          /* MCR-AWUM  使用自动唤醒模式 */
  hCAN.Init.NART = DISABLE;         /* MCR-NART  禁止报文自动重传	  DISABLE-自动重传 */
  hCAN.Init.RFLM = DISABLE;         /* MCR-RFLM  接收FIFO 锁定模式  DISABLE-溢出时新报文会覆盖原有报文 */
  hCAN.Init.TXFP = DISABLE;         /* MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符 */
  HAL_CAN_Init(&hCAN);
	
	
	uint16_t std_id =0x7E9;
	uint32_t ext_id =0x1800f001;
	uint32_t mask =0;

  /*CAN过滤器初始化*/
  sFilterConfig.FilterNumber = 0;                    /* 过滤器组0 */
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  /* 工作在标识符屏蔽位模式 */
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; /* 过滤器位宽为单个32位。*/
  /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
  
  sFilterConfig.FilterIdHigh         = ((ext_id<<3) >>16) &0xffff;			/* 要过滤的ID高位 */
  sFilterConfig.FilterIdLow          = (uint16_t)(ext_id<<3) | CAN_ID_EXT;      /* 要过滤的ID低位 */
	
	//屏蔽寄存器的设置
	//这里的思路是先将标准CAN ID和扩展CAN ID对应的ID值先异或后取反,为什么?异或是为了找出两个CAN ID有哪些位是相同的,是相同的位则说明需要关心,需要关心的位对应的屏蔽码位应该设置为1,因此需要取反一下。最后再整体左移3位。
	mask =(std_id<<18);//这里为什么左移18位?因为从ISO11898中可以看出,标准CAN ID占ID18~ID28,为了与CAN_FilterIdHigh对齐,应左移2位,接着为了与扩展CAN对应,还应该再左移16位,因此,总共应左移2+16=18位。也可以用另一个方式来理解:直接看Mapping的内容,发现STDID相对EXID[0]偏移了18位,因此左移18位.
	mask ^=ext_id;//将对齐后的标准CAN与扩展CAN异或后取反
	mask =~mask;
	mask <<=3;//再整体左移3位
	mask |=0x02; //只接收数据帧,不接收远程帧

  sFilterConfig.FilterMaskIdHigh     = (mask>>16)&0xffff;			/* 过滤器高16位每位必须匹配 */
  sFilterConfig.FilterMaskIdLow      = mask&0xffff;			/* 过滤器低16位每位必须匹配 */
	
  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;           /* 过滤器被关联到FIFO 0 */
  sFilterConfig.FilterActivation = ENABLE;          /* 使能过滤器 */ 

  HAL_CAN_ConfigFilter(&hCAN, &sFilterConfig);

参考链接:
https://blog.csdn.net/flydream0/article/details/8148791

源码下载:
https://gitee.com/Luweizhiyuan2020/orbitalrobot.git
(CAN主从机通信)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值