@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主从机通信)