补充IIC和SPI的异同
- 相同点:
-
- 均采用串行、同步的方式
-
- 均采用TTL电平,传输距离和应用场景类似
-
- 均采用主从方式工作
- 不同点:
-
- IIC为半双工,SPI为全全双公
-
- IIC有应答机制,SPI无应答机制
-
- IIC通过向总线广播从机地址来寻址,SPI通过向对应从机发送使能信号来寻址
-
- IIC的时钟极性和时钟相位固定,SPI的时钟极性和时钟相位可调
SPI传输快,不用发从机地址信号,不需要接收器应答。但是占用引脚比较多,每个从机都需要一个CS引脚。
IIC节省硬件资源,只要两根线即可进行通信。但是传输速度不快,需要发送从机地址信号以及接收器应答。
IIC的时钟极性和相位固定,SPI的时钟极性和相位是有四种方式可调的。
通信协议的对比
- UART只要用于两个设备之间点对点的通信。
- I2C主要用于一主多从通信(可多主),应用场景是单片机作为主控,外挂多个被动的传感器存储器模块设备。
- SPI主要用于一主多从通信,通信速率最快,可以轻松达到Mbps,比CAN总线还快,SPI主要应用于高速通信的场景。
- CAN可以实现多个主控的相互通信。
UART只能用于两个设备之间进行通信,通信数量有限;IIC和SPI用于一主多从,通信时只能有一个主机。如果想要实现5个10个STM32主控单片机进行通信,上述通信模式均难以满足,此时就需要使用CAN总线进行通信。
CAN总线(Controller Area Network Bus)控制器局域网总线
CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域
CAN总线特征:
- 两根通信线(CAN_H、CAN_L),线路少
- 差分信号通信,抗干扰能力强
- 高速CAN(ISO11898):125k~1Mbps, <40m
- 低速CAN(ISO11519):10k~125kbps, <1km
- 异步,无需时钟线,通信速率由设备各自约定
- 半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序
- 11位/29位报文ID,用于区分消息功能,同时决定优先级
- 可配置1~8字节的有效载荷(一次性最多可以发送8字节)
- 可实现广播式和请求式两种传输方式
- 应答、CRC校验、位填充、位同步、错误处理等特性
1、CAN的硬件电路
- 个设备通过CAN收发器挂载在CAN总线网络上。单片机/CAN控制器--->CAN收发器--->CAN总线。
- CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连。
- 高速CAN使用闭环网络(因为CAN_H与CAN_L两端之间接了120Ω终端电阻形成了闭环回路),CAN_H和CAN_L两端添加120Ω的终端电阻。添加120Ω的终端电阻是为了:第一个,防止回波反射,高频信号和远距离传输,回波反射是不能忽略的问题。第二个,当总线上没有设备操作总线时,将两根传输线进行"收紧"使其电压一致。类似于上拉电阻,设备进行通信时,假如此时要发送数据1时,将原本数据线上的高电平状态拉低到低电平状态,当发送数据0时,将原本数据线进行释放不去操作数据线,线路默认由上拉电阻拉高置高电平。好处在于防止电平冲突,还可以实现"线与"的特性。
- 低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻。电阻的一段接入到总线,另一端保持悬空,此时这个电阻的作用是防止回波反射。
2、CAN的电平标准
CAN总线采用差分信号,即两线电压差(VCAN_H-VCAN_L)传输数据位
高速CAN规定:
- 电压差为0V时表示逻辑1 (隐性电平)
- 电压差为2V时表示逻辑0 (显性电平)
因为CAN_H和CAN_L的默认电平状态就是高电平,高电平在逻辑中表示的是1,但表示高电平逻辑为1时,CAN_H和CAN_L两端的电压差又没有任何的变化(相减为0V),所以被称为隐性电平,逻辑为1。逻辑0,显性电平相反。
低速CAN规定:
- 电压差为-1.5V时表示逻辑1 (隐性电平)
- 电压差为3V时表示逻辑0 (显性电平)
3、CAN的总线帧格式
CAN总线分为5种类型的帧格式,如下图所示。
主要学习数据帧即可,发送数据用的就是数据帧,其他数据帧了解即可。
4、数据帧
图中有三种色块:灰色色块D表示此时逻辑为0,CAN_H和CAN_L是一定被拉动的。紫色色块D/R表示此时可以是逻辑1也可以是逻辑0,根据数据位进行。白色色块R表示此时的逻辑为1,CAN_H和CAN_L是保持不动均为高电平。
数据包中的数据仅仅表示当前段数据有多少位,与逻辑无关。
- 帧起始(SOF)部分:数据起始帧,将逻辑从1变成0表示,数据的起始帧。也就是隐性电平变成显性电平。
- Identifier ID 报文ID部分,标准格式是11位。报文ID用于区分后面数据包的功能。根据仲裁规则还有优先级作用,当多个报文同时发送时,报文ID小的先发,报文ID大的后发。
- RTR部分,表示远程请求标志位,用于区分数据帧还是遥控帧的。数据帧必须位显性逻辑0,遥控帧必须为隐形逻辑1。这里是数据帧所以是逻辑0。
- 仲裁段,报文ID+RTR位,组成了仲裁段。仲裁主要靠ID实现,报文ID小的优先级高。RTR位加入的目的在于判断,相同报文ID的数据帧和遥控帧,数据帧的优先级大于遥控帧。
- 控制段,IDE+r0+DLC。IDE表示ID的扩展标志位,用于区分标准格式还是扩展格式。标准格式固定为显性逻辑0,扩展格式固定为隐性逻辑1(两种格式解析不同,需要区分)。r0表示保留位,目前没有用到,后续升级可用。默认为显性逻辑0。DLC表示数据段的长度,CAN总线一次性可以发送1~8字节,在数据包中就是通过DLC位进行指定,例如想发一个字节DLC就发0001,如果想法八个字节就发1000。
- 数据段,数据段的数据长度需要和前面DLC写入的位数进行对应。例如如果DLC写入一个字节0001,数据段就应该有8位数据。
- CRC段,数据校验位。对前面所有的数据进行校验,即从SOF到Data。算出一个校验码赋在CRC段处,有15位。
- CRC界定符,必须是隐性逻辑1电平。
- ACK段,由ACK槽和ACK界定符组成。ACK槽的作用就是应答,发送方将数据全部传输后,若是有接收方接收了数据,此时就把总线上的电平拉低,使电平变成显性逻辑0,若不存在接收方则继续保持总线高电平状态,此时电平变成隐性逻辑1。用此方法发送方即可得知数据是否有被接收到。ACK界定符的用途是为了配合CRC界定符,给接收方有充足的时间用来拉低总线电平变化。
- 扩展格式。扩展格式出现的原因是因为,报文ID不够用了,需要进行扩充。扩展格式是基于标准格式上的增加,增加了额外的18位Identifier(ID),再增加了SRR,r1,r0其他与标准格式相同。SRR是替代标准格式此处对应的RTR部分,SRR需要给默认的隐性电平1。下一位IDE的作用与标准格式相同,隐性逻辑1表示数据包使用的是扩展格式,显性逻辑0表示数据包使用的是标准格式。后续新增18位ID,RTR,r1,r0作用相同。
(5)遥控帧
- 遥控帧无数据段,RTR为隐性逻辑1,其他部分与数据帧相同。
- 使用情况为,接收方需要某个报文ID的数据,先在总线发送一个遥控帧。拥有此报文ID的发送方再发送一个数据帧,接收方此时就可以接收到相应的数据。
- CAN协议还未分享完,后续会继续分享,未完待续~
注意:本文章内容均来源于网络,如有异议请联系本作者