前言
本文是本人以STM32G0B1为平台,记录下调试总结,仅供参考,若有不对的地方,还劳烦指正。
一、实验环境?
1)MCU:STM32FG0B1VCT6 2)CAN工具:广成CAN总线分析仪双通道can转usb模块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.调试结果:
工程下载连接:FDCAN_Send,点我下载!!!!!!
四、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控制器上。
工程下载连接:FDCAN_Receive_MASK,点我下载!!!!
总结
1.当滤波器选择为掩码方式的时候即FilterType = FDCAN_FILTER_MASK,FilterID2的位置为0x1FFFFFFF,代表的就是FilterID1全部校验。
2.当有多个ID需要过滤需要在CubeMX中更改滤波器使用数量,不然是无效的,且滤波器使用顺序应当按照编号。举个例子,假设你分配了使用两个滤波器,在实际中却使用了0和2,虽然1没有使用,但是实际效果应当是你配的那个2的是无效的,0的是有效的。
上一篇:STM32—常用的几种伪指令宏
下一篇:【CubeMX】外设选择LL库还是HAL库
推荐阅读
史海拾趣
ELM始终将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,ELM还注重客户需求和反馈,不断优化产品和服务,以满足客户的个性化需求。这些举措使得ELM的产品在市场上享有很高的声誉和口碑,客户满意度持续提升。
为了满足全球客户的需求,DRI Relays Inc公司开始实施全球化战略。公司先后在亚洲、欧洲和美洲等地设立了分公司和研发中心,以便更好地了解当地市场需求和提供定制化服务。同时,公司还积极参与国际展览和交流活动,加强与全球客户的沟通和合作。这些举措不仅提高了公司的国际知名度,还为公司赢得了更多的订单和市场份额。
MACOM公司设计和制造的半导体产品广泛应用于电信、工业和数据中心等行业。其高性能的半导体产品在全球范围内得到了广泛应用和认可。此外,MACOM还通过了一系列重要的行业认证,包括IATF16949汽车电子认证、AS9100D航空航天标准、ISO9001国际质量标准认证以及ISO14001环境管理标准认证等。这些认证不仅证明了MACOM在产品质量和企业管理方面的卓越表现,也为其在全球范围内开展业务提供了有力保障。
以上是关于电子行业中的Applied Micro Circuits(MACOM)公司发展的五个相关故事。这些故事展示了MACOM在创立、技术创新、上市募资、业务扩张和行业应用等方面的发展历程和成就。作为一家在电子行业中具有重要地位的公司,MACOM不断推动着技术的进步和行业的发展。
面对智能制造的浪潮,百蓉公司积极拥抱变革。他们引进了先进的自动化设备,对生产线进行了全面升级,实现了从手工制造向智能制造的转变。这一转型不仅提高了生产效率,还大幅提升了产品质量和产品的一致性,使得百蓉的产品在市场上更具竞争力。
在电子行业的早期,Cressall Power Resistors公司以其对电阻技术的深入研究而脱颖而出。公司研发团队通过不懈的努力,成功开发出一种新型的功率电阻器,具有更高的耐热性、更低的电阻值变化率以及更长的使用寿命。这一技术突破迅速得到了市场的认可,公司因此获得了大量的订单,业绩迅速增长。随着技术的不断完善和产品的持续升级,Cressall逐渐在功率电阻器市场树立了技术领先的地位。
在完成了数十年的成功发展后,CML并未满足于现状。公司开始着手制定面向未来的战略规划,旨在继续保持在半导体行业的领先地位。CML加大了对新兴技术的研发投入,如人工智能、物联网等领域,积极探索新的应用场景和市场机会。同时,公司还加强了与国际同行的合作与交流,不断提升自身的技术水平和市场竞争力。通过这些努力,CML为未来的发展奠定了坚实的基础,展望着更加辉煌的未来。
以上是基于CML公司发展历程的五个可能故事。请注意,这些故事虽然基于事实进行构建,但并非真实的历史记录。如需了解更多关于CML公司的具体发展历程和故事,建议查阅相关文献或访问公司官方网站。
1) 对malloc分配的内存进行memset清零操作。(可以使用calloc分配一块全零的内存) 2) 对一些栈上分配的struct或数组进行初始化。(最好也是清零) 不过话又说回来了,初始化也会造成系统运行时间有一定的开销,所以,也不要对所有的变量做初 ...… 查看全部问答∨ |
|
Mini2440的板子,WINCE 5.0,板子上有6个测试按键,并且BSP里自带了驱动。现在的问题是,板子上的6个按键只有三个是有效的,而另外三个按键没有任何反应。这几个无效按键所对应的IRQ分别为IRQ_EINT13,IRQ_EINT14,IRQ_EINT15。我搜了一下,似乎板 ...… 查看全部问答∨ |
我用的是PC104前几天做了个串口的调试程序,可以和WIN32的COM调试软件通信,可是我又过了几天,在使的时候就不能通信了,104上插了几个卡公司做的卡。和这个有关系吗?还有其他的可能性吗?我的代码是从网上下的ARM的串口程序,我在EVC里编译到X86 ...… 查看全部问答∨ |
图形驱动库工具使用 上次我和大家一起分享了如何使用ti的图形驱动库的基元层来绘制基本的字符,图形。在这里我强和大家一起分享如何使用ti图形库提供的工具来生成自己的字体,和图像。 Ti提供的这些工具我们都可以在图形驱动库安装目录下的tools\ ...… 查看全部问答∨ |
我想请教你们一下NORM指令的问题,我在TI文献上看过这个指令了,但还是不明白,我想问的是,用NORM指令规格化以后的结果是全都一个格式么?NORM指令不是要将尾数&指数进行分离么?规格化是将尾数全都规和为一样的?还是…… 不好意思我问的问题有 ...… 查看全部问答∨ |