stm32 HAL库之CAN总线

本文的目的是为了能够实现功能,故写的时候比较简略。

参考资料:https://blog.csdn.net/u012308586/article/details/81001102

                 正点原子开发手册

目标:

通过can总线,用stm32的CAN模块实现对电机驱动发送指令,从而实现对电机的控制。

硬件设计:

①收发芯片的功能:把单片机送来的信号通过收发芯片的转换从而实现信号的具体传输。

②120欧终端电阻:主要是为了防止信号的干扰,一般来说,终端设备的CAN_H和CAN_L也要加上120欧终端电阻。

软件设计基本知识:

其实各种通信方式的本质都是一样的,均分为两个部分;①波特率:以何种速度来通信②具体准则:发送端和接收端对发送来的数据的解释。

特色:CAN工作于4种模式;类似于手机的飞行模式,正常模式,待机状态,是一种感觉。

           CAN常用的工作模式是(1)回环模式:也就是自己发,自己收。(2)正常工作模式,也就是用于正常的接收,发送。

一.公共部分(发送端和接收端都会用到的部分)

①波特率:

通过配置挂在APB1总线上的CAN1模块的几个参数设置从而得到通信速率。也就是通过设置挂在APB1外设总线上的速率 

42Mhz。 

然后通过波特率计算公式(波特率= APB1外设总线速率  * (1/(相位缓冲段 1+相位缓冲段 2+重新同步跳跃段)*(预分频系数)))来设置波特率

这个参数代表波特率=42M/(2*(14+6+1))=1M bps

注意:①相位缓冲段1设置范围:1-16 ②相位缓冲段2设置范围:1-8  ③重新同步跳跃段一般设置为1

二.发送端:

(1)设置的数据格式

CAN协议规定发送的数据有几种:数据帧,遥控帧,错误帧,过载帧,间隔帧。我们取其一种:数据帧来举例,故名思意,这种帧就是用来发送数据的,也是应用最广泛的一种数据帧。

帧的格式如下图

对于我们来说我们只需要关注以下几点:①仲裁段(ID)  ②数据段的长度(DLC)③帧的类型

①ID;这是CAN总线的特色,它有两个含义

(1)代表每个单元的地址

(2)代表优先级,CAN总线可以用于多主多从结构,简而言之,在一个系统里面,每个单元都可以收发,那么当有多个单元想要占用总线的时候,那么我给谁用呢?于是这个时候多个单元都来到总线上进行仲裁,优先级高的占据总线使用权。

②数据长度:就是明确的指出我发的这一帧数据里面有几个数据(一帧最多发送8字节的数据)

③帧的类型:有标准帧(11位)和扩展帧(29位)两种,这是为整个网络考虑,当整个网络节点个数多,则用扩展帧。小型网络标准帧足够。

(2)发送邮箱

用于存放要发送的数据。

程序选择 1 个空置的邮箱(TME=1)-->设置标识符(ID)数据长度(DLC)和发送数据(数据帧)-->设置 CAN_TIxR 的 TXRQ 位为 1,请求发送-->邮箱挂号(等待成为最高优先级)-->预定发送(等待总线空闲)-->发送-->邮箱空置。

(3)发送仲裁

问题来源:用CAN发送多个数据的时候,出现了发送字节乱序的问题。

参考博客:https://blog.csdn.net/zhangxufei/article/details/52334278

如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

ID模式:当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。此模式通过对CAN主控寄存器CAN_MCR的TXFP位清0来设置。

FIFO模式:通过对CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。

三.接收端

对于我们来说我们只需要关注以下几点:①过滤器

①过滤器:

(1)顾名思义,通过它来得到我们想要的ID的数据,当总线上的数据经过仲裁后,终于到达目的地(接收端)了,那么这个时候还要让接收端看看这是不是我想要的数据,怎么看呢?通过ID。

(2)工作模式:列表模式;得到一组帧,通过设置仅关心ID的几位来实现。

                          标志位掩码模式:得到特定ID的帧。过来的帧的ID必须与过滤器的ID一摸一样。

四.代码实现:

链接:https://pan.baidu.com/s/1GadiL6UjDvrh6wDDlpp1nw   提取码:38zp

你可能感兴趣的:(stm32 HAL库之CAN总线)