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

STM32的CAN应用指南

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

CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。

3、设置滤波器。

设置CAN_FMR的FINIT位,让过滤器组工作在初始化模式下,然后设置滤波器组0的工作模式以及标识符ID和屏蔽为。最后激活滤波器。并退出滤波器初始化模式。如果用到中断,还要配置中断模式。

具体的:

如何初始化CAN:

1、使能相关时钟(PORTA时钟,CAN时钟),初始化引脚RX和TX。

2、设置CAN_MCR,退出睡眠模式,同时设置参数。基本是所有位清零。关于睡眠模式,CAN在复位后都是进入睡眠模式,当然也可以设置自动唤醒模式等。

3、请求CAN进入初始化模式,对CAN_MSR的位0置1。等待进入初始化,检验MCR位0 INAK的值,当真正变为1的时候,在进行下一步。因为这个过程可能不是瞬间完成的,如果当前有CAN活动,就会等到本次活动结束后再进入初始化模式,硬件对INAK位置1。

4、设置CAN_MCR的各位,位2-位7。设置位时序寄存器CAN_BTR的各位,在这里可以设置静默模式、环回模式、波特率。

5、请求CAN退出初始化模式。设置MCR的位0.等待完全退出初始化模式,通过检验MSR的位。

6、初始化过滤器(初始化寄存器不是在CAN初始化模式下进行的,而是过滤器组工作到初始化模式)。设置过滤器主控寄存器CAN_FMR的位0,使过滤器组工作在初始化模式。

7、设置过滤器激活寄存器CAN_FA1R来禁用相应的过滤器,因为只有对相应位清零或者对CAN_FME的FINIT位设置位1,才能修改相应的过滤器寄存器CAN_FiRx。

8、设置过滤器模式CAN_FM1R(标识符屏蔽模式or标识符列表模式);设置过滤器位宽寄存器CAN_FS1R(1个32位的过滤器or2个16位的过滤器);设置过滤器FIFO关联寄存器CAN_FFA1R(过滤器关联到FIFO0还是FIFO1当中)。

9、填写过滤器标识和屏蔽。通过设置寄存器CAN_FiR1和CAN_FiR2来设置标识(ID)和屏蔽(MASK)。

10、激活过滤器,CAN_FA1R位0设置为1。

11、过滤器进入正常工作模式,CAN_FMR位0清零

如何发送一个报文:

1、判断三个邮箱中哪个为空(CAN_TSR的位26位27位28),哪个为空用哪个?如果没有空邮箱,则退出本次发送过程。

2、清除发送邮箱标识符寄存器(因为要填写新的标识符)。

3、设置发送邮箱的标识符寄存器CAN_TIxR。

4、设置发送邮箱的数据长度和时间戳寄存器CAN_TDTxR。

5、填写要发送的数据,即设置发送邮箱高低字节数据寄存器CAN_TDHxR和CAN_TDLxR。

6、对标识符寄存器CAN_TIxR的位0即TXRQ位置1,来请求发送邮箱的数据。当数据发送完成后,硬件对其清零。

7、查询发送状态,通过查询发送状态寄存器CAN_TSR。基本查询三个状态参数。位0 RQCP1邮箱0(不一定是0,看使用的是哪个邮箱了)请求完成;位1 TXOK0邮箱0发送成功;位26发送邮箱0位为空,没有等待发送的报文。当这三项都成功后,返回发送成功。

如何接收一个报文:

1、查询FIFO里面是否存在有效报文,查询接收FIFO0寄存器CAN_RF0R的位1:0当前接收FIFO中存放的报文数目。如果有数据,下一步将数据读出。

2、判断标识符类型,接收来的报文是采用标准标识符还是扩展标识符。CAN_RIxR的位2 IDE。

3、根据不同类型的标识符来做不同的操作。具体可查看CAN_RIxR的位31:3。扩展标识符低字节存在位20:3。扩展标识符或标准标识符存在位31:21。扩展标识符39位,标准标识符11位。

4、查询CAN_RIxR的位1来判定是数据帧还是远程帧。

5、查询CAN_RDTxR位3:0获取数据帧的数据长度。

6、读取接收FIFO邮箱高低字节数据寄存器CAN_RDLxR和CAN_RDHxR。

7、释放FIFO邮箱。CAN_RF0R的位5。

如何使CAN接收工作在中断模式下:

1、通过寄存器CAN_IER来设置中断使能,正常情况下使用位1,FMPIE0:FIFO0消息挂号中断使能置1。

2、中断分组

3、写中断处理函数(较自由)。可以通过设置中断使能来屏蔽有写中断,如果中断都打开的话就需要在中断处理函数里面来进行判断处理。因为每个CAN只有4个主中断,即发送中断、接收FIFO0中断、接收FIFO1中断和SCE中断。

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

网站地图

Top