目标
通过CAN总线,用STM32对设备利用CAN模块发送指令,从而实现对设备的控制。
硬件设计
①收发芯片的功能:把单片机送来的信号通过收发芯片的转换从而实现信号的具体传输。
②120欧终端电阻:主要是为了防止信号的干扰,一般来说,终端设备的CAN_H和CAN_L也要加上60-120欧终端电阻。
电路设计
引脚1:CAN-TX传输数据输入;从CAN控制器读取数据到总线驱动器,与STM32的引脚PA12相连
引脚2:接地(此处的地与其他的地隔离)
引脚4:CAN-RX接收数据输出;从总线线路读出数据到CAN控制器,与STM32的引脚PA11相连
引脚3:3.3V供电或者5V供电
引脚5:基准电压输出,可以选择不适用该引脚
引脚6,7:CAN总线的高、低端
引脚8:选择高速模式或静音模式的输入(高速模式是正常工作模式,通过将引脚S接地来选择。如果引脚S未连接,则为默认模式。但是,为确保仅使用高速模式的应用中的EMI性能,建议将引脚S接地。在静音模式下,发射机被禁用。所有其他IC功能继续运行。通过将引脚S连接到VCC来选择静音模式,并可用于防止由于CAN控制器失控而导致网络通信受阻。)
软件设计
其实各种通信方式的本质都是一样的,均分为两个部分;①波特率:以何种速度来通信②具体准则:发送端和接收端对发送来的数据的解释。
CAN常用的工作模式是(1)回环模式:也就是自己发,自己收。(2)正常工作模式,也就是用于正常的接收,发送。
CAN配置
1.波特率:通过配置挂在APB1总线上的CAN1模块的几个参数设置从而得到通信速率。
然后通过波特率计算公式(波特率= APB1外设总线速率 * (1/(相位缓冲段 1+相位缓冲段 2+重新同步跳跃段)*(预分频系数)))来设置波特率
这个参数代表波特率=36M/(9*(5+2+1))=500K bps
注意:①相位缓冲段1设置范围:1-16 ②相位缓冲段2设置范围:1-8 ③重新同步跳跃段一般设置为1
2.发送端
(1)设置的数据格式
CAN协议规定发送的数据有几种:数据帧,遥控帧,错误帧,过载帧,间隔帧。我们取其一种:数据帧来举例,故名思意,这种帧就是用来发送数据的,也是应用最广泛的一种数据帧。
帧的格式如下:
(2)发送邮箱
用于存放要发送的数据。
程序选择 1 个空置的邮箱(TME=1)-->设置标识符(ID)数据长度(DLC)和发送数据(数据帧)-->设置 CAN_TIxR 的 TXRQ 位为 1,请求发送-->邮箱挂号(等待成为最高优先级)-->预定发送(等待总线空闲)-->发送-->邮箱空置。
(3)设置过滤器
(4)发送仲裁
如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。
ID模式:当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。此模式通过对CAN主控寄存器CAN_MCR的TXFP位清0来设置。
FIFO模式:通过对CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。
CAN发送函数如下:
在主函数中调用可实现单片机每1s上报一次:
参考博客:https://blog.csdn.net/m0_37844072/article/details/87897004