博客
关于我
《STM32从零开始学习历程》——CAN相关结构体
阅读量:475 次
发布时间:2019-03-07

本文共 3204 字,大约阅读时间需要 10 分钟。

STM32 CAN 外设开发指南:结构体与接收发送功能解析

作为高效的多主节点CAN总线协议实现,STM32 CAN外设提供了丰富的接口和功能配置。在开发过程中,理解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_Prescaler:配置CAN时钟分频,该参数将决定驱动器上的时间片长度(Tq),影响总线通信的时速。
  • CAN_Mode:选择CAN的工作模式,可选包括正常模式、环环模式、静默模式以及环环静默模式。
  • CAN_SJW:设置CAN重新同步时的最大跳宽极限,可减少信号失真或延迟。
  • CAN_BS1CAN_BS2:分别配置CAN位期间艺段的长度,影响信号形态。
  • 其他成员主要用于高级功能,如时间触发(TTCM)、线程检测重传(NART)等,具体功能可参考最终的STC用户手册。

CAN REPORT

在实际开发中,明确CAN报文的结构和数据存储方式至关重要。以下是CanTxMsgCanRxMsg的具体结构定义。


1. 发送报文结构体:CanTxMsg

用于定义需要发送的CAN报文数据的结构体,包含以下成员:

  • StdId:标准标识符(11位),取值范围为0-0x7FF。
  • ExtId:扩展标识符(29位),取值范围为0-0x1FFFFFFF。
  • IDE:标识符类型标志。
  • RTR:远程帧标志。
  • DLC:数据长度代码。
  • Data[8]:备用8位数据存储位。
typedef struct {    uint32_t StdId;    /* 标准标识符 */    uint32_t ExtId;    /* 扩展标识符 */    uint8_t  IDE;      /* 标识符类型 */    uint8_t  RTR;      /* 远程帧标志 */    uint8_t  DLC;      /* 数据长度代码 */    uint8_t  Data[8];  /* 数据段 */} CanTxMsg;

2. 接收报文结构体:CanRxMsg

用于接收和存储CAN总线上传来的报文数据。结构体成员包括:

  • StdId:标准标识符。
  • ExtId:扩展标识符。
  • IDE:标识符类型标志。
  • RTR:远程帧标志。
  • DLC:数据长度代码。
  • Data[8]:接收的数据段。
  • FMI:过滤器编号,用于追踪报文来源。
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筛选器的配置参数,具体包含以下几个关键成员:

  • CAN_FilterIdHighCAN_FilterIdLow:用于存储筛选ID(可根据系统位宽配置)。
  • CAN_FilterMaskIdHighCAN_FilterMaskIdLow:用于定义筛选掩码(仅在掩码模式下有效)。
  • CAN_FilterFIFOAssignment:指定过滤后的报文存储目标FIFO编号(0或1)。
  • CAN_FilterNumber:筛选器本身的标识符,范围为0-27。
  • CAN_FilterMode:筛选器工作模式,包括列表模式和掩码模式。
  • CAN_FilterScale:筛选器尺度配置,32位或16位。
  • CAN_FilterActivation:筛选器是否启用。
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;

筛选器模式解析

根据不同的工作模式,筛选器结构体成员具有不同的含义。以下是两种主要模式的对应关系:


1. 列表模式

  • FilterIdHighFilterIdLow均存储筛选目标ID。
  • MaskIdHighMaskIdLow存储对应的掩码值。

2. 掩码模式

  • FilterIdHighFilterIdLow存储筛选目标ID的高16位和低16位。
  • MaskIdHighMaskIdLow存储相同的目标ID对应的掩码值。

筛选器配置流程

  • 定义筛选器初始化结构体,选择合适的过滤模式和筛选ID或掩码。
  • 调用CAN_FilterInit函数,将配置参数传递给CAN外设。
  • 设置相关的FIFO分区,将符合规范的报文存储到指定的接收FIFO中。

  • 通过全面理解CAN外设结构体及其功能,开发者能够更高效地配置CAN总线设备,从而实现智能汽车、工业自动化等领域的鲁棒可靠通信系统。这一过程不仅要求对结构体成员的精准理解,还需要对CAN协议的深度掌握。

    转载地址:http://pqwcz.baihongyu.com/

    你可能感兴趣的文章
    前端的批量接口如何快速响应?有没有通用解决方案?
    查看>>
    git clone 出现fatal: unable to access ‘https://github 错误解决方法
    查看>>
    Shader 入门笔记(一) 如何学习shader
    查看>>
    Huffman树及其编解码
    查看>>
    分布式、高并发、高性能场景(抢购、秒杀、抢票、限时竞答)数据一致性解决方案
    查看>>
    淘宝镜像
    查看>>
    20.波利亚过程
    查看>>
    04_Mysql配置文件(重要参数)
    查看>>
    浅谈使用git进行版本控制
    查看>>
    python 序列化及其相关模块(json,pickle,shelve,xml)详解
    查看>>
    python 加密算法及其相关模块的学习(hashlib,RSA,random,string,math)
    查看>>
    深入学习Tesseract-ocr识别中文并训练字库的方法
    查看>>
    js编写动态时钟
    查看>>
    JavaSE总结
    查看>>
    Consul安装使用
    查看>>
    手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
    查看>>
    Python IO编程
    查看>>
    CSS入门总结
    查看>>
    Django内置的响应类
    查看>>
    使用 TortoiseGit 时,报 Access denied 错误
    查看>>