一、CANt通讯有高速和低速两种方式,高速适合近距离传输,为闭环,而低速则适用于远距离传输,为开环。
二、CAN电平标准
CAN总线采用差分信号,即两线电压差来传输数据,对高速CAN而言,电压差为0时,表示逻辑1(隐性电平),相反,电压差为2v时,表示逻辑0(显性电平)低速CAN的电平标准稍有不同,显性电平有优先级
三、CAN总线帧格式
CAN协议规定了5种类型的帧:
数据帧:发送设备主动发送的数据
遥控帧:接收设备主动请求数据
错误帧:某个设备检测出错误时,向其它设备通知错误
过载帧:接收设备通知其尚未做好接收准备
帧间隔:用具将数据帧与遥控帧与前面的帧分开
对于大多数帧硬件已经设计好了,我们用的时候重点关注数据帧。
四、数据帧
数据帧由七个段构成:
帧起始:表示数据开始的段,一个数据位,均为显性电平0
仲裁段:表示该帧优先级的段
控制段:表示数据的字节数及保留位的段
数据段:发送数据的具体内容,可发送0-8个字节
CRC段:校验段,发送端根据发送的数据,计算好CRC校验后的值,并与附在数据段后面,接收设备根据接收到数据段的数据,就算CRC校验后的值,并与发送段计算好CRC校验后的值进行对比,看是否相同,相同则数据正确,反之数据有误。
ACK段:表示确定正常接收的段,与I2C类似
帧结束:表示数据帧结束的段
五、STM32标准库函数CAN通信配置流程:
分为三个部分:CAN外设初始化、发送报文、接收报文
1、CAN外设初始化
- RCC时钟初始化(CAN引脚时钟和CAN时钟)
- GPIO初始化,CAN_TX所对应的引脚初始化为复用推挽输出(~AF_PP),CAN_RX所对应的引脚初始化为上拉输入(~IPU)
- 整个CAN外设的初始化(CAN_Init)
- 过滤器初始化(CAN_FilterInit)
- 中断,ITConfig函数,使能中断输出,再加上NVIC和中断函数(如需)
2、发送报文
- CanTxMsg:发送报文结构体变量,需要先初始化适用,用法类似于GPIO_InitTypeDef
- StdId(标准ID)
- ExtId(扩展ID)
- IDE(ID类型,标准/扩展),
- RTR(指定消息帧类型,数据帧/远程帧)
- DLC(发送数据的长度,0-8)
- DaTa[8]:要发送数据的数组
- CRC校验由硬件自动生成,无需我们操作
- CAN_Transmit:其库函数返回值表明要传的邮箱
- CAN_TransmitStatus:获取邮箱状态
3、接收报文
- CanRxMsg:接收报文结构体变量,需要先初始化再使用,内部包含:
- StdId(标准ID)
- ExtId(扩展ID)
- IDE(ID类型,标准/扩展),
- RTR(指定消息帧类型,数据帧/远程帧)
- DLC(接收数据的长度,0-8)
- DaTa[8]:要接收数据的数组
- CRC校验由硬件自动生成,无需我们操作
- CAN_MessagePending:获取指定FIFO队列里面排队报文的数目