嵌入式必备总线协议 UART、IIC、SPI、RS232、RS485、CAN

目录

一、通信基础

1.1 按照二进制位数据发送来分

1.2 按照数据传输方向来分

1.3 波特率

二、UART

2.1 UART数据帧格式

三、RS232、RS485(UART电气层的处理,本质是UART)

3.1 解决串口UART问题而生

3.2 RS232协议:串行通讯标准化,还对信号电平加以规定

3.3 RS232存在问题

3.4 RS485协议:可以一主多从(组网)比232传输距离远,抗干扰性强,兼容TTL

四、IIC总线

4.1 通信步骤过程

五、SPI总线

5.1 寻址方式

5.2 通信步骤流程

5.3 极性和相位

5.4 IIC跟SPI的异同

六、CAN总线

6.1 CAN总线特性

6.2 CAN电平标准

6.3 CAN的硬件电路

6.4 CAN协议层数据帧格式

一、通信基础

1111 1111 -> 0xff

1010 1010 -> 0xaa

同步:有同步时钟

异步:有波特率

1.1 按照二进制位数据发送来分

串行(相对并行慢):多个数据,利用 一条线 发送 (用的多)

并行(相对串行快):多个数据,利用 多条线 发送

1.2 按照数据传输方向来分

单工通信:单向;主机从机,区分发送器以及接收器;只可以发送器给接收器发送数据;

双工通信:双向-> 半双工:不能同时进行收发(数据线一根 IIC RS485)全双工:可以同时进行收发(数据线两根串口 SPI RS232)

1.3 波特率

例如:UART串口通信速度:dps(bit per second)每秒传送的二进制位的个数 不是byte不是字节 一个字节8个bit

二、UART

通用异步(波特率--时间)收发器,全双工,串行、异步通信总线

两线制(两根数据线 RX TX)、可以实现全双工的发送和接收

2.1 UART数据帧格式

空闲位是1 高电平 起始位1位发送0 低电平

数据位最好发8位发送0/1 5-8位先发低位后发高位

校验位1位发送0/1 奇偶校验 可有可无

停止位1位发送1 1-1.5-2位高电平

可以试想一下为什么数据位从低位开始发 因为低位永远是0

由于串口数据帧可以送到 5-8位 所以高位不一定是第八个数据

问题

UART如何区别 0011 和 01 和 000111 和 0000 1111呢 通过波特率来区别

因为串口收发没有同步时钟什么的 都是根据自己的波特率 如果一直累计误差 最终可能会收发错误

如何避免上述问题呢 主要是根据串口UART的发送机制 就是发一个数据要等一下 这样可以避免累计误差

三、RS232、RS485(UART电气层的处理,本质是UART)

3.1 解决串口UART问题而生

1)电气接口不统一:

UART只是对信号的时序进行了定义,没有定义接口的电气特性,没有连接器的标准;

也就是时序上我只是定义了高电平跟低电平 但是高电平是多少 低电平是多少 在每个板子 不同环境都有标准

2)抗干扰能力差:

TTL信号抗干扰能力差,容易出错

3)通信距离短:

一般只用用在一个电路板上两个芯片通信

3.2 RS232协议:串行通讯标准化,还对信号电平加以规定

全双工 串行 异步:编程跟UART一样

接口:9线制,但是真正用的一般来说只有三根线:TX、RX、GND

信号:逻辑 “1” 高电平为 -5V到-15V、逻辑 “0” 低电平为 5V到15V

3.3 RS232存在问题

1)接口信号电平高、容易烧坏接口、要加电平转化芯片 成本高

2)通信速度较低

3)共模干扰

4)传输距离短(15m)

5)只可以点对点 跟UART一样

3.4 RS485协议:可以一主多从(组网)比232传输距离远,抗干扰性强,兼容TTL

半双工 串行 异步:注意写程序跟RS232、UART串口不一样、 RS485发送就不能接收。

接口:两线制 485+、485- 可以有多个设备 只要地址不同 一般都是modbus协议什么的 你知道的

信号:差分信号:两线电压差 逻辑 “1” 高电平电压差为 2V到6V、逻辑 “0” 低电平电压差为 -2V到-6V

四、IIC总线

同步、串行、半双工、多主机总线、近距离、低速、芯片与芯片之间的通信;

接口:两线制:SDA数据线、SCL时钟线 成本低

可以挂载多设备、主机是使用总线权利者、从机只可以听取从机、被主机管理;

4.1 通信步骤过程

空闲都是高电平

1)主机发送起始信号启用总线 总线处于占用

2)主机发送一个字节byte数据指明从机地址和后续字节的传送方向 (寻址方式)

发送7位地址决定跟哪个从机通信

还有1位是数据的方向 0主机给从机 1从机给主机

一共8位bit 一个字节

3)被寻址的从机发送应答信号回应主机

提取出主机发送的一个字节的数据的高7位 查看是不是主机寻找自己回应主机

4)发送器发送一个字节的数据

此发送器由上述2)步骤的方向决定 很简单的理解

5)接收器发送应答信号回应发送器

此接收器由上述2)步骤的方向决定 很简单的理解

6)。。。重复步骤 4)5)可以发送任意多个字节 但是发送的第一个字节一定是步骤 2)

N)通信完成后主机发送停止信号释放总线 总线处于空闲

4.2 起始信号和终止信号

SCL为高电平时、SDA由高变低电平 表示 起始信号

SCL为高电平时、SDA由低变高电平 表示 停止信号

起始信号和停止信号都是由主机发出,起始信号发出总线处于占用,终止信号发出总线处于空闲

4.3 字节发送和应答

每个字节为8位长度,由于长度固定UART长度在5-8,所以从低位到高位发送;

而IIC发送字节长度固定 所以从高到低;

每个数据发送完一个字节数据之后 接收器必须发送1位应答位来回应发送器;所以一共是9位

4.4 同步信号

IIC在进行数据传送时,SCL低电平写;高电平是读

SCL为低电平期间,发送器向数据线发送一位数据时可以允许SDA信号变化

SCL为高电平期间,接收器向数据线读取一位数据时不可以允许SDA信号变化

五、SPI总线

同步、串行、全双工、主从方式工作、高速(对比UART IIC等);

接口:至少是四线制:MISO(主入从出)、MOSI(主出从入)、SCLK(时钟)、CS(片选)

外设一多、从机一多、主机就要用多根线(多加了片选线)、从机还是四根线

可以挂载多设备、主机是使用总线权利者、从机只可以听取从机、被主机管理;

5.1 寻址方式

当主设备需要和某个从设备进行通信时,

主设备需要先向对应从设备的片选线上发送使能信号(高电平或者低电平、根据从机而定)

表示选中从设备表示;(一般来说CS是高电平CS上面有一杠就是0,一般来说)

5.2 通信步骤流程

重点:

先发高位后发低位;

一定不需要应答,不用等应答,他也不会应答;跟IIC不同,IIC有应答

发完不用应答就可以立马发下一个;

没有起始信号也没有停止信号没有应答 只有数据发送 发完继续发

数据发送:当第一个时钟线上升沿或者下降沿时,发送器发送数据

数据接收:当第一个时钟线上升沿或者下降沿时,发送器接收数据

也就是只有有时钟沿,不在发就是在读,只不过第一个沿在发,下一个沿一定在读

换言之就是一个时钟周期可以进行收发一位bit数据,那么8个时钟周期就是一个字节byte了

注意一个时钟周期就是上升沿,下降沿一次

MSB是高位的意思 LSB是低位的意思

5.3 极性和相位

SPI总线有四种不同的工作方式,取决于极性CPOL跟相位CPHA

CPOL为SCLK空闲时的状态

CPOL=0;空闲时为低电平

CPOL=1;空闲时为高电平

CPHA表示采样时刻

CPHA=0;每个周期的第一个时钟沿采样

CPHA=1;每个周期的第二个时钟沿采样

所以有四种情况

补充:

时钟极性(CPOL)定义了SCLK在空闲状态时的电平。如果CPOL为0,表示SCLK在空闲状态下为低电平;如果CPOL为1,表示SCLK在空闲状态下为高电平。

时钟相位(CPHA)定义了数据采样和传输的时机。如果CPHA为0,表示数据在SCLK的上升沿进行采样,数据在SCLK的下降沿进行传输;如果CPHA为1,表示数据在SCLK的下降沿进行采样,数据在SCLK的上升沿进行传输。

至于四种模式的选择都是要根d据从机芯片手册的,要主机配置成一样的

5.4 IIC跟SPI的异同

相同点;

1)串行,同步方式

2)均采用TTL电平,传输的距离和应用场景类似

3)均采用主丛方式工作

不同点:

1)IIC为半双工、SPI为全双工

2)IIC有应答机制跟起始跟停止,SPI无应答

3)IIC寻址通过启用总线后第一个数据8位中的前七位地址来寻址,SPI通过向对应从机片选使能

4)IIC的时钟极性和时钟相位固定,时序有一种,SPI的时钟极性和时钟相位不固定,时序有四种

六、CAN总线

多数应用在汽车上、机器人控制,解决用IIC与UART、SPI这些导致数据量和速度不够的原因。

串行、异步、半双工、高速通信、多主机、每个设备可主动发送、具有错误检测、错误通知和错误恢复功能;

其实就是类485一样差分电压 串行 异步 半双工

6.1 CAN总线特性

can总线,控制器局域网总线

通信线(CAN_H、CAN_L)线路少,无需共地(其中例如IIC协议 由于是单端信号 必须共地)

ps:这边补充单端信号 例如SPI UART IIC 这些都是因为它们只通过一个导线来传输信息 类似485 CAN这些事差分信号 两根线共同传输数据 !

差分信号,抗干扰能力强

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

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

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

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

应答、CRC、位填空、错误处理、位同步、等等类似于485的应答差不多的

低速CAN通信速率在10-125Kbps;长度可达1000m、开环总线;ISO11519

高速CAN通信速率在125Kbps-1Mbps;长度<=40m、闭环总线;ISO11898 使用的多

6.2 CAN电平标准

高速CAN 0v 逻辑1 2v逻辑0

低速CAN -1.5V逻辑1 3V是逻辑0 其实类比于232很像 因为3-15 逻辑0 -3- -15逻辑1 小的就是逻辑1

6.3 CAN的硬件电路

其中加上终端电阻 原因有俩个

第一个作用防止回波反射 避免震荡 尤其是高频信号,远距离传输的场景 具体可见“传输线理论” 如果不加终端电阻 信号波形会在线路终端进行反射,进而干扰原始信号,电平转换的时候会发生震荡

第二个作用 在没有设备,将两根差分线进行收紧 也就是类比IIC 默认接上拉电阻相关特性一样 所以默认整个线路是1

开环跟闭环 也就是两根线H跟L是否开闭罢了。

闭环网络 总线两端闭合的终端电阻 更有利于总线快速回归隐形 这就是为什么高速CAN 发送数据快

且高速CAN 不进行任何操作 默认电平就是1 因为总线的默认状态就是1 因为总线加了终端电阻 类比IIC的上拉电阻

CAN使用差分电压 总线电平分为 显性电平0 跟 隐性电平1,一定是二者其一;跟485类似

显性电平0具有优先权、发送方通过总线使电平变化,发送数据。

6.4 CAN协议层数据帧格式

主要学习数据帧,用的也是最多的,最复杂。

总线默认电平为1 表示空闲 由于终端电阻

SOF 帧起始 1位: 数据帧起始位首先要变成0 先发送一个起始信号 (跟UART一样)

仲裁段:报文ID + RTR 11位+1位:表示后面数据的功能,总线上各种报文消息都有,没有报文ID就搞混了,还用于区分优先级,当多个设备同时发出时,根据仲裁规则,ID小的报文优先发送,ID大的报文等待下一次总线空闲重试发送。RTR暂居1位,在数据帧中必须是0,RTR的意思是远程请求标志位,用来区别数据帧还是遥控帧的,数据帧必须为显性0,遥控帧为隐形1,并且数据帧的优先级 大于 遥控帧 也就是我上面说的越小 优先级在先,其实跟IIC的前位为寻址 后1位为方向 ,并且不是对地址分配 是对报文消息分配,所以can对比IIC,同一个报文 可以被多个设备接收!

控制段:IDE + r0 + DLC 1位+1位+4位:IDE表示ID扩展标志位,用来区别标准格式还是扩展格式,标准格式为0,扩展格式为1, r0保留位 必须为0,这个目前没有太多实际意义,是考虑到这个协议的设计智慧的前瞻性和远见性,在未来升级迭代,后续还可以拓展很多用处,当时IDE其实是R1 ,没有实际意义,后来不够用了,就变成IDE了 用来扩展数据结构格式,可以跟IIC类比,就因为IIC没有前瞻性和远见性,所以IIC进行7位地址到10位地址进行升级的过程中,就是因为设计没有保留位,后面迫不得已把某些未分配的地址作为拓展的标志位,所以保留位的意义重大,DLC表示数据的长度,4位 ,如果是0001那就是一个字节 8个位(两个十六进制 一个十六进制是4位)

最大是1000 8字节 64个位 最小是0000 0个字节,为了后续的数据段的长度考虑的。

数据段 DATA 0-64字节:根据DLC来使用,DLC制定几个字节 数据段发送几个字节,

CRC校验码 15位+1位界定符:1位为界定为1才行

ACK段 1位+ 1位: 用来应答的,如果应答了存在那就是0,后续再释放变成1,后一位要变成1。

ACK槽的设计 是用来 可以给多个设备同时接收的,并不是发送方把完整的一段数据发送出去, 再接收应答的,而是发送方和接收方同时完成一整个波形,其实整个时序没结束,接收方就已 经完成数据的接收了,所以应答夹在发送过程之中的!!!!!!!!!

贞结束:7位:7个1位表示结束。

遥控帧:顺便说一下遥控帧吧,接收设备主动请求数据,也就是RTR选择为1而已,不用广播,太频繁了,如果有设备需要我就发给他数据。遥控帧请求数据的传输,也要数据帧的配合。一来一回的形式,适合那种用的不多的数据。

错误帧:发现数据有错,破坏数据,大家都别用了!

过载帧: 延缓发送,防止数据丢失

帧间隔:将数据帧和遥控帧与前面的帧分隔开,为主动错误和被动错误状态,别动状态位多些,表示设备不可靠!

  • 69
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7yewh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值