CAN通信

        CAN通信控制器通过两根线上的电位差来判断总线电平,是ISO国际标准化的串行通信协议。总线电平分为显性电平和隐形电平,二者必居其一。发送方通过总线上电平的变化将信息发送给接收方。CAN通讯是半双工的,收发数据需要分时进行。

 CAN通信特点:

1.多主控制:在总线空闲是,所有单元都可以发送信息(多主控制),而两个以上单元同时开始发送信息时,根据标识符(ID)决定优先级,其中ID并不是发送的目的地址,而是表示访问总线的消息的优先级。两个以上单元同时发送信息时,对各个信息的ID进行仲裁,优先级高的单元可以继续发送信息,其他单元停止发送转为接受工作。

2.系统的若软性:与总线相连的单元没有类似的地址信息,因此在总线上增加单元时,连接在总线上的其他单元的软硬件及应用层不需要改变。

3.通信速度快,距离远:最高1Mbps(距离小于40m),最远可达10kM(速率低于5kbps)。

4.具有错误检查,通知,恢复功能:所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元,正在发送的单元一旦检测出错误,会强制结束当前发送。强制结束的单元会不断重复发送此信息直到成功发送为止。

5.故障封闭功能:CAN可以判断错误的类型是总线上的暂时的数据错误(外部噪声),还是持续的数据错误(单元内部故障,驱动器故障,断线),因此,当总线上出现错误时,可以将故障的单元从总线上隔离出去。

6.连接节点多:CAN总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于CAN通讯协议不对节点进行地址编码,而是对数据内容进行编码,所以CAN可以连接多个单元节点,理论上没有限制,但是实际上可连接单元受总线上的时间延迟及电气负载的限制。降低通信速度,可连接单元数量增加。

        CAN通讯节点由一个CAN控制器及CAN收发器组成,控制器与收发器之间通过CAN_Tx及CAN_Rx信号线相连,收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连。其中CAN_Tx及CAN_Rx使用普通的类似TTL逻辑信号,而CAN_High及CAN_Low是一对差分信号线,使用比较特别的差分信号。

        当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low线输出到CAN总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的CAN_High及CAN_Low信号转化成普通的逻辑电平信号,通过CAN_Rx输出到控制器中。

CAN协议有两个标准:ISO11898标准(通信速率为125kbps-1Mkbps的高速通信标准)和ISO1159-2标准(125kbps以下的低速通信标准)

闭环总线网络:

CAN通信_第1张图片

         从该特性可以看出,显性电平对应逻辑0,CAN_H和CAN_L之差为2.5V左右。而隐性电平对应逻辑1,CAN_H和CAN_L之差为0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

开环总线网络:

CAN通信_第2张图片

差分信号:

差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑0和逻辑1。

CAN通信_第3张图片

相对于单信号线传输的方式,使用差分信号传输具有如下优点:

1.抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信的差值,所以外界的共模噪声可以被完全抵消。

2.能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。

3.时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。

由于差分信号线具有这些优点,所以在USB协议485协议以太网协议及CAN协议的物理层中,都使用了差分信号传输。

CAN协议中的差分信号:

CAN通信_第4张图片

以高速CAN协议为例,当表示逻辑1时(隐性电平),CAN_High和CAN_Low线上的电压均为2.5v,即它们的电压差VH-VL=0V;而表示逻辑0时(显性电平),CAN_High的电平为3.5V,CAN_Low线的电平为1.5V,即它们的电压差为VH-VL=2V。

CAN通信_第5张图片

 CAN通信_第6张图片

CAN协议层

CAN的波特率及位同步

        由于can属于异步通信,没有时钟信号线,连接在同一个总线网络中的各个节点就会像串口异步通信那样,节点间使用约定好的波特率进行通讯,特别的CAN还会使用位同步的方式来抗干扰,吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

位时序分解

        为了实现位同步,CAN协议把每一个数据位的时序分解为ss段,pts段,pbs1段,pbs2段。这四段的长度加起来即为一个can数据位的长度,分解后最小时间单位是Tq,而一个完整的位由8-25个Tq组成。

CAN通信_第7张图片

         CAN通讯信号每一个数据位的长度为19Tq,其中SS段占1Tq,PTS段占6Tq,PBS1段占5Tq,PBS2段占7Tq。信号的采样点位于PBS1段与PBS2段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

1.SS译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS段的大小固定为1Tq。

2.PTS译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS段的大小可以1~8Tq。作用是吸收误差。stm32里面不涉及这一片段。

3.PBS1译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1段的初始大小可以为1~8Tq。

4.PBS2这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2段的初始大小可以为2~8Tq

PBS2是在周期相位超过2π时才会启用PBS2,在信号的基础上超过2π的部分由于是周期信号,等同于2π之前的部分,无意义,但是工业上的总线传输时,通常会出现不是周期信号的情况,也会出现溢出的问题,所以有PBS2缓存的出现。

同步过程分析

        波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就需要用到数据位内的SS、PTS、PBS1及PBS2段了。

根据对段的应用方式差异,CAN的数据同步分为硬同步和重新同步。其中硬同步只是当存在”帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这两种方式具体介绍如下:

1.硬同步

        若某个CAN节点通过总线发送数据时,它会发送一个表示通讯起始的信号(即下一小节介绍的帧起始信号),该信号是一个由高变低的下降沿。而挂载到CAN总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。

CAN通信_第8张图片

        可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的SS段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的SS段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。

2.重新同步

        前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步(帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用SS段来进行检测,同步的目的都是使节点内的SS段把跳变沿包含起来。

        重新同步的方式分为超前和滞后两种情况,以总线跳变沿与SS段的相对位置进行区分。第一种相位超前的情况,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前2Tq,这时控制器在下一个位时序中的PBS1段增加2Tq的时间长度,使得节点与总线时序重新同步。

CAN通信_第9张图片

        第二种相位滞后的情况,节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后2Tq,这时控制器在前一个位时序中的PBS2段减少2Tq的时间长度,获得同步。

 CAN通信_第10张图片

         在重新同步的时候,PBS1和PBS2中增加或减少的这段时间长度被定义为”重新同步补偿宽度SJW。一般来说CAN控制器会限定SJW的最大值,如限定了最大SJW=3Tq时,单次同步调整的时候不能增加或减少超过3Tq的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的SJW极限值较大时,可以吸收的误差加大,但通讯的速度会下降。

        当引起重新同步沿的相位误差的幅值小于或等于重新同步跳转宽度的设定值时,重新同步和硬件同步的作用相同。当相位错误的量级大于重新同步跳转宽度时:

如果相位误差为正,则相位缓冲段1 被增长。增长的范围为与重新同步跳转宽度相等的值。

如果相位误差为负,则相位缓冲段2 被缩短。缩短的范围为与重新同步跳转宽度相等的值。

3.同步的原则:硬同步和重新同步都是同步的两种形式,遵循以下规则:

(1).在一个位时间里只允许一个同步。

(2).仅当采集点之前探测到的值与紧跟沿之后的总线值不相符合时,才把沿用作于同步。

(3).总线空闲期间,有一“隐性”转变到“显性”的沿,无论何时,硬同步都会被执行。

(4).符合规则1 和规则2 的所有从“隐性”转化为“显性”的沿可以用作为重新同步。有一例外情况,即,当发送一显性位的节点不执行重新同步而导致一“隐性”转化为“显性”沿,此沿具有正的相位误差,不能用作于重新同步。

注意:在具体的CAN控制器芯片(如SJA1000)中这部分内容其实很简单,只用了2个特殊功能寄存器(总线时序寄存器BTR0和BTR1)来描述其功能,用他们来设置通讯波特率就可以了。

        总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN通讯的波特率。

        例如,假设上图中的1Tq=1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1bit =19us,从而每秒可以传输的数据位个数为:1x10E6­/19 = 52631.6 (bps)。这个每秒可传输的数据位的个数即为通讯中的波特率。

CAN的报文种类及结构

        当使用CAN协议进行通讯时,需要对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。

报文的种类

        在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号,各种各样的标签就如同SPI中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为CAN的“数据帧”。

为了更有效地控制通讯,CAN一共规定了5种类型的帧。

CAN通信_第11张图片

CAN通信_第12张图片

        数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束,在它们之间,分别有仲裁段、控制段、数据段、CRC段和ACK段。

1.帧起始:SOF段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。

2.仲裁段:当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。

        仲裁段的内容主要为本数据帧的ID信息(标识符),比如用0x5f表示温度,用0x7f表示速度。优先级的问题:0x5f比0x7f小。数据帧具有标准格式和扩展格式两种,区别就在于ID信息的长度,标准格式的ID为11位,扩展格式的ID为29位,它在标准ID的基础上多出18位。

        在CAN协议中,ID起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,可给它打包上一个优先级高的ID,使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得CAN的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。

CAN通信_第13张图片 

        报文的优先级,是通过对ID的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN正是利用这个特性进行仲裁。

        若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元1发送的为隐性电平,而此时节点单元2发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元2竞争总线成功,这个报文得以被继续发送出去。

        仲裁段ID的优先级也影响着接收设备对报文的反应。因为在CAN总线上数据是以广播的形式发送的,所有连接在CAN总线的节点都会收到所有其它节点发出的有效数据,因而CAN控制器大多具有根据ID过滤报文的功能,它可以控制自己只接收某些ID的报文。

 CAN通信_第14张图片

        RTR位:远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。

        IDE位:标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。

        SRR位:只存在于扩展格式,它用于替代标准格式中的RTR位。由于扩展帧中的SRR位为隐性位,RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

        控制段:在控制段中的r1和r0为保留位,默认设置为显性位。它最主要的是DLC段(Data Length Code),译为数据长度码,它由4个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0~8。

        数据段:数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8个字节组成,MSB先行。

        CRC段:为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段间隔起来。

        ACK段:ACK段包括一个ACK槽位,和ACK界定符位。类似I2C总线,在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符间隔开。

        帧结束:EOF段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7个隐性位表示结束。

CAN通信_第15张图片

 

你可能感兴趣的:(网络,stm32,嵌入式硬件)