STM32 基础知识(探索者开发板)--159讲 CAN总线

CAN基础知识:ISO国际标准化的串行通信协议,为了减少线束的数量

CAN特点:

a.多主控制 每个设备都可以主动发送数据

b.通信速度较快,通信距离远。最高1Mbps(距离小于40M),最远可达10KM(速率低于5Kbps)

c.具有错误检测、错误通知和错误恢复功能

d.故障封闭功能 能发现故障,且可以把故障单元隔离出去

CAN在HAL库中的驱动代码在stm32f4xx_hal_can.c文件中

CAN的常用函数:

1)HAL_CAN_Init函数 CAN控制器的初始化

HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan);

CAN初始化结构体如下

typedef struct __CAN_HandleTypeDef

{

CAN_TypeDef *Instance; /* CAN 控制寄存器基地址 */

CAN_InitTypeDef Init; /* 初始化参数结构体 */

__IO HAL_CAN_StateTypeDef State; /* CAN 通讯状态 */

__IO uint32_t ErrorCode; /* CAN 通讯结果编码 */

} CAN_HandleTypeDef;

其中Init结构体

typedef struct

{

uint32_t Prescaler; /* 分频值,可以配置为 1~1024 间的任意整数 */

uint32_t Mode; /* can 操作模式,有效值参考 CAN_operating_mode 的描述 */

uint32_t SyncJumpWidth; /* CAN 硬件的最大超时时间 */

uint32_t TimeSeg1; /* CAN_time_quantum_in_bit_segment_1 */

uint32_t TimeSeg2; /* CAN_time_quantum_in_bit_segment_2 */

FunctionalState TimeTriggeredMode; /* 启用或禁用时间触发模式 */

FunctionalState AutoBusOff; /* 禁止/使能软件自动断开总线的功能 */

FunctionalState AutoWakeUp; /* 禁止/使能 CAN 的自动唤醒功能 */

FunctionalState AutoRetransmission; /* 禁止/使能 CAN 的自动传输模式 */

FunctionalState ReceiveFifoLocked; /* 禁止/使能 CAN 的接收 FIFO */

FunctionalState TransmitFifoPriority; /* 禁止/使能 CAN 的发送 FIFO */

} CAN_InitTypeDef;

2)HAL_CAN_ConfigFilter 函数 配置接收过滤器函数

HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig)

参数:CAN控制句柄的指针 过滤器结构体指针

返回值:我们只关注HAL_OK的情况

过滤器结构体

typedef struct

{

uint32_t FilterIdHigh; /* 过滤器标识符高位 */

uint32_t FilterIdLow; /* 过滤器标识符低位 */

uint32_t FilterMaskIdHigh; /* 过滤器掩码号高位(列表模式下,也是属于标识符) */

uint32_t FilterMaskIdLow; /* 过滤器掩码号低位(列表模式下,也是属于标识符) */

uint32_t FilterFIFOAssignment; /* 与过滤器组管理的 FIFO */

uint32_t FilterBank; /* 指定过滤器组,单 CAN 为 0~13,双 CAN 可为 0~27 */

uint32_t FilterMode; /* 过滤器的模式 标识符屏蔽位模式/标识符列表模式 */

uint32_t FilterScale; /* 过滤器的位宽 32 位/16 位 */

uint32_t FilterActivation; /* 禁用或者使能过滤器 */

uint32_t SlaveStartFilterBank; /* 双 CAN 模式下,规定 CAN 的主从模式的过滤器分配 */

} CAN_FilterTypeDef;

3)HAL_CAN_Start函数 使能CAN控制器以接入总线进行数据收发处理

HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan)

参数:CAN控制句柄指针

返回值:只关注是否等于HAL_OK

4)HAL_CAN_ActivateNotification函数 使能CAN的各种中断

HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan,uint32_t ActiveITs)

参数:CAN的控制句柄指针 目标中断源

返回值:只关注是否等于HAL_OK

5)HAL_CAN_AddTxMessage函数 向发送邮箱添加发送报文,并激活发送请求

HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan,CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox)

参数:CAN的控制句柄指针 CAN的发送结构体 报文内容 发送邮箱编号(3选1)

返回值:只关注是否等于HAL_OK

CAN发送的结构体

typedef struct

{

uint32_t StdId; /* 标准标识符 11 位 范围:0~0x7FF */

uint32_t ExtId; /* 扩展标识符 29 位 范围:0~0x1FFFFFFF */

uint32_t IDE; /* 标识符类型 CAN_ID_STD / CAN_ID_EXT */

uint32_t RTR; /* 帧类型 CAN_RTR_DATA / CAN_RTR_REMOTE */

uint32_t DLC; /* 帧长度 范围:0~8byte */

FunctionalState TransmitGlobalTime; /* 时间戳是否在开始时捕获 */

} CAN_TxHeaderTypeDef;

6)HAL_CAN_GetRxMessage函数 从接收FIFO里面的输出邮箱获取到消息报文

HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])

参数:CAN的控制句柄指针 接收FIFO(FIFO0/1) CAN的接收结构体 接收报文内容

返回值:只关注是否等于HAL_OK

CAN接收的结构体

typedef struct

{

uint32_t StdId; /* 标准标识符 11 位 范围:0~0x7FF */

uint32_t ExtId; /* 扩展标识符 29 位 范围:0~0x1FFFFFFF */

uint32_t IDE; /* 标识符类型 CAN_ID_STD / CAN_ID_EXT */

uint32_t RTR; /* 帧类型 CAN_RTR_DATA / CAN_RTR_REMOTE */

uint32_t DLC; /* 帧长度 范围:0~8byte */

uint32_t Timestamp; /* 在帧接收开始时开始捕获的时间戳 */

uint32_t FilterMatchIndex; /* 过滤器匹配序号 */

} CAN_RxHeaderTypeDef;

HAL_StatusTypeDef枚举类型的值,有 4 个,分别是 HAL_OK 表示成功,HAL_ERROR 表示错误,HAL_BUSY 表示忙碌,HAL_TIMEOUT 为超时。

CAN基本驱动步骤

1.CAN参数初始化 设置工作模式和波特率

2.使能CAN时钟和初始化引脚 HAL_CAN_MspInit()硬件配置

3.设置过滤器 HAL_CAN_ConfigFilter过滤器配置

4.CAN数据接收和发送 HAL_CAN_AddTxMessage(发)/HAL_CAN_GetRxMessage(收)

5.使能中断/设NVIC/编写中断服务函数 HAL_CAN_ENABLE_IT

相关推荐
Jason_zhao_MR1 小时前
如何板端编译OpenCV并搭建应用--基于瑞芯微米尔RK3576开发板
人工智能·嵌入式硬件·mcu·opencv·物联网·计算机视觉·嵌入式
Shang131130487912 小时前
ISL9V3040D3ST-F085C一款安森美 ON生产的汽车点火IGBT模块,绝缘栅双极型晶体管ISL9V3040D3ST汽车点火电路中的线圈驱动器
单片机·嵌入式硬件·安森美 on生产·汽车点火igbt模块·isl9v3040d3st
亿道电子Emdoor3 小时前
【ARM】MDK Debug模式下Disassembly窗口介绍
stm32·单片机·嵌入式硬件
点灯小铭3 小时前
基于STM32单片机的无线鼠标设计
stm32·单片机·计算机外设·毕业设计·课程设计
嵌入式×边缘AI:打怪升级日志5 小时前
【无标题】
单片机·嵌入式硬件
嵌入式小李7 小时前
stm32项目(24)——基于STM32的汽车CAN通信系统
stm32·嵌入式硬件·汽车
程序员JerrySUN8 小时前
四级页表通俗讲解与实践(以 64 位 ARM Cortex-A 为例)
java·arm开发·数据库·redis·嵌入式硬件·缓存
优信电子8 小时前
基于STM32F103驱动SI5351 3通道时钟信号发生器输出不同频率信号
单片机·嵌入式
DIY机器人工房8 小时前
开发板RK3568和stm32的异同:
嵌入式硬件·嵌入式·diy机器人工房
酷飞飞19 小时前
库函数版独立按键用位运算方式实现(STC8)
单片机·嵌入式硬件