四、CAN(Controller Area Network)
文章目录
(一)、CAN总线帧种类
CAN协议是通过以下5种类型的帧进行的: 数据帧 、摇控帧 、错误帧 、过载帧 、帧间隔 。
1、数据帧
数据帧一般由7个段构成,即:
(1) 帧起始。表示数据帧开始的段。
(2) 仲裁段。表示该帧优先级的段。
(3) 控制段。表示数据的字节数及保留位的段。
(4) 数据段。数据的内容,一帧可发送0~8个字节的数据。
(5) CRC段。检查帧的传输错误的段。
(6) ACK段。表示确认正常接收的段。
(7) 帧结束。表示数据帧结束的段。
2、摇控帧
摇控帧只发ID不发数据,将ID发给另一台设备,请求返回数据。
3、错误帧
CAN网络具有严格的错误诊断功能,该功能已固化在硅片之中,一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要CPU的干涉除非错误累计该发送器退隐(Bus Off)。
4、过载帧
过载帧是接收节点向总线上其它节点报告自身接收能力达到极限的帧。
5、帧间隔
帧间隔是用来隔离数据帧(或者遥控帧)的,也就是说,数据帧(或者遥控帧)通过插入帧间隔可以将本帧与先行帧(数据帧、遥控帧、错误帧、过载帧)分隔开来。
![](https://i-blog.csdnimg.cn/blog_migrate/d650a8f77327a6f5b9a5a45e38e55bd1.png)
(二)、CAN波特率计算
CAN通信波特率计算公式:
Baudrate = FPCLK / [ (tBS1+tBS2+t) * BRP]
tSJW:重新同步时间跳跃信号 range from 1~3
tBS1:时间段1的时间单元 range from 1~16
tBS2:时间段2的时间单元 range from 1~8
BRP:波特率分频器
Fpclk1/((tsjw+tbs1+tbs2) * brp)
当然很多设备的波特率都是固定的,比如以下这些设备:
汽油车:500K,250K,125K,100K
柴油车:250K
伺服电机控制器:250K,125K
EPEC控制器:250K
消防主机通信:5K,10K,13.3K
(三)、CAN电平类型
CAN_H | CAN_L | 电位差 | 电平 |
---|---|---|---|
2.5V | 2.5V | 0V | 隐性电平 |
3.5V | 1.5V | 2V | 显性电平 |
隐性电平->逻辑‘1’ 显性电平->逻辑‘0’
显性电平能覆盖阴性电平(驱动能力差异导致)
(五)、CAN总线设置程序
下面列出CAN主(从)机相关代码:
(主机和从机CAN的配置是差不多的,只不过发送接受的数据不同而导致之后的操作不同)
#include "bsp_can_master.h"
/*
* CAN 差分信号的表示
* 1:隐性电平 H2.5v - L2.5v = 0v
* 0:显性电平 H3.5v - L1.5v = 2v
*/
//主从机CAN设置都一样,只不过发送接收有些许差异
typedef unsigned char u8;
//接收数据缓冲区
u8 RXBUF[5];
u8 RX_FLAG = 0;
CanTxMsg TXMessage; //发送数据缓冲区
CanRxMsg RXMessage; //接收数据缓冲区
void CAN_Master_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //配置CAN对应引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO和复用IO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);