微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 CAN 控制器

STM32 CAN 控制器

时间:11-11 来源:互联网 点击:

是设置CAN通信相关的控制位。

初始化实例为:

CAN_InitStructure.CAN_TTCM=DISABLE;//非时间触发通信模式

CAN_InitStructure.CAN_ABOM=DISABLE;//软件自动离线管理

CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒

CAN_InitStructure.CAN_NART=ENABLE;//禁止报文自动传送

CAN_InitStructure.CAN_RFLM=DISABLE;//报文不锁定,新的覆盖旧的

CAN_InitStructure.CAN_TXFP=DISABLE;//优先级由报文标识符决定

CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;//模式设置:1,回环模式;

//设置波特率

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度为个时间单位

CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;//时间段1占用8个时间单位

CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//时间段2占用7个时间单位

CAN_InitStructure.CAN_Prescaler=5;//分频系数(Fdiv)

CAN_Init(CAN1,&CAN_InitStructure);//初始化CAN

3)设置滤波器。

我们将使用滤波器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,让过滤器组工作在初始化模式下,然后设置滤波器组0的工作模式以及标识符ID和屏蔽位。最后激活滤波器,并退出滤波器初始化模式。

在库函数中,提供了函数CAN_FilterInit()用来初始化CAN的滤波器相关参数,CAN_Init()函数体中,在初始化之前,会设置CAN_FMR寄存器的INRQ为INIT让其进入初始化模式,然后初始化CAN滤波器相关的寄存器之后,会设置CAN_FMR寄存器的FINIT为0让其退出初始化模式。所以我们在调用这个函数的前后不需要再进行初始化模式设置。下面我们来看看CAN_FilterInit()函数的定义:

voidCAN_FilterInit(CAN_FilterInitTypeDef*CAN_FilterInitStruct);

这个函数只有一个入口参数就是CAN滤波器初始化结构体指针,结构体类型为CAN_FilterInitTypeDef,下面我们看看类型定义:

typedefstruct

{

uint16_tCAN_FilterIdHigh;

uint16_tCAN_FilterIdLow;

uint16_tCAN_FilterMaskIdHigh;

uint16_tCAN_FilterMaskIdLow;

uint16_tCAN_FilterFIFOAssignment;

uint8_tCAN_FilterNumber;

uint8_tCAN_FilterMode;

uint8_tCAN_FilterScale;

FunctionalStateCAN_FilterActivation;

}CAN_FilterInitTypeDef;

结构体一共有9个成员变量,第1个至第4个是用来设置过滤器的32位id以及32位maskid,分别通过2个16位来组合的

第5个成员变量CAN_FilterFIFOAssignment用来设置FIFO和过滤器的关联关系,我们的实验是关联的过滤器0到FIFO0,值为CAN_Filter_FIFO0。

第6个成员变量CAN_FilterNumber用来设置初始化的过滤器组,取值范围为0~13。

第7个成员变量FilterMode用来设置过滤器组的模式,取值为标识符列表模式CAN_FilterMode_IdList和标识符屏蔽位模式CAN_FilterMode_IdMask。

第8个成员变量FilterScale用来设置过滤器的位宽为2个16位CAN_FilterScale_16bit还是1个32位CAN_FilterScale_32bit。

第9个成员变量CAN_FilterActivation就很明了了,用来激活该过滤器。

过滤器初始化参考实例代码:

CAN_FilterInitStructure.CAN_FilterNumber=0;//过滤器0

CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;

CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//32位

CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID

CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//FIFO0

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0

CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

至此,CAN就可以开始正常工作了。如果用到中断,就还需要进行中断相关的配置

4)发送接受消息

在初始化CAN相关参数以及过滤器之后,接下来就是发送和接收消息了。库函数中提供了发送和接受消息的函数。发送消息的函数是:

uint8_tCAN_Transmit(CAN_TypeDef*CANx,CanTxMsg*TxMessage);

这个函数比较好理解,第一个参数是CAN标号,我们使用CAN1。第二个参数是相关消息结构体CanTxMsg指针类型,CanTxMsg结构体的成员变量用来设置标准标识符,扩展标示符,消息类型和消息帧长度等信息。

接受消息的函数是:

voidCAN_Receive(CAN_TypeDef*CANx,uint8_tFIFONumber,CanRxMsg*RxMessage);

前面两个参数也比较好理解,CAN标号和FIFO号。第二个参数RxMessage是用来存放接受到的消息信息。

结构体CanRx

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top