完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、实验环境 1)MCU:STM32FG0B1VCT6 2)CAN工具:广成CAN总线分析仪双通道can转u***模块USBCAN调试解析工具can卡 3)CAN收发器:TCAN1042DRQ1 4)STM32CubeMX版本:V6.3.0 5)固件版本:STM32Cube FW_G0 V1.5.0 6)仿真器:ST-LINK V2 7)MDK: V5.30.0.0 二、CAN和FDCAN区别 1.介绍 CAN:1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议. CAN_FD:随着人们对数据传输带宽要求的增加,传统的CAN总线由于带宽的限制难以满足这种增加的需求。此外为了缩小CAN网络(max. 1MBit/s)与FlexRay(max.10MBit/s)网络的带宽差距,2011年BOSCH公司推出了CAN FD 。 2.FDCAN有哪些优点(个人角度): 1)速度更快,最快可以达到10M,普遍采用5M。 2)一包数据长度最大支持64个字节,而普通CAN一包最大8个字节,通信效率大大提高。 3)CAN_FD全称是Flexible Data-Rate,意思就是帧报文中数据段波特率可变的特性,即仲裁段和数据控制段使用标准的通信波特率,而传输数据段时就会切换到更高的通信波特率。 三、CAN发送 1.STM32CubeMX配置截图: 1)clock Divider:表示CAN时钟分频,STM32G0B1时钟最大支持64M,这里选择不分频。 2)Frame Format:这里选择经典模式,即把它当作普通CAN模式。 3)Mode:这里选择正常工作模式,此外还有回环模式。 4)Nominal Prescaler:表示仲裁段和数据控制段分频系数 5)Nominal Sync Jump Width:重新同步跳跃宽度。 6)Nominal time Seg1和Nominal Time Seg2:和设置波特率有关,BAUD=Freq/Clock Divider/Prescaler/(Seg1+Seg2+1)=64M/1/8/(10+5+1)=500K 7)下面Data和上面类似。 8)Std Filters Nbr:标准帧滤波器数量。是配置CAN接受时候使用的滤波器数量,用了多少个就写多少个。 9)Ext Filters Nbr:扩展帧滤波器数量。 2.用户需要自己添加的内容: 1)在初始化的时候添加如下: if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK) { Error_Handler(); } 2)在主循环中添加如下: TxHeader.Identifier = 0x0fffffff; TxHeader.IdType = FDCAN_EXTENDED_ID; TxHeader.TxFrameType = FDCAN_DATA_FRAME; TxHeader.DataLength = FDCAN_DLC_BYTES_8; TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; TxHeader.BitRateSwitch = FDCAN_BRS_OFF; TxHeader.FDFormat = FDCAN_CLASSIC_CAN; TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; TxHeader.MessageMarker = 0; ++TxData[7]; if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData) != HAL_OK) { Error_Handler(); } HAL_Delay(1000); 3)增加两个全局变量,方便调试观查 FDCAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8] = {0}; 3.调试结果: 四、CAN接受 1.滤波器类型采用掩码方式: 1)添加如下函数实现: FDCAN_RxHeaderTypeDef RxHeader; uint8_t RxData[8]; void FDCAN1_Config(void) { FDCAN_FilterTypeDef sFilterConfig; /* Configure Rx filter */ sFilterConfig.IdType = FDCAN_EXTENDED_ID; sFilterConfig.FilterIndex = 1; sFilterConfig.FilterType = FDCAN_FILTER_MASK; sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; sFilterConfig.FilterID1 = 0x00000023; sFilterConfig.FilterID2 = 0x1FFFFFFF; if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK) { Error_Handler(); } sFilterConfig.IdType = FDCAN_EXTENDED_ID; sFilterConfig.FilterIndex = 0; sFilterConfig.FilterType = FDCAN_FILTER_MASK; sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; sFilterConfig.FilterID1 = 0x00000026; sFilterConfig.FilterID2 = 0x1FFFFFFF; if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK) { Error_Handler(); } /* Configure global filter: Filter all remote frames with STD and EXT ID Reject non matching frames with STD ID and EXT ID */ if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK) { Error_Handler(); } /* Start the FDCAN module */ if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK) { Error_Handler(); } if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK) { Error_Handler(); } } void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) { if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET) { /* Retrieve Rx messages from RX FIFO0 */ if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK) { Error_Handler(); } } } 2)调试结果: 扩展ID发送0x23的时候,CAN总线上的数据是会通过滤波器编号为1的滤波器送达单片机内部的can控制器上。 扩展ID发送0x26的时候,CAN总线上的数据是会通过滤波器编号为2的滤波器送达单片机内部的CAN控制器上。 发送扩展ID为其他的时候,CAN总线上的数据都会被滤波器过滤掉,并不会送到CAN控制器上。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:10 , Processed in 1.177471 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号