S32K14X CAN

S32K14X CAN

一、CAN总线工作原理:

CAN电平标准
CAN总线采用差分信号,即两线电压差(VCAN_H-VCAN_L)传输数据位
高速CAN规定:
电压差为0V时表示逻辑1(隐性电平)

电压差为2V时表示逻辑0(显性电平)

低速CAN规定:
电压差为-1.5V时表示逻辑1(隐性电平)

电压差为3V时表示逻辑0(显性电平)

在发送数据帧之前总线必须处于空闲状态,空闲状态时总线是隐形电平(1),随后数据帧开始,数据帧第一位表示是显性电平0,它的意思是SOF,帧起始。与串口波形的起始位一样帧起始的作用是“打破宁静”,因为空闲是隐形1所有设备都不去碰总线,那你要开始发数据帧第一位就必须得张开总线发送显性0。

一位帧起始之后,首先发送的是报文ID,标准格式是11位,报文ID可以表示后面数据的功能,因为总线上各种报文信息都有,如果没有ID加以区分那肯定就搞混了。同时报文ID还用于区分优先级,当多个设备同时发送时,根据仲裁规则ID小的报文优先发送,ID大的报文等待下一次总线空闲再重新发送,不同功能的数据帧其ID都不同。

报文ID后紧跟着的是RTR,占据1位,在数据帧里必须为显性0,RTR的意思是远程请求标志位,用于区分数据帧还是遥控帧,数据帧必须为显性0,遥控帧必须为隐形1。报文ID+RTR位可以称为仲裁段,仲裁主要靠ID来实现,RTR也加入进来的目的是相同ID的数据帧和遥控帧,数据帧的优先级大于遥控帧。

之后进入控制段,控制段首先是IDE,意思是ID拓展标志位,用于区分标准格式还是拓展格式,标准格式固定为显性0,拓展格式固定为隐形1。

之后下一位是r0,必须为显性0,r0意思是保留位,目前还没有用到。

后面四位是DLC,意思是表示数据段的长度,CAN总线一帧数据可以有1~8个字节有效载荷,并且可以灵活指定,就靠这个DLC指定,如果想发一个字节DLC就给0001,如果想发8个字节,DLC就给1000,DLC要配合后面数据段使用。

数据段就是有效载荷的数据了,根据DLC的指定,数据段可以有多个字节,DLC指定几个字节数据段就发几个字节。数据段长度是0~64位,最大64位即8个字节,这里位数是8的倍数。

数据段之后是CRC段,有15位,CRC是高效的校验算法。从SOF到Data这些数据位计算得到的校验码附在这后面,接收方收到数据和校验码也会调用CRC算法进行计算。

下一个是CRC界定符,1位,必须是隐形电平.

之后就是ACK段,里面有ACK槽和ACK界定符,都是1位,ACK槽的作用就是应答,发送方发送一帧数据到底有没有设备接收到呢就靠ACK位来实现,这里的应答设计和I2C的应答异曲同工,它的基本思想就是当发送方发完一帧数据的主要内容后在应答这一位时发送方释放总线,总线回归默认状态隐形1,如果接收方收到数据了它就会在ACK槽这一位主动出击把总线再拉开时总线呈现显性0的状态,发送方释放总线后在ACK槽会读取总线状态,如果发送方读取为显性0那就是数据被接收了,如果发送方读取为隐形1就说明发送失败发送方可以配置自动重发。可以看到在ACK槽这一位操作总线的权力是有一个短暂的交接的,前面所有波形都只有发送方有权操作总线,在ACK槽这一位变为接收方操作总线,为了给权力交接流出时间,ACK槽前后就要留两个界定符,在CRC界定符时发送方必须发隐形1,除了做一个分隔另一个作用就是在ACK槽之前发送方必须释放总线,发送隐形1就是释放总线,之后在ACK槽的时间点接收方会拉开总线,ACK槽接收后接收方不能一直拉着不放所以在ACK界定符时接收方必须及时释放总线交出控制权。

这里有两个注意事项,

第一个是ACK槽时可以允许多个接收方共同拉开总线,因为一个报文消息可以被多个设备同时接收,所以多个设备可以在这里同时拉开,多个设备同时操作总线输出显性0是没问题的。

第二个是,我没要知道并不是发送方把一段波形完整发出去然后在接收应答的,而是发送方和接收方共同完成一整个波形,发送方每发出一位,接收方就立刻接收到这一位了,所以在这条时序的最后整个数据帧还没结束接收方其实已经收完了,也就是应答位夹在发送过程之中。

最后应答位结束发送方再发7个隐形1,作为EOF帧结束,与串口波形里的停止位是一个意思。

任何设备检测到连续11个隐性电平,即认为总线空闲。

SOF(Start of Frame):帧起始,表示后面一段波形为传输的数据位

ID(Identify):标识符,区分功能,同时决定优先级

RTR(Remote Transmission Request ):远程请求位,区分数据帧和遥控帧

IDE(Identifier Extension):扩展标志位,区分标准格式和扩展格式

SRR(Substitute Remote Request):替代RTR,协议升级时留下的无意义位

r0/r1(Reserve):保留位,为后续协议升级留下空间

DLC(Data Length Code):数据长度,指示数据段有几个字节

Data:数据段的1~8个字节有效数据

CRC(Cyclic Redundancy Check):循环冗余校验,校验数据是否正确

ACK(Acknowledgement):应答位,判断数据有没有被接收方接收

CRC/ACK界定符:为应答位前后发送方和接收方释放总线留下时间

EOF(End of Frame ):帧结束,表示数据位已经传输完毕

若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送

实现非破坏性仲裁需要两个要求:

线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1

回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1

回读机制目的是确认自己发出的电平是否真实地发送出去了。因为根据线与特性,我发送1,如果要别的设备也在发送数据,别的设备发送了0,那么我读回的数据就不再是1了,因为我的数据1被别的设备的数据0损坏了,这个现象对仲裁就很重要,我发出1但是读回的是0,这说明总线上有别的设备,我感知到了别的设备和我的冲突,所以这时候我就退出不再跟别的设备抢总线资源。

位时序
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成
Tq是程序中自己指定的,比如可以确定一个Tq=0.5us,之后一位包含的四个段,SS段固定为1Tq,PTS段可以由自己指定配置为1~8Tq,PBS1段也是自己指定配置为1~8Tq,PBS2段自己指定配置为2~8Tq,除了SS段固定为1Tq其他的可以由自己在一个范围内指定。指定好之后在一位中SS、PTS、PBS1、PBS2就会依次排列。SS段意为同步段,如果数据跳变沿正好出现在SS段那就说明当前设备与波形达成同步,如果数据跳变沿不在SS段那就要调整当前设备的位时序使跳变沿正好出现在同步段。PTS意为传播时间段,作业在手册里是这样说的:PTS用于吸收网络上的物理延迟,网络的物理延迟指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。PTS的时间为以上延迟时间的和的两倍。之后两个PBS1和PBS2意为相位缓冲段,作用就是确定采样点的位置,采样点会在PBS1和PBS2中间。

硬件同步
硬同步也可以叫硬件同步,解决的问题是时接收方第一个采样点与波形的第一位对齐。

每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
硬同步只在帧的第一个下降沿(SOF下降沿)有效
经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近

波特率 计算
波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2)
例如:
SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq

Tq = 0.5us

波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps

二、CAN通讯: