CAN 通信协议(希望大家多多指点)

一、CAN(Controller Area Network)协议的拥有稳定性、准确性,应用在汽车控制系统和其他重要的如医疗、船舶等工业方面

二、CAN协议两种标准化:
ISO11898 通信速率125Kbps-1Mbps高速通信协议
ISO11519 通信速率在125Kbps以下的低速通信协议

三、CAN协议的特点:
1)多主控制:总线空闲时,所有单元都可以可以发送消息,而两个以上的单元同时开始发送消息,根据标识符(identifer 简称 ID)决定优先级,ID表示访问总线消息的优先级(ID在这并不是表示发送的目的地址),进行逐位仲裁比较,仲裁获胜(表示优先级最高)可连续发送消息,仲裁失利的停止发送消息转为接收工作
2)系统的若软性:与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
3)通信速度较快,通信距离较远
4)具有错误检测、错误通知和错误恢复功能:所以单元都可以检测错误,检测出错误会立即通知其他单元。正在发送消息的单元一旦检测出错误,会强制结束发送,强制结束发送的单元会不断反复重新发送次消息直至发送成功为止(错误恢复功能)。
5)故障封闭功能:CAN总线可以判断错误类型在总线上是暂时的数据错误(如外部噪声),还是持续的数据错误(如单元内部故障,驱动故障等),当总线上发生持续数据错误时,可将此故障的单元从总线上隔离出去
6)连接节点多:理论上可以连接多个单元;单元连接太多造成通信速率下降,反之连接单元少通信速率增加。

四、CAN协议是串行异步通信,由CAN_High和CAN_Low两条信号线,以差分信号的形式进行通讯,下面是总线的两种连接方式:
1)闭环总线(高速通信大约在1Mbps左右,传输距离大约在40m)
2) 开环总线(低速通信在125kbps左右,传输距离远大约是1km)【两根线各串联2.2千欧的电阻】
3)显性电平对应的是逻辑0,为2.5V左右
隐性电平对应的是逻辑1,为0V
CAN 通信协议(希望大家多多指点)_第1张图片
4)通信方式: CAN总线可以挂很多个节点(也可以叫单元)(节点中有CAN的控制器【就是stm32芯片内部的一部分】和CAN收发器组成),连在同一个网络总线上像设置好的波特率等进行通讯

五、CAN协议每个数据的时序分解为 SS(同步段 1Tq)、PTS段(传播时间段1-8Tq)、PBS1段(相位缓冲段1 1-8Tq)、PBS2段(相位缓冲段2 2-8Tq)、SJW(再同步补偿宽度 1-4Tq)
Tq(time quantum):最小时间单位构成

CAN 通信协议(希望大家多多指点)_第2张图片

CAN 通信协议(希望大家多多指点)_第3张图片

在接收过程中检测到总线电平发生了改变时执行重新同步操作。 每当检测到一个边沿(总线电平的改变),收发单元根据SJW值通过增加PBS1段或减少PBS2段,来调整同步。如果发生了超出SJW值的误差时,最大调整量不能超过SJW值。
CAN 通信协议(希望大家多多指点)_第4张图片

调整同步的规则 ?

  1. 在1个位时间里(或者说在2个采样点之间),只允许一个同步(或者说只进行一次同步调整)。
  2. 只有当采样点之前的总线电平和边沿后的总线电平不同时,该边沿才能用于调整同步。
  3. 如果出现隐性电平到显性电平变化的边沿,且条件(1)和(2)满足,将进行同步。
  4. 如果在帧间间隙期间发生隐性电平到显性电平的信号边沿(除了间隙里的第一位),则总会执行硬件同步。
  5. 如果发生从所有其它隐性电平到显性电平的信号边沿,则执行再同步。
  6. 如果发送单元自身输出的显性电平被检测到有延迟,则不执行再同步。

CAN 通信协议(希望大家多多指点)_第5张图片

CAN 通信协议(希望大家多多指点)_第6张图片

CAN 通信协议(希望大家多多指点)_第7张图片

CAN 通信协议(希望大家多多指点)_第8张图片

CAN 通信协议(希望大家多多指点)_第9张图片

CAN 通信协议(希望大家多多指点)_第10张图片

六、报文:CAN协议通讯,对数据、操作命令以及同步信号打包

七、CAN协议中五种类型的帧:
数据帧
遥控帧
错误帧
过载帧
间隔帧

CAN 通信协议(希望大家多多指点)_第11张图片

数据帧和遥控帧有标准模式和扩展格式两种
标准模式:有11个位的标识符(ID)
扩展模式:有29个位的ID

注:以数据帧为例
帧起始
仲裁段:组成一个数据包,最小单位是数据位(如SS段)
ID决定了数据帧发送的优先级,也决定了其他节点是否接收这个数据帧
对于优先级最高级ID,先发送
控制段:ide0 标准帧、ide1 扩展帧
数据段:数据的内容,一帧可以发送0-8个字节的数据
CRC段:检查帧的传输错误的段
ACK段:表示正常接收的段
帧结束

数据帧的构成
CAN 通信协议(希望大家多多指点)_第12张图片

数据帧仲裁段的构成
CAN 通信协议(希望大家多多指点)_第13张图片

八、报文测试模式

1)正常模式
CAN 通信协议(希望大家多多指点)_第14张图片
2)静默模式
CAN 通信协议(希望大家多多指点)_第15张图片
CAN 通信协议(希望大家多多指点)_第16张图片
3)回环模式
CAN 通信协议(希望大家多多指点)_第17张图片
CAN 通信协议(希望大家多多指点)_第18张图片
4)静默回环模式
CAN 通信协议(希望大家多多指点)_第19张图片
CAN 通信协议(希望大家多多指点)_第20张图片

九、通过寄存器控制邮箱发送和接收FIFO

CAN 通信协议(希望大家多多指点)_第21张图片

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

CAN 通信协议(希望大家多多指点)_第22张图片

CAN 接收到的有效报文,被存储在 3 级邮箱深度的 FIFO 中。 FIFO 完全由硬件来管理,从而节省了 CPU 的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取 FIFO输出邮箱,来读取 FIFO 中最先收到的报文。 这里的有效报文是指那些正确被接收的(直到 EOF都没有错误)且通过了标识符过滤的报文。前面我们知道 CAN 的接收有 2 个 FIFO,我们每个滤波器组都可以设置其关联的 FIFO,通过 CAN_FFA1R 的设置,可以将滤波器组关联到FIFO0/FIFO1。
CAN 接收流程为: FIFO 空——>收到有效报文——>挂号_1(存入 FIFO 的一个邮箱,这个由硬件控制,我们不需要理会) ——>收到有效报文——>挂号_2——>收到有效报文——>挂号_3——>收到有效报文——>溢出。
这个流程里面,我们没有考虑从 FIFO 读出报文的情况,实际情况是:我们必须在 FIFO 溢出之前,读出至少 1 个报文,否则下个报文到来,将导致 FIFO 溢出,从而出现报文丢失。每读出 1 个报文,相应的挂号就减 1,直到 FIFO 空。

CAN 通信协议(希望大家多多指点)_第23张图片

CAN 通信协议(希望大家多多指点)_第24张图片

CAN 通信协议(希望大家多多指点)_第25张图片

CAN 通信协议(希望大家多多指点)_第26张图片

CAN 通信协议(希望大家多多指点)_第27张图片

CAN 通信协议(希望大家多多指点)_第28张图片

CAN 通信协议(希望大家多多指点)_第29张图片

CAN 通信协议(希望大家多多指点)_第30张图片

CAN 通信协议(希望大家多多指点)_第31张图片

你可能感兴趣的:(STM32)