本文共 3204 字,大约阅读时间需要 10 分钟。
作为高效的多主节点CAN总线协议实现,STM32 CAN外设提供了丰富的接口和功能配置。在开发过程中,理解CAN外设的结构体定义以及对接收与发送报文的处理逻辑至关重要。本文将详细介绍CAN结构体及其对应的发送与接收结构体,帮助开发者快速掌握连接CAN总线设备的核心技能。
CAN外设的初始化配置可以通过CAN_InitTypeDef
结构体完成。该结构体包含多个参数,用于精确控制CAN总线的工作模式和时序参数。
typedef struct { uint16_t CAN_Prescaler; /* 时钟分频配置 */ uint8_t CAN_Mode; /* 工作模式设置 */ uint8_t CAN_SJW; /*同步跳宽极限值 */ uint8_t CAN_BS1; /*BS1段时间片数 */ uint8_t CAN_BS2; /*BS2段时间片数 */ FunctionalState CAN_TTCM; /*时间触发模式 */ FunctionalState CAN_ABOM; /*自动线程离线管理 */ FunctionalState CAN_AWUM; /*自动唤醒功能 */ FunctionalState CAN_NART; /*自动重传功能 */ FunctionalState CAN_RFLM; /*接收FIFO锁定模式 */ FunctionalState CAN_TXFP; /*发送优先级模式 */} CAN_InitTypeDef;
在实际开发中,明确CAN报文的结构和数据存储方式至关重要。以下是CanTxMsg
和CanRxMsg
的具体结构定义。
CanTxMsg
用于定义需要发送的CAN报文数据的结构体,包含以下成员:
typedef struct { uint32_t StdId; /* 标准标识符 */ uint32_t ExtId; /* 扩展标识符 */ uint8_t IDE; /* 标识符类型 */ uint8_t RTR; /* 远程帧标志 */ uint8_t DLC; /* 数据长度代码 */ uint8_t Data[8]; /* 数据段 */} CanTxMsg;
CanRxMsg
用于接收和存储CAN总线上传来的报文数据。结构体成员包括:
typedef struct { uint32_t StdId; /* 标准标识符 */ uint32_t ExtId; /* 扩展标识符 */ uint8_t IDE; /* 标识符类型 */ uint8_t RTR; /* 远程帧标志 */ uint8_t DLC; /* 数据长度代码 */ uint8_t Data[8]; /* 接收到的数据段 */ uint8_t FMI; /* 过滤器编号 */} CanRxMsg;
在复杂的CAN网络中,筛选器能够有效滤选符合特定标准的节点信息。以下是定义筛选器的初始化结构体及其使用方法。
CAN_FilterInitTypeDef
用于定义CAN筛选器的配置参数,具体包含以下几个关键成员:
typedef struct { uint16_t CAN_FilterIdHigh; /* 筛选ID高16位 */ uint16_t CAN_FilterIdLow; /* 筛选ID低16位 */ uint16_t CAN_FilterMaskIdHigh; /* 筛选掩码高16位 */ uint16_t CAN_FilterMaskIdLow; /* 筛选掩码低16位 */ uint16_t CAN_FilterFIFOAssignment; /* 存储目标FIFO编号 */ uint8_t CAN_FilterNumber; /* 筛选器编号 */ uint8_t CAN_FilterMode; /* 筛选模式 */ uint8_t CAN_FilterScale; /* 筛选尺度 */ FunctionalState CAN_FilterActivation; /* 筛选器激活状态 */} CAN_FilterInitTypeDef;
根据不同的工作模式,筛选器结构体成员具有不同的含义。以下是两种主要模式的对应关系:
CAN_FilterInit
函数,将配置参数传递给CAN外设。通过全面理解CAN外设结构体及其功能,开发者能够更高效地配置CAN总线设备,从而实现智能汽车、工业自动化等领域的鲁棒可靠通信系统。这一过程不仅要求对结构体成员的精准理解,还需要对CAN协议的深度掌握。
转载地址:http://pqwcz.baihongyu.com/