为了您的学习更有效率,别再做无头苍蝇,虽然没有捷径但有前人的学习经验可以借鉴
如果您使用的单片机不带CAN总线,那么本篇文章对您不适用(编程环境是Keil5)
使用stm32系列单片机开发CAN的朋友们和以下内容契合度更高
第一步:简单的了解CAN
(如果在真正初次使用CAN前就把它很深入地剖解,那你是真的闲。建议编程的时候才深剖)
①CAN是一种通信协议(举例485,422,232,IIC,SPI它们也是一种通信协议),它就像各种单片机的uart口一样是存在于单片机内部的一个设备(也叫单片机的外设)
由于CAN比较高级,它只存在一些较高级的单片机中(叫做CAN总线),一些低端单片机需要接CAN控制器及电平转换器才能使用CAN通信。有自带CAN总线的单片机控制CAN通信实际上也是操作单片机内部的寄存器来实现。
②电路设计:
③数据传输协议:
CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
显性电平对应逻辑:0
CAN_H和CAN_L之差为2V左右。
隐性电平对应逻辑:1
CAN_H和CAN_L之差为0V。
④对初学者第一步,知道以上内容就够了!接下来直接打开Keil5建立编程环境,再打开相关CAN数据手册(开发手册),按照第二步(下面的步骤),边写程序边找手册上的资料。
第二步:带上CAN数据手册,编程走起!
①根据自己使用的单片机,在该单片机的芯片开发手册/参考手册上找出所有带CAN标题的书签,定位好资料位置。然后打开编程环境,建立工程,把单片机的底层代码文件包含进来
②封装CAN初始化函数(这个基本不用解释为什么,大多数外设运用都要初始化唤醒功能)
③按需求配置筛选器(鄙人认为是为了保证数据的正确率相当于滤波器保证信号稳定)
1、配置主筛选器寄存器CAN_FMR(设置FINIT为1筛选器进入初始化模式)
2、配置筛选器激活寄存器CAN_FA1R,激活其中一个筛选器。
3、配置筛选器尺度寄存器CAN_FS1R,设置筛选尺度。
4、配置筛选器模式寄存器CAN_FM1R,设置筛选器工作模式,有如下四种
5、配置筛选器FIFO分配寄存器CN_FFA1R(设置通过筛选器的数据存储到哪个FIFO存储器),注意每个筛选器的在寄存器设置位不一样,如FFA1位,设置的是筛选器1。
6、配置主筛选器寄存器CAN_FMR(设置FINIT为0筛选器结束初始化模式)
④如果需要CAN收发中断,则要配置中断使能寄存器CAN_IER。并写中断服务函数。对应地,也要根据单片机的不同做相应的单片机中断初始化。
⑤封装发送数据函数
是以数据帧的格式发送一串n多位的二进制数来达到发送0-8个字节数据的目的。
数据帧又分为几个部分如下
1)帧起始。表示数据帧开始的段。
2)仲裁段。表示该帧优先级的段。
3)控制段。表示数据的字节数及保留位的段。
4)数据段。数据的内容,一帧可发送0~8个字节的数据。
5)CRC段。检查帧的传输错误的段。
6)ACK段。表示确认正常接收的段。
7)帧结束。表示数据帧结束的段。
数据帧分为标准格式拓展格式两种区别如下图:
那么发送数据的数据内容和格式我们知道了,下面就是发送方法了
首先数据帧的数据都是在对应的寄存器里的,我们查手册可以知道,然后以下步骤
⑥封装接收数据
同样是操作相关寄存器,如下顺序