单片机常用通信协议(二)

补充IIC和SPI的异同

  • 相同点:
    1. 均采用串行、同步的方式
    1. 均采用TTL电平,传输距离和应用场景类似
    1. 均采用主从方式工作
  • 不同点:
    1. IIC为半双工,SPI为全全双公
    1. IIC有应答机制,SPI无应答机制
    1. IIC通过向总线广播从机地址来寻址,SPI通过向对应从机发送使能信号来寻址
    1. IIC的时钟极性和时钟相位固定,SPI的时钟极性和时钟相位可调

SPI传输快,不用发从机地址信号,不需要接收器应答。但是占用引脚比较多,每个从机都需要一个CS引脚。
IIC节省硬件资源,只要两根线即可进行通信。但是传输速度不快,需要发送从机地址信号以及接收器应答。
IIC的时钟极性和相位固定,SPI的时钟极性和相位是有四种方式可调的。

通信协议的对比

  1. UART只要用于两个设备之间点对点的通信。
  2. I2C主要用于一主多从通信(可多主),应用场景是单片机作为主控,外挂多个被动的传感器存储器模块设备。
  3. SPI主要用于一主多从通信,通信速率最快,可以轻松达到Mbps,比CAN总线还快,SPI主要应用于高速通信的场景。
  4. 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的硬件电路

  1. 个设备通过CAN收发器挂载在CAN总线网络上。单片机/CAN控制器--->CAN收发器--->CAN总线。
  2. CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连。
  3. 高速CAN使用闭环网络(因为CAN_H与CAN_L两端之间接了120Ω终端电阻形成了闭环回路),CAN_H和CAN_L两端添加120Ω的终端电阻。添加120Ω的终端电阻是为了:第一个,防止回波反射,高频信号和远距离传输,回波反射是不能忽略的问题。第二个,当总线上没有设备操作总线时,将两根传输线进行"收紧"使其电压一致。类似于上拉电阻,设备进行通信时,假如此时要发送数据1时,将原本数据线上的高电平状态拉低到低电平状态,当发送数据0时,将原本数据线进行释放不去操作数据线,线路默认由上拉电阻拉高置高电平。好处在于防止电平冲突,还可以实现"线与"的特性。
  4. 低速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是保持不动均为高电平。

数据包中的数据仅仅表示当前段数据有多少位,与逻辑无关。

  1. 帧起始(SOF)部分:数据起始帧,将逻辑从1变成0表示,数据的起始帧。也就是隐性电平变成显性电平。
  2. Identifier ID 报文ID部分,标准格式是11位。报文ID用于区分后面数据包的功能。根据仲裁规则还有优先级作用,当多个报文同时发送时,报文ID小的先发,报文ID大的后发。
  3. RTR部分,表示远程请求标志位,用于区分数据帧还是遥控帧的。数据帧必须位显性逻辑0,遥控帧必须为隐形逻辑1。这里是数据帧所以是逻辑0。
  4. 仲裁段,报文ID+RTR位,组成了仲裁段。仲裁主要靠ID实现,报文ID小的优先级高。RTR位加入的目的在于判断,相同报文ID的数据帧和遥控帧,数据帧的优先级大于遥控帧。
  5. 控制段,IDE+r0+DLC。IDE表示ID的扩展标志位,用于区分标准格式还是扩展格式。标准格式固定为显性逻辑0,扩展格式固定为隐性逻辑1(两种格式解析不同,需要区分)。r0表示保留位,目前没有用到,后续升级可用。默认为显性逻辑0。DLC表示数据段的长度,CAN总线一次性可以发送1~8字节,在数据包中就是通过DLC位进行指定,例如想发一个字节DLC就发0001,如果想法八个字节就发1000。
  6. 数据段,数据段的数据长度需要和前面DLC写入的位数进行对应。例如如果DLC写入一个字节0001,数据段就应该有8位数据。
  7. CRC段,数据校验位。对前面所有的数据进行校验,即从SOF到Data。算出一个校验码赋在CRC段处,有15位。
  8. CRC界定符,必须是隐性逻辑1电平。
  9. ACK段,由ACK槽和ACK界定符组成。ACK槽的作用就是应答,发送方将数据全部传输后,若是有接收方接收了数据,此时就把总线上的电平拉低,使电平变成显性逻辑0,若不存在接收方则继续保持总线高电平状态,此时电平变成隐性逻辑1。用此方法发送方即可得知数据是否有被接收到。ACK界定符的用途是为了配合CRC界定符,给接收方有充足的时间用来拉低总线电平变化。
  10. 扩展格式。扩展格式出现的原因是因为,报文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协议还未分享完,后续会继续分享,未完待续~

注意:本文章内容均来源于网络,如有异议请联系本作者

相关推荐
你怎么知道我是队长4 小时前
STM32CubeIDE V1.9.0下载资源链接
stm32·单片机·嵌入式硬件
曾哥嵌入式5 小时前
Stm32通过ESP8266 WiFi连接阿里云平台
stm32·嵌入式硬件·阿里云
Ronin-Lotus18 小时前
嵌入式硬件篇---手柄
嵌入式硬件·手柄
芯岭技术19 小时前
普冉PY32F002A单片机用LPTIM唤醒stop模式
单片机·嵌入式硬件
DIY机器人工房20 小时前
QT代码框架小案例:一个简单的时间类(Time)及其实例化程序,模拟了时间的设置、显示和自动流逝功能,类似一个简易电子时钟。
stm32·单片机·嵌入式硬件·嵌入式·diy机器人工房
bai5459361 天前
STM32 硬件I2C读写MPU6050
stm32·单片机·嵌入式硬件
LS_learner1 天前
6020角度双环控制一种用于电机控制的策略
嵌入式硬件
IT.小航1 天前
STM32F103RC的USB上拉电阻1.5K
stm32·单片机·嵌入式硬件
m0_555762901 天前
MCU 开发工具汇总
单片机·嵌入式硬件