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)。
注:至于过滤器的配置请参考本博客过滤器相关配置文章