STM32 CAN控制的相关结构体

目录

CAN结构体

CAN初始化结构体

CAN发送及接收结构体

CAN筛选器结构体


CAN结构体

        从STM32的CAN外设我们了解到它的功能非常多,控制涉及的寄存器也非常丰富,而使用STM32标准库提供的各种结构体及库函数可以简化这些控制过程。跟其它外设一样,STM32标准库提供了CAN初始化结构体及初始化函数来控制CAN的工作方式,提供了收发报文使用的结构体及收发函数,还有配置控制筛选器模式及ID的结构体。

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

CAN初始化结构体

STM32 CAN控制的相关结构体_第1张图片

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

  • CAN_Prescaler

本成员设置CAN外设的时钟分频,它可控制时间片Tq的时间长度,这里设置的值最终会减1后再写入BRP寄存器位(因此不能设置为0),即前面介绍的Tq计算公式:

Tq = (BRP[9:0]+1) x TPCLK

等效于:Tq = CAN_Prescaler x TPCLK

  • CAN_Mode

本成员设置CAN的工作模式,可设置为正常模式(CAN_Mode_Normal)、回环模式(CAN_Mode_LoopBack)、静默模式(CAN_Mode_Silent)以及回环静默模式(CAN_Mode_Silent_LoopBack)。

我们一般先设置为回环模式进行调试,调试完之后再设置为正常模式

  • CAN_SJW

本成员可以配置SJW的极限长度,即CAN重新同步时单次可增加或缩短的最大长度,它可以被配置为1-4Tq(CAN_SJW_1/2/3/4tq)。

  • CAN_BS1

本成员用于设置CAN位时序中的BS1段的长度,它可以被配置为1-16个Tq长度(CAN_BS1_1/2/3…16tq)。

  • CAN_BS2

本成员用于设置CAN位时序中的BS2段的长度,它可以被配置为1-8个Tq长度(CAN_BS2_1/2/3…8tq)。

SYNC_SEG、BS1段及BS2段的长度加起来即一个数据位的长度,即前面介绍的原来计算公式:

T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)

等效于:T1bit = 1Tq+CAN_BS1+CAN_BS2

  • CAN_TTCM

本成员用于设置是否使用时间触发功能(ENABLE/DISABLE),时间触发功能在某些CAN标准中会使用到。

  • CAN_ABOM

本成员用于设置是否使用自动离线管理(ENABLE/DISABLE),使用自动离线管理可以在节点出错离线后适时自动恢复,不需要软件干预。

  • CAN_ AWUM

本成员用于设置是否使用自动唤醒功能(ENABLE/DISABLE),使能自动唤醒功能后它会在监测到总线活动后自动唤醒。

  • CAN_NART

本成员用于设置是否使用自动重传功能(ENABLE/DISABLE),使用自动重传功能时,会一直发送报文直到成功为止。

  • CAN_RFLM

本成员用于设置是否使用锁定接收FIFO(ENABLE/DISABLE),锁定接收FIFO后,若FIFO溢出时会丢弃新数据,否则在FIFO溢出时以新数据覆盖旧数据。

  • CAN_TXFP

本成员用于设置发送报文的优先级判定方法(ENABLE/DISABLE),使能时,以报文存入发送邮箱的先后顺序来发送,否则按照报文ID的优先级来发送。

CAN发送及接收结构体

STM32 CAN控制的相关结构体_第2张图片

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

        发送结构体配置完之后作为传入参数给CAN_Transmit函数,返回值0、1、2,表示告诉我们数据最终从哪个邮箱发送出去。

STM32 CAN控制的相关结构体_第3张图片

        但数据发送出去不是立刻就成功的,我们可以通CAN_TransmitStatus函数来判断是否发送成功,邮箱号作为参数。

STM32 CAN控制的相关结构体_第4张图片

  • StdId

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

  • ExtId

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

  • IDE

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

  • RTR

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

  • DLC

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

Data[8]

本成员存储的就是数据帧中数据段的数据。如果使用遥控帧,可以随便填。

  • FMI

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

接收函数为CAN_Receive

STM32 CAN控制的相关结构体_第5张图片

当需要使用CAN发送报文时,先定义一个上面发送类型的结构体,然后把报文的内容按成员赋值到该结构体中,最后调用库函数CAN_Transmit把这些内容写入到发送邮箱即可把报文发送出去。

接收报文时,通过检测标志位获知接收FIFO的状态,若收到报文,可调用库函数CAN_Receive把接收FIFO中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文。

可以通过如下函数查看FIFO的状态

STM32 CAN控制的相关结构体_第6张图片

CAN筛选器结构体

STM32 CAN控制的相关结构体_第7张图片

  • CAN_FilterIdHigh

CAN_FilterIdHigh成员用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的高16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。

  • CAN_FilterIdLow

类似地,CAN_FilterIdLow成员也是用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的低16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。

  • CAN_FilterMaskIdHigh

CAN_FilterMaskIdHigh存储的内容分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdHigh相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdHigh成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。

  • CAN_FilterMaskIdLow

类似地,CAN_FilterMaskIdLow存储的内容也分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdLow相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdLow成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。

不同模式下各结构体成员的内容:

STM32 CAN控制的相关结构体_第8张图片

  • CAN_FilterFIFOAssignment

本成员用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收FIFO,它的可选值为FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。

  • CAN_FilterNumber

本成员用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器,CAN一共有28个筛选器,所以它的可输入参数范围为0-27。

  • CAN_FilterMode

本成员用于设置筛选器的工作模式,可以设置为列表模式(宏CAN_FilterMode_IdList)及掩码模式(宏CAN_FilterMode_IdMask)。

  • CAN_FilterScale

本成员用于设置筛选器的尺度,可以设置为32位长(宏CAN_FilterScale_32bit)及16位长(宏CAN_FilterScale_16bit)。

  • CAN_FilterActivation

本成员用于设置是否激活这个筛选器(宏ENABLE/DISABLE)。

你可能感兴趣的:(CAN通讯,stm32,单片机,嵌入式,CAN通讯)