CAN--CAN例程中的参数解释

typedef struct
{

 uint16_t CAN_Prescaler; /*配置CAN外设的时钟分频,可设置为1-1024*/

 uint8_t CAN_Mode; /*配置CAN的工作模式,回环或正常模式*/

 uint8_t CAN_SJW; /*配置SJW极限值 */

 uint8_t CAN_BS1; /*配置BS1段长度*/

 uint8_t CAN_BS2; /*配置BS2段长度 */

 FunctionalState CAN_TTCM; /*是否使能TTCM时间触发功能*/

 FunctionalState CAN_ABOM; /*是否使能ABOM自动离线管理功能*/

 FunctionalState CAN_AWUM; /*是否使能AWUM自动唤醒功能 */

 FunctionalState CAN_NART; /*是否使能NART自动重传功能*/

 FunctionalState CAN_RFLM; /*是否使能RFLM锁定FIFO功能*/

 FunctionalState CAN_TXFP; /*配置TXFP报文优

} CAN_InitTypeDef;

成员说明如下:

CAN初始化结构体:

(1)    CAN_Prescaler

本成员设置CAN外设的时钟分频,它可控制时间片Tq的时间长度,这里设置的值最终会减1后再写入BRP寄存器位

(2)    CAN_Mode

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

(3)    CAN_SJW

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

(4)    CAN_BS1

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

(5)    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

(6)    CAN_TTCM

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

(7)    CAN_ABOM

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

(8)    CAN_ AWUM

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

(9)    CAN_ABOM

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

(10)    CAN_NART

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

(11)    CAN_RFLM

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

(12)    CAN_TXFP

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

 

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

CAN发送和接收结构体:

 typedef struct {

 uint32_t StdId; /*存储报文的标准标识符11位,0-0x7FF. */
 uint32_t ExtId; /*存储报文的扩展标识符29位,0-0x1FFFFFFF. */
 uint8_t IDE; /*存储IDE扩展标志 */
 uint8_t RTR; /*存储RTR远程帧标志*/
 uint8_t DLC; /*存储报文数据段的长度,0-8 */
 uint8_t Data[8]; /*存储报文数据段的内容 */
  } CanTxMsg;

uint8_t FMI; /*存储了本报文是由经过筛选器存储进FIFO的,0-0xFF */

注:发送结构体与接收结构体是类似的,只是接收结构体多了一个FMI成员

(1)    StdId

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

(2)    ExtId

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

(3)    IDE

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

(4)    RTR

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

(5)    DLC

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

(6)    Data[8]

本成员存储的就是数据帧中数据段的数据。

(7)    FMI

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

 

CAN过滤器配置结构体:

typedef struct {
 uint16_t CAN_FilterIdHigh; /*CAN_FxR1寄存器的高16位 */
 uint16_t CAN_FilterIdLow; /*CAN_FxR1寄存器的低16位*/
 uint16_t CAN_FilterMaskIdHigh; /*CAN_FxR2寄存器的高16位*/
 uint16_t CAN_FilterMaskIdLow; /*CAN_FxR2寄存器的低16位 */
 uint16_t CAN_FilterFIFOAssignment; /*设置经过筛选后数据存储到哪个接收FIFO */
 uint8_t CAN_FilterNumber; /*筛选器编号,范围0-27*/
 uint8_t CAN_FilterMode; /*筛选器模式 */
 uint8_t CAN_FilterScale; /*设置筛选器的尺度 */
 FunctionalState CAN_FilterActivation; /*是否使能本筛选器*/
 } CAN_FilterInitTypeDef;

(1)    CAN_FilterIdHigh

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

(2)    CAN_FilterIdLow

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

(3)    CAN_FilterMaskIdHigh

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

(4)    CAN_FilterMaskIdLow

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

上面四个结构体的存储的内容很容易让人糊涂,请结合前面的图 4014和下面的表 407理解,如果还搞不清楚,再结合库函数CAN_FilterInit的源码来分析。

对这些结构体成员赋值的时候,还要注意寄存器位的映射,即注意哪部分代表STID,哪部分代表EXID以及IDE、RTR位。

(5)    CAN_FilterFIFOAssignment

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

(6)    CAN_FilterNumber

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

(7)    CAN_FilterMode

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

(8)    CAN_FilterScale

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

(9)    CAN_FilterActivation

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

 

注:至于过滤器的配置请参考本博客过滤器相关配置文章

 

posted @ 2023-07-03 11:37  WCH_CH32  阅读(469)  评论(0编辑  收藏  举报