【CAN】can的相关结构体

一.CAN结构体

\qquad 跟其它外设一样,STM32标准库提供了CAN初始化结构体及初始化函数来控制CAN的工作方式,提供了收发报文使用的结构体及收发函数,还有配置控制筛选器模式及ID的结构体。

  • 初始化结构体:CAN_InitTypeDef
  • 发送及接收结构体:CanTxMsg及CanRxMsg
  • 筛选器结构体:CAN_FilterInitTypeDef

1.CAN初始化结构体

在这里插入图片描述配置完这些结构体成员后,调用库函数CAN_Init即可把这些参数写入到CAN控制寄存器中,实现CAN的初始化。

  • CAN_Prescaler
    \qquad 本成员设置CAN外设的时钟分频,它可控制时间片Tq的时间长度,这里设置的值最终会减1后再写入BRP寄存器位,即Tq计算公式:
    在这里插入图片描述
  • CAN_Mode
    \qquad 本成员设置CAN的工作模式,可设置为正常模式(CAN_Mode_Normal)、回环模式(CAN_Mode_LoopBack)、静默模式(CAN_Mode_Silent)以及回环静默模式(CAN_Mode_Silent_LoopBack)。
  • CAN_SJW
    \qquad 本成员可以配置SJW的极限长度,即CAN重新同步时单次可增加或缩短的最大长度,它可以被配置为1-4Tq(CAN_SJW_1/2/3/4tq)。
  • CAN_BS1
    \qquad 本成员用于设置CAN位时序中的BS1段的长度,它可以被配置为1-16个Tq长度(CAN_BS1_1/2/3…16tq)。
  • CAN_BS2
    \qquad 本成员用于设置CAN位时序中的BS2段的长度,它可以被配置为1-8个Tq长度(CAN_BS2_1/2/3…8tq)。
    SYNC_SEG、BS1段及BS2段的长度加起来即一个数据位的长度,计算公式:
    在这里插入图片描述
  • CAN_TTCM
    \qquad 本成员用于设置是否使用时间触发功能(ENABLE/DISABLE),时间触发功能在某些CAN标准中会使用到。
  • CAN_ABOM
    \qquad 本成员用于设置是否使用自动离线管理(ENABLE/DISABLE),使用自动离线管理可以在节点出错离线后适时自动恢复,不需要软件干预。
  • CAN_ AWUM
    \qquad 本成员用于设置是否使用自动唤醒功能(ENABLE/DISABLE),使能自动唤醒功能后它会在监测到总线活动后自动唤醒。
  • CAN_NART
    \qquad 本成员用于设置是否使用自动重传功能(ENABLE/DISABLE),使用自动重传功能时,会一直发送报文直到成功为止。
  • CAN_RFLM
    \qquad 本成员用于设置是否使用锁定接收FIFO(ENABLE/DISABLE),锁定接收FIFO后,若FIFO溢出时会丢弃新数据,否则在FIFO溢出时以新数据覆盖旧数据。
  • CAN_TXFP
    \qquad 本成员用于设置发送报文的优先级判定方法(ENABLE/DISABLE),使能时,以报文存入发送邮箱的先后顺序来发送,否则按照报文ID的优先级来发送。

2.CAN发送及接收结构体

在这里插入图片描述
在发送或接收报文时,需要往发送邮箱中写入报文信息或从接收FIFO中读取报文信息,利用STM32标准库的发送及接收结构体可以方便地完成这样的工作。

  • StdId
    \qquad 本成员存储的是报文的11位标准标识符,范围是0-0x7FF。

  • ExtId
    \qquad 本成员存储的是报文的29位扩展标识符,范围是0-0x1FFFFFFF。ExtId与StdId这两个成员根据下面的IDE位配置,只有一个是有效的。

  • IDE
    \qquad 本成员存储的是扩展标志IDE位,当它的值为宏CAN_ID_STD时表示本报文是标准帧,使用StdId成员存储报文ID;当它的值为宏CAN_ID_EXT时表示本报文是扩展帧,使用ExtId成员存储报文ID。

  • RTR
    \qquad 本成员存储的是报文类型标志RTR位,当它的值为宏CAN_RTR_Data时表示本报文是数据帧;当它的值为宏CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控帧时,下面的Data[8]成员的内容是无效的。

  • DLC
    \qquad 本成员存储的是数据帧数据段的长度,它的值的范围是0-7,当报文是遥控帧时DLC值为0。

  • Data[8]
    本成员存储的就是数据帧中数据段的数据

  • FMI
    \qquad 本成员只存在于接收结构体,它存储了筛选器的编号,表示本报文是经过哪个筛选器存储进接收FIFO的,可以用它简化软件处理。

  • 总结:
    \qquad 当需要使用CAN发送报文时,先定义一个上面发送类型的结构体,然后把报文的内容按成员赋值到该结构体中,最后调用库函数CAN_Transmit把这些内容写入到发送邮箱即可把报文发送出去。
    \qquad 接收报文时,通过检测标志位获知接收FIFO的状态,若收到报文,可调用库函数CAN_Receive把接收FIFO中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文。

3.CAN筛选器结构体

在这里插入图片描述

  • CAN_FilterIdHigh
    \qquad CAN_FilterIdHigh成员用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的高16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
  • CAN_FilterIdLow
    \qquad 类似地,CAN_FilterIdLow成员也是用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的低16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
  • CAN_FilterMaskIdHigh
    \qquad CAN_FilterMaskIdHigh存储的内容分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdHigh相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdHigh成员对应的掩码,与CAN_FilterMaskIdLow组成一组筛选器。
  • CAN_FilterMaskIdLow
    \qquad 类似地,CAN_FilterMaskIdLow存储的内容也分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdLow相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdLow成员对应的掩码,与CAN_FilterMaskIdHigh组成一组筛选器。

不同模式下各结构体成员的内容:
在这里插入图片描述

  • CAN_FilterFIFOAssignment
    \qquad 本成员用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收FIFO,它的可选值为FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。
  • CAN_FilterNumber
    \qquad 本成员用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器,CAN一共有28个筛选器,所以它的可输入参数范围为0-27。
    f103 --> 0-13
    f105 --> 0-27
  • CAN_FilterMode
    \qquad 本成员用于设置筛选器的工作模式,可以设置为列表模式(宏CAN_FilterMode_IdList)及掩码模式(宏CAN_FilterMode_IdMask)。
  • CAN_FilterScale
    \qquad 本成员用于设置筛选器的尺度,可以设置为32位长(宏CAN_FilterScale_32bit)及16位长(宏CAN_FilterScale_16bit)。
  • CAN_FilterActivation
    \qquad 本成员用于设置是否激活这个筛选器(宏ENABLE/DISABLE)。
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: dbc生成can结构体是指根据DBC(Distributed Bus Controller,分布式总线控制器)文件的定义,将CAN(Controller Area Network,控制器局域网)的消息和信号对象转换为相应的C语言结构体。 在生成CAN结构体之前,需要先了解DBC文件的结构和内容。DBC文件是用来定义CAN总线上的消息和信号对象的数据格式和通信协议。它包含了消息和信号的定义和属性,以及传输速率、节点数量等网络配置信息。 生成CAN结构体的过程可以通过解析DBC文件并提取其中的消息和信号定义来实现。首先,需要解析DBC文件的格式,读取其中的消息定义和信号定义部分。然后,根据定义的消息和信号属性,将其转换为对应的C语言结构体。 对于消息对象,可以将其转换为一个包含消息ID、周期、长度和信号数量等属性的结构体。其中,信号数量表示该消息对象中包含的信号数量。对于每个信号对象,可以将其转换为一个包含信号名称、起始位、长度、数据类型和解析规则等属性的结构体。 最后,将这些生成的结构体定义保存在一个头文件中,以便在C语言程序中引用。 通过将DBC文件转换为CAN结构体,可以方便地在C语言程序中使用和操作CAN总线上的消息和信号。同时,这样的结构体定义也可以用于CAN总线仿真和测试等相关工作。 总之,DBC生成CAN结构体是一种将CAN网络定义转化为C语言结构体的过程,可以方便地在C语言程序中使用CAN总线上的消息和信号。 ### 回答2: 生成CAN结构体可以通过DBC文件进行操作,按照CAN协议的定义,可以定义以下成员变量: 1. CAN消息ID:用于表示CAN消息的标识符,可以根据具体需求选择合适的数据类型,比如uint32_t。根据DBC文件中的定义,可以设置一个或多个CAN消息ID。 2. CAN数据长度:用于表示CAN消息的数据长度,一般为8字节,可以选择合适的数据类型,比如uint8_t。 3. CAN数据:用于表示CAN消息的实际数据,根据具体需求选择合适的数据类型和数据结构,比如数组或结构体。根据DBC文件中的定义,可以设置一个或多个CAN数据变量。 4. CAN周期:用于表示CAN消息的发送周期,一般为毫秒级别的时间间隔,可以选择合适的数据类型,比如uint16_t。 5. CAN数据方向:用于表示CAN消息的接收或发送方向,可以使用枚举类型定义CAN_DIR_RX和CAN_DIR_TX两种方向。 6. 其他辅助信息:根据具体需求,还可以添加其他辅助信息,比如CAN消息的名称、单位、解析函数等。 在生成CAN结构体时,可以通过解析DBC文件获取CAN消息的定义信息,然后根据定义信息逐个创建CAN结构体,设置对应的成员变量和辅助信息。可以使用编程语言中的结构体或者类来定义CAN结构体,具体的实现方式根据编程语言的特性而定。 最后,通过解析DBC文件生成的CAN结构体可以被应用程序使用,用于CAN消息的发送和接收,实现CAN通信的功能。 ### 回答3: dbc是一种用于描述CAN网络中的消息传输协议的文件格式,而CAN结构体指的是根据该文件生成的用于存储CAN消息的数据结构体。下面是使用300字回答如何使用dbc生成CAN结构体的解释: 为了生成CAN结构体,我们首先需要准备一个dbc文件,该文件包含了CAN网络中使用的消息、信号、节点等信息。使用dbc文件生成CAN结构体的过程一般分为三个步骤:解析dbc文件、生成消息结构体、生成信号结构体。 第一步,解析dbc文件。通过读取dbc文件的内容,我们可以逐行解析文件中的信息。根据dbc文件的语法规则,我们可以识别出消息、信号和节点之间的关系。这可以通过使用一些开源的dbc解析库来实现,例如canmatrix、cantools等。 第二步,生成消息结构体。在解析dbc文件时,我们可以获取到每个消息的ID、名称、周期、长度等信息。根据这些信息,我们可以定义一个消息结构体,用于存储该消息的信息。结构体中的字段可以包括消息的ID,消息的数据长度,以及数据字节等。 第三步,生成信号结构体。消息中可能有多个信号,每个信号都包含有关信号的名称、起始位、长度、类型等信息。根据这些信息,我们可以定义一个信号结构体,用于存储该信号的信息。结构体中的字段可以包括信号的名称,信号的起始位,信号的长度,信号的单位等。 通过以上三个步骤,我们可以根据dbc文件生成对应的CAN结构体。这些结构体可以用于在代码中处理CAN消息,发送和接收CAN信号。生成的CAN结构体可以提供给开发人员使用,方便他们对CAN网络进行相关操作和控制。 总之,使用dbc文件生成CAN结构体是一种将CAN消息和信号信息转化为代码结构的方法,可以方便地对CAN网络进行操作和控制。这种方法对于在嵌入式系统和汽车电子等领域中应用CAN通信的开发者来说非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值