前言
本文是本人以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库
推荐阅读最新更新时间:2024-11-12 13:51
推荐帖子
- 软件与信息服务业“十一五”发展目标
- 软件与信息服务业“十一五”发展目标基本确定2006-6-2 “‘十一五’规划预计,软件信息服务业将以30%以上的速度增长,到2010年的时候,突破13000亿元大关,软件出口达到125亿美元。”信息产业部电子信息产品管理司副司长丁文武昨天透露说。丁文武是在昨天举行的第十届中国国际软件博览会开幕式暨“2006中国软件产业发展高峰论坛”上说这一番话的。本届软博会正处于“十一五”计划开局之年、《2006—2020年国家信息化发展战略》新颁布、倡导建设创新型国家等重大国策的背景下,
- ehk RF/无线
- 我整理的一点vxworks的介绍
- 1.VxWorks开发商:VxWorks是美国WindRiverSystem公司(以下简称风河公司,即WRS公司)推出的一个实时操作系统。WRS公司组建于1981年,是一个专门从事实时操作系统开发与生产的软件公司,该公司在实时操作系统领域被世界公认为是最具有领导作用的公司。1984年WRS公司推出它的第一个版本--VxWorks1.0.1,在1997年推出了它的最新版本VxWorks5.3.1。应用:VxWorks是一个运行在目标机上的高性能、可裁减的
- dafei_hz 实时操作系统RTOS
- 插值问题(B超打印机驱动开发)
- 打印B超图像100%的时候,图像正常打印,现需要放大150%,使用手动写插值,可以实现放大功能,但缺点就是慢了好多,方法如下:800X576的图像ScreenBuffer,放大1.5倍,每两个字节中间插一个,需要插(800X576)/2个字节,这样打印速度就慢了.本人把该USB打印机连在PC上,打印文件(.prn文件),寻求机器是如何插值实现放大功能的,结果发现,在打印前,机器发了个插值表,长度是1280个字节(20X64),即64倍的以下字符,0x01,0x80,0x01,0x2a,
- lessun 嵌入式系统
- #闲置市集# 4G模块
- 出售4G模块,3000芯币,邮费自理。模块的imei数据有点问题,与原来的对接不上。#闲置市集#4G模块
- lehuijie 淘e淘
- 求西门子plc的工业网络实验室的发展史
- 急求西门子plc的工业网络实验室的发展史。plc的S7300或者400的组成结构应用求西门子plc的工业网络实验室的发展史
- eeleader 工控电子
- launchpad用3.3V电压供电不行吗?为什么我的用3.3V供电就工作不正常,插上USB工作...
- launchpad用3.3V电压供电不行吗?为什么我的用3.3V供电就工作不正常,插上USB工作就正常了。求指教!!!launchpad用3.3V电压供电不行吗?为什么我的用3.3V供电就工作不正常,插上USB工作...刚才用电表测了下,从USB出来的VCC是3.6V诶应该是5V回复沙发v7v7v7v7v7v的帖子你从哪里供电的啊?USB接口那里?那需要5V,因为板子上有降压芯片。如果从接口那里的话只需要3.3V,但是要断开J3的所有排针。从J6供电。具体请看原理图回复
- tthhee 微控制器 MCU
设计资源 培训 开发板 精华推荐
- 太阳能控制板
- 使用 Analog Devices 的 LT1317BCMS8 的参考设计
- AD7837BRZ 双路 12 位数模转换器的典型应用
- 涂鸦温湿度计
- NCV33269 800mA 固定输出、低压降稳压器的典型应用
- 具有辅助 12V 稳压输出的 LT1302-5、3 节电池至 3.3V 降压-升压转换器的典型应用电路
- MAXREFDES27#:IO-LINK接近检测光传感器
- LT6656AIDC-4.096、4.096V 精密电流和升压电压基准的典型应用
- 适用于台式机和服务器的 0.8 至 1.4V DC 至 DC 单路输出电源
- LT1158、用于微处理器系统的 5V 至 3.3V 转换器