CAN通信单片机编程——最快入手方法

为了您的学习更有效率,别再做无头苍蝇,虽然没有捷径但有前人的学习经验可以借鉴

如果您使用的单片机不带CAN总线,那么本篇文章对您不适用(编程环境是Keil5)

使用stm32系列单片机开发CAN的朋友们和以下内容契合度更高

第一步:简单的了解CAN

(如果在真正初次使用CAN前就把它很深入地剖解,那你是真的闲。建议编程的时候才深剖)

①CAN是一种通信协议(举例485,422,232,IIC,SPI它们也是一种通信协议),它就像各种单片机的uart口一样是存在于单片机内部的一个设备(也叫单片机的外设)

由于CAN比较高级,它只存在一些较高级的单片机中(叫做CAN总线),一些低端单片机需要接CAN控制器及电平转换器才能使用CAN通信。有自带CAN总线的单片机控制CAN通信实际上也是操作单片机内部的寄存器来实现。

②电路设计:

CAN通信单片机编程——最快入手方法_第1张图片

 

③数据传输协议:

CAN通信单片机编程——最快入手方法_第2张图片

 

CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。

显性电平对应逻辑:0

CAN_H和CAN_L之差为2V左右。

隐性电平对应逻辑:1

CAN_H和CAN_L之差为0V。

④对初学者第一步,知道以上内容就够了!接下来直接打开Keil5建立编程环境,再打开相关CAN数据手册(开发手册),按照第二步(下面的步骤),边写程序边找手册上的资料。

 

第二步:带上CAN数据手册,编程走起!

①根据自己使用的单片机,在该单片机的芯片开发手册/参考手册上找出所有带CAN标题的书签,定位好资料位置。然后打开编程环境,建立工程,把单片机的底层代码文件包含进来

②封装CAN初始化函数(这个基本不用解释为什么,大多数外设运用都要初始化唤醒功能)

  1. 初始化硬件需求的单片机引脚(不同单片机对引脚初始化有不同的规则有些低端的8位单片机甚至不需要引脚初始化),使能相关的时钟信号(可能包括系统时钟、引脚时钟、外设CAN的时钟,也是根据自己用的单片机型号而定)
  2. 按要求配置位时序寄存器CAN_BTR(关于工作模式、波特率设置)
  3. 按要求配置主状态寄存器CAN_MCR(设置通信相关控制位)

 

③按需求配置筛选器(鄙人认为是为了保证数据的正确率相当于滤波器保证信号稳定)

1、配置主筛选器寄存器CAN_FMR(设置FINIT为1筛选器进入初始化模式)

2、配置筛选器激活寄存器CAN_FA1R,激活其中一个筛选器。

3、配置筛选器尺度寄存器CAN_FS1R,设置筛选尺度。

4、配置筛选器模式寄存器CAN_FM1R,设置筛选器工作模式,有如下四种

CAN通信单片机编程——最快入手方法_第3张图片

 

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)帧结束。表示数据帧结束的段。

 

数据帧分为标准格式拓展格式两种区别如下图:

CAN通信单片机编程——最快入手方法_第4张图片

 

那么发送数据的数据内容和格式我们知道了,下面就是发送方法了

首先数据帧的数据都是在对应的寄存器里的,我们查手册可以知道,然后以下步骤

  1. 检查发送状态寄存器CAN_TSR相应位看看有没有空数据的邮箱(有三个缓存数据的 邮箱)
  2. 判断数据帧中的IDE看看是不是拓展格式,然后根据情况发送对应数据到CAN发送 FIFO邮箱标识符寄存器(CAN_TIxR)(x=0/1),再配置CAN发送FIFO邮箱数据长度和时 间戳寄存器(CAN_TDTxR) (x=0/1)记录数据长度字节大小等,再用对应算法把数据帧的数 据段的数据传到CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR) (x=0~2),最后邮箱 标识符寄存器(CAN_TIxR)的TXRQ置1表示请求发送数据
  3. 检查发送状态寄存器CAN_TSR相应位,等待发送成功。

CAN通信单片机编程——最快入手方法_第5张图片

 

⑥封装接收数据

同样是操作相关寄存器,如下顺序

  1. 检查FIFO x CAN寄存器CAN_RFxR(x=0/1),读取相应状态,看看是否有数据接收
  2. 判断数据帧中的IDE看看是不是拓展格式,然后根据情况发送对应数据到CAN接收 FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1) ,和发送差不多,同样要配置再配置CAN 接收FIFO邮箱数据长度和时 间戳寄存器(CAN_RDTxR) (x=0/1)记录数据长度字节大 小等,再用对应算法把数据帧的数 据段的数据传到CAN发送邮箱数据寄存器 (CAN_RDLxR/CAN_RDHxR) (x=0~2)。
  3. 把CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)的RFOM0/RFOM1位置1,表示释 放指定的FIFO的输出邮箱,如果三个邮箱都有数据无法读下一条数据。CAN通信单片机编程——最快入手方法_第6张图片
    1. 本博客笔记视频记录在本人b站空间https://www.bilibili.com/video/av61852069

 

你可能感兴趣的:(基础学习,单片机学习)