Can总线

简洁易用、传输速度快、易扩展、可靠性高的串行通信总线

特征

两根通信线

(CAN_H、CAN_L),线路少,无需共地(但是如果不共地的话,可能会让收发器承受较高的共模电压,所以实际中can通信一般还是会共地的,即再额外使用一根线,将各设备的GND连接在一起。如果还需要为设备传递供电电源,则还需要一根电源正的线路)

差分信号通信

抗干扰能力强(因为如果出现干扰,一般两根通信线的电压都会产生变化,那么此时他们的电压差值任然不变,所以抗干扰能力强)

异步

无需时钟线,通信速率由各设备各种约定

半双工

可挂载多设备,多设备同时发送数据时通过仲裁判断先后数据

报文ID

11位/29位报文ID,用于区分消息功能,同时决定优先级

有效载荷

可配置1~8字节的有效载荷

传输方式

可实现广播式请求式两种传输方式

广播时:发送方不管你接不接受都直接发送出去,各个设备按照自己的需求来选择接不接受

请求式:发送方不会主动广播自己的数据,只有收到接收方发出的请求,发送方才会发数据。

名称 引脚 双工 时钟 电平 设备 应用场景
UART TX、RX 全双工 异步 单端 点对点 两个设备互相通信
I2C SCL、SDA 半双工 同步 单端 多对多 一个主控外挂多个模块
SPI SCK、MOSI、MISO、SS 全双工 同步 单端 多对多 一个主控外挂多个模块(高速)
CAN CAN_H、CAN_L 半双工 异步 差分 多对多 多个主控互相通信

CAN硬件电路

1、每个设备(STM32)通过CAN收发器挂载到CAN总线网络上

2、CAN设备的TX,RX与CAN收发器相连,而CAN收发器上的CAN_H,CAN_L与总线的CAN收发器相连。(TX接TX,RX接RX,无需交叉)

3、高速CAN使用闭环网络,CAN_H和CAN_L两端添加120欧的终端电阻(速度快,传输距离短)

终端电阻的作用:防止回波反射,在高频和远距离传输时可以在电平跳变处使电平变化平滑。

在没有设备操作总线时,能够将两根差分线电压收紧(将两个电压拉至同一水平),代表默认状态1

4、低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2k欧的终端电阻(速度慢,传输距离远)

因为低俗不是闭环网络,使用终端电阻只有防止回拨反射的作用

CAN电平标准

两线电压差(CAN_H–CAN_L)传输数据位

高速CAN规定:

电压差为0V时表示逻辑1(隐性电平)

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

低速CAN规定:

电压差为-1.5V时表示逻辑1(隐性电平)

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

帧格式

帧类型 用途
数据帧 发送设备主动发送数据(广播式)
遥控帧 接收设备主动请求数据(请求式)
错误帧 某个设备检测出错误时向其他设备通知错误
过载帧 接收设备通知其尚未做好接收准备
帧间隔 用于将数据帧及遥控帧与前面的帧分离开

数据帧

标准格式(高位先行)

帧起始SOF(Start of Frame):必须以显性0开头

报文ID:标准格式为11位(如果有多个报文ID,则报文ID小的先发送,ID大的报文等待下一次总线空闲再重新发送,11位按照3/4/4来 分

RTR(Remote Transmission Request):远程请求标志位,占一位,数据帧必须为显性0,遥控帧必须为隐性1(若报文ID相同,则数据帧的优先级大于遥控帧)相当于判断是写入还是接收,数据帧相当于写入,遥控帧相当于接收

IDE(ID Extension) :ID扩展标志位,用于区分是标准格式还是扩展格式,标志格式固定为显性0,扩展格式固定为隐型1。

r0:保留位,一般也为0,因为一般在进行仲裁时,0的优先级更高,所以给0可以保证当前优先级高于扩展优先级。

DLC(Data Length Code):表示数据段的长度,占四位,若想发送八字节数据则DLC=1000。(范围为0~8字节)

Data:DLC指定几个字节,数据段就发送几个字节,

CRC:高效校验算法,对前面的所有位进行CRC运算,生成一个校验码,接收方接收到一个数据和校验码之后,也会调用CRC算法进行计算,看看校验位是否相同

CRC界定符:1位,必须是隐型电平1

ACK槽:当发送方发送完数据后会将总线拉成隐性1,此时如果接收方接收到数据则会将总线拉成显性0,此时发送方的ACK槽检测总线状态则能够判断是否有接收方接收数据。(允许被多个接收方拉开总线即显性0,因为一个报文消息可以被多个设备同时接受)

ACK界定符:1位,必须是隐型电平1,为了将总线控制权在ACK槽位作用时,进行控制权的交接而存在,(CRC界定符也是相同原理)

PS:(发送方每发送一位,接收方就立刻接收到这一位了,应答ACK结束之后,发送方的整个数据帧才结束,应答是夹在发送过程之中的)

EOF:发送7个隐性1,代表帧结束。

扩展格式:

SSR:虽然没用,但必须给隐性电平1,

遥控帧

遥控帧无数据段,RTR位隐性电平1,其他部分与数据帧相同

请求方发送遥控帧,遥控帧的ID表示要请求的数据,响应请求的一方,通过相同ID的数据帧反馈数据

错误帧

总线上所有的设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误”,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备。

错误标志:

主动错误标志为6个显性0(根据线与特性会破坏总线上的波形)

被动错误标志为6个隐性1(根据线与特性不会影响总线上的波形)

过载帧

当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失。

发送过载帧会破坏数据,发送方发现数据被损坏,则会选着从新在发送一次数据,这样就达到了延缓数据发送的速度。(若接收方想延迟接收,则接收方会在帧间隔的第一位拉开总线(显性0))

过载标志:只有6个显性0

帧间隔

将数据帧和遥控帧与前面的帧分离开(在发送完一个数据帧或遥控帧后,在开始下一个数据帧之前要先加入3位的帧间隔)

主动错误状态的帧间隔是3个隐性位1

被动错误状态:在3个隐性位的帧间隔后再加8个隐性位的延迟传送。

位填充

规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。(追加的填充位也被视为发送的电平)

例:发送10000011110 接收1000001111100 实际接收10000011110

作用:1、防止数据波形长时间不变化,导致接收方不能精确掌握数据采样时机。

2、标志错误帧和过载帧的特异性(因为错误帧和过载帧他们如果出现将会产生6位的错误标志或过载标志,可以很快的发现他们)

3、防止被误认为总线空闲状态(CAN总线规定,当总线出现11个隐性1后,即认为总线空闲)

PS:位填充规则仅适用于帧起始段~CRC校验段,不包括CRC界定符和后面的部分。

位同步

最开始时,挂载在CAN总线上的设备都默认位接收方,当某一个设备想要广播自己的数据之时,就变为接收方

CAN总线没有时钟线,所以总线上的所有设备通过约定的波特率来确定每一个数据位的时长。

发送方以约定的位时长每隔固定时间输出一个数据位

接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位

位时序

SS:如果数据的跳变沿刚好出现在SS段,则当前设备和波形达成同步,若跳变边沿不出现在SS段,则要调整波形的时序使跳变边沿正好出现在同步段。(Tq时间可以自己定义)

PTS:吸收网络上的物理延迟

PBS1、PBS2:确定采样点的位置,采样点会在PBS1、PBS2中间(若PBS1给长时间,PBS2给短时间则采样点靠后,若PBS1给短时间,PBS2给长时间则采样点靠前)

硬同步

每个设备都有一个位时序计时周期,当某个设备作为发送方时,其他设备接收到第一个帧起始位(SOF)下降沿(显性0)时,将将自己的位时序计时周期调到SS段开始,与发送方的周期保持同步。

硬同步只在帧的第一个下降沿(SOF)有效。

PS:经过硬同步后,若发送方和接收方的时钟没有误差,则后续的所有数据位的采样点毕然会对齐数据中心附近。

再同步

若发送方和接收方的时钟存在误差,随着时间的流逝,数据位边沿逐渐偏离SS段,则接收方根据再补偿宽度值(SJW),通知改变PBS1、PBS2的长度来调整同步。

PS:SJW = 1 ~4 Tq(再同步可以发生在第一个帧起始位SOF之后的任意一个数据位跳变边沿中),再同步发生在一个数据位的位时序当中(一个数据传输的时间),此时数据的真实值仍取PBS1、PBS2之 变当前数据的值,而下一个数据已经经过再同步对齐了数据中心。

补偿值由误差和SJW共同决定,若误差值小于SJW值,则补偿值取误差值。若误差值大于SJW值,则补偿值取SJW值。

波特率计算

波特率 = 1/一个数据位的时长= 1/(SS+PTS+PBS1+PBS2)

例如: SS = 1Tq, PTS = 3Tq, PBS1 = 3Tq,PBS2 = 3Tq Tq = 0.5us

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

PS:SS的数据是固定的,其他时序段数据是自己设置的。

仲裁

若多个设备再同一时间都产生波形,则此时实际的波形为所有波形“线与”,即:只要有一个设备拉开总线(显性0),总线成显性状态,只有当所有发生设备释放总线(隐性1),总线成隐性状态。

资源分配规则1-先占先得

若当前已经有设备在发送数据帧或遥控帧,则其他任何设备不能再发送数据帧和遥控帧,但能够发送错误帧或过载帧破坏当前数据。

任何设备检测到连续11个隐性电平1,则认为总线处于空闲状态,可以发送数据。

若总线处于活跃状态,其他设备想要发送数据,则必须等待总线重新变回空闲状态才能够发送。

资源分配规则2-非破坏性仲裁

一般出现在当一个数据发送完后,总线变为空闲状态,此时多个等待设备都检测到总线处于空闲状态都想发送数据,此时就要利用规则2。

CAN总线通过ID号(仲裁段)进行非破坏性仲裁,ID号小(优先级高)取得总线的控制权,可以发送数据,ID号低的继续等待。PS:仲裁段 = ID+RTR

实现非破坏性仲裁的要求:

1、线与特性:只要有一个设备拉开总线(显性0),总线成显性状态,只有当所有发生设备释放总线(隐性1),总线成隐性状态。

2、回读机制:每个设备发送一个数据位之后会回读当前总线的电平状态,若发出0,则回读必然还是0,若发出1,读回为0,则表明此时总线上还有其他设备在发送数据,则进行仲裁

PS:数据位从前到后依次比较,出现差异且数据位为1的设备仲裁失利,仲裁失利后的设备立即退出仲裁,转为接收设备(位填充虽然也会出现在仲裁段当中,但如果两个设备有5个完全相同的数据位,则他们的位填充位也相同,不影响仲裁,如果他们5个数据位不相同则早已分出仲裁,填充位也不影响)

错误处理

PS:位错误虽然类似于回读机制,但是在仲裁段和应答位进行回读时不被视为位错误。若出现错误处理,则这帧数据失效,总线回归空闲状态。

错误状态

刚开始所有设备都处于主动错误状态,若有设备在主动错误状态频繁报告错误,则将该设备转为被动错误状态,若该设备仍然频繁报告错误,则再降为总线关闭状态

TEC(Transmit Error Counter):发送错误计数器,设备在发送时,每发现一个错误,TEC+1,正常进行发送一次,TEC-1

REC(Receive Error Counter):接收错误计数器,设备在接收时,每发现一个错误,TEC+1,正常进行接收一次,TEC-1

ACK主动错误帧:6个主动错误标志位(显性0)+8个错误界定符(隐性1)(后续如果还想发数据,仍然要先发3位隐性1的帧间隔)

ACK被动错误帧:6个被动错误标志位(隐性1)+ 8个错误界定符(隐性1) + 3个帧间隔(隐性1)+ 8 位延迟传送(隐性1)

STM32 CAN外设

CAN_TX:配置为复用推挽输出

CAN_RX:配置位上拉输入

发送和接收控制器:当处于接收状态时,该控制器会将接收到的报文自动与你配置的过滤器进行比对,符合的报文就会存在接收FIFO中。(接收过滤器根据ID号来进行过滤)当我们想要发送数据时,我们只需要将报文的各个参数ID、DATA等数据写入到其中一个邮箱,再写一个请求发送的命令,该控制器就会帮我们自动发出。(可以配置发送邮箱的优先级,比如先请求的先发送或按照ID号的优先级发送)

FIFO(First in First on):先进先出寄存器,可以配置通过过滤器的报文进入哪个FIFO寄存器,

发送过程

RQCP:请求是否完成

TXOK:发送是否成功

TME:邮箱是否空置

ABRQ:是否终止发送

NART:禁止自动重传(0表示使用自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功。1表示禁止自动重传)

接收过程

FMP:报文数目

FOVR:FIFO溢出

RFOM:释放邮箱

PS:挂号_3和移除是同一个状态,他们释放一次邮箱后,都会转为挂号2状态。

发送和接收配置位

NART:禁止自动重传(0表示使用自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功。1表示禁止自动重传)

TXFP:发送优先级,置1,优先级按照先请求的先发送。置0,优先级按照报文标识符(ID)来决定。标识符值小的先发送(标识符相等时,邮箱号小的先发送)

RFLM:接收FIFO锁定模式,置1,接收FIFO锁定,FIFO溢出时,新收到的报文被丢弃。置0,FIFO溢出时,新收到的报文覆盖最后收到的报文。

标识符过滤器

列表模式:把想要过滤的ID直接写入到R1和R2寄存器的模式。(同时标识符过滤器也会判断报文的帧类型和格式类型是否匹配等。)

STID:标准ID

EXID:扩展ID

屏蔽模式:只规定ID号的某几位必须为固定值,其他位为任意值的模式。R1寄存器写入一个想要通过过滤的具体值,R2给固定值的对应位写1,给任意值对应位写0。(R2寄存器的IDE也必须给1,固定住R1寄存器的IDE值,防止从标准格式转换为扩展格式)

例:如果想要写入0x234,ID:R1[0 : 15] = 0x234 <<5

因为寄存器的映像STID是左对齐,而我们C语言中的赋值语句是右对齐,所以我们需要左移5位,低5位默认是0,表示数据帧,标准格式,如果想接收遥控帧可以移位后或上一个0x10,把RTR置1.

测试模式

工作模式

SLAK:睡眠确认状态位,SLAK=1,硬件已经进入睡眠模式,反之则否

INAK:初始化确认位,INAK=0,硬件没有进入初始化模式

PS:总线从正常模式进入睡眠模式时,我们给sleep位置1时不会立刻进入睡眠,要等ACK位置1,表示接收设备接收完成后才会进入睡眠模式。同时睡眠模式和初始化模式要进入正常模式也要等待SYNC即总线空闲时才能够转化为正常模式。

位时间特性

在STM32F103C8T6中CAN总线挂载在APB1总线上,APB总线的时间周期为1/32MHz,

中断

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐