总结放前面:
UART:UART总线是一种串行和异步、全双工的通信协议,通过两条线路(TX、RX)传输数据。UART总线的主要优点在于其简单性和通用性,可广泛应用于各种嵌入式系统。
UART总线采用异步通信模式,不需要额外的同步时钟信号,从而降低了系统的复杂性。
然而,UART总线的通信速度相对较慢,并且有严格的时序要求,要求双方就传输的波特率等参数达成一致。
特点:通信速度相对较慢,通信也比较简单,单对单。
I2C:I2C总线双向、双线(SCL、SDA)串行、同步、半双工、多主接口标准,具有总线仲裁机制。
I2C总线通过两条线实现数据传输和设备控制,大大简化了系统的布线。支持多个设备在同一总线上通信,每个设备都有一个唯一的地址,可用于识别和控制不同的设备。
虽然I2C总线的通信速度不如SPI总线快,但它仍然可以满足大多数应用的需求,特别是在低速短程数据通信中表现良好。
此外,I2C总线还支持多主控功能,这意味着任何能够发送和接收的设备都可以成为主设备,从而提高了系统的灵活性和可靠性。
特点:用户想要连接多个设备而不是过于复杂,I2C 将是理想的选择,因为它最多可以连接 127 个设备并且易于管理, i2c接口多用于和传感器的通信,例如触摸屏、计步器、温度传感器等。
SPI:SPI总线是一种高速、串行、全双工、同步的通信协议,能够通过至少四条线(包括MISO、MOSI、SCLK和CS)进行数据传输。
SPI总线的主要优点在于其高速通信能力,可以支持几Mbps到几十Mbps的数据传输速率,使其非常适合产品内部组件之间的高速数据通信,如大容量存储器的数据传输。
此外,SPI总线还具有主设备和从设备之间的全双工通信能力,以及通过芯片选择信号(CS)控制多个从设备。然而,SPI总线具有严格的时序要求,需要额外的信号线来支持同步时钟和芯片选择功能。
特点:通信速度快,多用于对速率要求高一些的场景,如spi flash、spi lcd屏、SD卡等。
一、UART
1.1 通用异步收发器(Universal Asynchronous Receiver/Transmitter:UART)
通用异步接收传输,是一种串行、异步、全双工的通信协议。
单片机中的UART有4个pin(VCC, GND, RX, TX), 用的TTL电平

- UART 没有时钟线,使用两条数据线进行设备通信,每个设备上都有一个 RX 引脚和一个 TX 引脚(RX 用于接收,TX 用于传输), RX 引脚连接到另一个设备的 TX 引脚;
- 由于 UART 没有时钟线,因此添加了起始位和停止位以表示数据的开始和结束;
- 两个通信设备间必须以大致相同的波特率(误差不超过10%)运行,否则就可能操作数据错乱;
- 异步通信以一个字符为传输单位,通信中两个相邻字符之间的时间间隔是不固定,但同一字符中相邻两个位之间的时间间隔是固定的。
1.2 通讯数据格式
空闲:空闲时总线为高电平,通常软件上把数据线配置为推挽、上拉;
起始位:主设备发送一个逻辑“0”信号表示传输字符的开始;
数据位:数据位可以是5~9位组成的一个字符(通常为8位),从最低位开始传输;
校验位:通常我们设置为无奇偶检验位;
- 奇校验:如果数据位中“1”的个数为偶数,则校验位为“1”,为奇数,则校验位为‘0’;
- 偶校验:如果数据位中“1”的个数为偶数,则校验位为“0”,为奇数,则校验位为“1”;
停止位:可以是 1 、1.5 位或 2 位的逻辑“1”电平,由于同一字符间相邻位的传输时间是固定的,每个设备uart都有自己的时钟,在通信中两个设备之间很可能会出现一点不同步,所以停止位不仅表示传输结束,还能提供纠正时钟的作用,停止位越多,数据传输越稳定,但数据传输速度越慢。
1.3 UART与USART的区别
通用同步/异步接收器/发送USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)
USART是一个全双工、通用同步/异步、串行收发模块,该接口是一个高度灵活的串行通信设备。
可以说和uart是包含关系,uart有的功能usart都有(异步功能模式),usart可以工作在异步和同步模式下。
在同步模式下,有自己的时钟线(可主机时钟同步,也可从机时钟同步),此时接收端不需要知道发送端的波特率,数据是以帧的形式传输的,传输速率比uart高。
UART的协议结构很简单,而USART 更为复杂,可以生成与许多不同标准协议相对应的形式的数据,例如 IrDA、LIN、智能卡、RS-485 接口的驱动程序启用和 Modbus 等。
1.4 关于TTL电平标准
TTL电平(Transistor-Transistor Logic)
TTL电平标准:
- 输出 L: <0.8V ; H:>2.4V。
- 输入 L: <1.2V ; H:>2.0V
TTL电平与RS-232区别:
RS232电平, 它是负逻辑电平,它定义+5~+12V为低电平“0”,而-12~-5V为高电平“1”
TTL电平,该电平的逻辑“1”为+5V,逻辑“0”为0V,称为TTL。
* 注意的是RS-232与TTL只是一种电平标准,而COM口和UART口是物理接口,只是COM口肯定使用RS-232标准,而UART一般使用TTL标准。
USB转TTL:
现在电脑使用的基本都是USB接口,而单片机使用的是TTL标准,那么在嵌入式中我们需要上位机通信,这时候便需要一个转换芯片,从而使得电脑(主机)可以通过USB输出TTL电平 ,这便是USB转TTL,我们所已知的CH340G、CH340E、PL2303 、CP2102 等等 ,都是USB转TTL串口的芯片 。
现在普遍使用的为CH340G主要是因为其安全,耐用并且便宜 满足我们日常的正常使用
在接线时注意单片机RX接转接板TX、TX接转接板RX。
USB转串口(RS-232):
我们知道单片机是UATR接口 TTL电平标准,而电脑是USB口 如果我们想用电脑的USB口与单片机串口(COM口)通信,这时就需要使用MAX232之类的电平转换芯片,将单片机TTL电平转换成RS-232电平 ,并且将USB转换为RS-232电平 这就是USB转串口
我们所说的USB转串口,就是指单片机上装了一个TTL转RS-232的转换芯片,并且有COM口,使得单片机可以输出RS-232电平,这样便可以通过 USB转串口(RS-232)模块连接电脑USB口,再与单片机COM口相连,双方都是RS-232电平标准,便可以来进行通信。
市场出售的usb转串口线一般会有两个芯片,一个是CH340这类芯片,一个是MAX232类芯片,因为计算机的串口电平标准是RS232电平
所以通过 USB转串口(RS-232)模块 USB经过CH340转成了TTL串口,中间那四个引脚可以引出,再经由MAX232转换为RS-232电平,9针串口引出。
下方为USB转串口(RS-232)模块

二、I2C
之前我写的 但是又忘了 再引用一下子:IIC(Inter-Integrated Circuit)-CSDN博客
2.1 I2C(内部集成电路)
接口有2条线,分别是SCL(串行时钟线)和SDA(串行数据线)。SCL用作数据的同步传输,一般由主设备提供给从设备;另外,由于数据线只有一条;因此,它是个串行、同步、半双工的通信接口。
- I2C支持多主、多从;任何设备都可以同时作为主从,但同时只能有一个主控,一个I2C控制器可以支持挂多个I2C从机设备,其中每个从机的设备地址都是不一样的,以便I2C主控制器访问到该设备;
- 硬件I2C的SCL和SDA接口电路必须外接上拉电阻,空闲时,两条线都为高电平;
- 起始、停止信号都是由主机端发出的,在起始信号产生后,总线就处于被占用的状态;在停止信号产生后,总线就处于空闲状态;
- I2C总线以一个字节(8bit)为单位传输数据,每传输一个字节时,必须得到数据接收方的应答信号,数据都是从最高有效位开始传输,
- I2C的每次通信都是由主设备发起的,在这个过程中,发起端扮演了两个角色,当处于应答时段发起端扮演从端,其余时间都扮演主端;
- 主设备每次发送数据和读写位时,都会等待从设备的响应信号ACK。
2.2 通信协议格式


空闲态:SCL和SDA线均为高电平,处于空闲状态;
起始信号:当SCL为高电平期间,SDA由高到低电平的跳变(启动信号是一种电平跳变时序信号,而不是一个电平信号);
地址位:由7位或者10位组成,主设备端发送从设备的设备地址;
读写位:逻辑“0”表示主向从写操作,逻辑“1”表示主向从读操作;
应答位:从设备通过将SDA线拉为低电平来表示ACK(有效应答)成功,SDA被拉高表示NACK(无效应答);
数据位:一个字节代表一个数据,SCL为高电平的时候读取SDA的有效数据,每字节数据后都需要接收从设备的应答,检测是否接收成功;
停止信号:当SCL为高电平期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。
2.3 工作过程
在空闲状态的时候,主设备向从设备发送起始信号,告诉从设备将要开始i2c通信了;
发送完起始信号后,接着发送需要通信的从设备的设备地址,该i2c控制器下的每个从设备对比该设备地址,比对不正确的忽略此次通信,匹配成功的继续通信;
接着主设备发送读写位,主设备释放总线,并等待从设备的应答信号,发起端接收到应答信号后,从设备就会释放总线控制,总线控制权归还给发起端;
写操作:
发送需要操作的从设备寄存器地址 + 写入寄存器的值;
读操作:
相对写操作会复杂些,写入需要读的从设备寄存器地址,等待从设备的应答后,主设备重新向从设备发送起始信号 + 从设备地址 ,并将读写位设备为读,等待从设备应答,最后就会开始接收从设备发送过来的数据,直到停止信号发生。
2.4 工作模式
除超快速模式外,其它都是可以向后兼容的,也就是说快速模式设备向后兼容,可以与 0 至 100 kbit/s I2C 总线系统的标准模式设备通信,然而,由于标准模式设备不向上兼容,它们不能在快速 I2C 总线系统中运行。

2.5. I2C死锁问题
发生死锁的常见情况有两种:
① 从设备回复ACK时主设备异常复位;
② 从设备回复数据位为0时,主设备异常复位。
两者的共同点就是SDA在主设备异常复位时,处于被从设备拉为低电平的状态,而SCL在主设备复位后处于空闲状态(高电平)。此时从设备会等待主设备拉低SCL取ACK或数据位,主设备会等待从设备释放SDA线。主设备和从设备互相等待,进入死锁状态。
解决死锁问题的可尝试方法:
主设备检测到SDA拉低超过一段时间后,主动复位从设备并释放SDA线。这种方法的前提是从设备有复位引脚,MCU可以控制从设备的复位引脚对其进行复位。
主设备检测到SDA拉低超过一段时间后,将9个时钟信号推入时钟总线(即接收应答信号),然后取出从设备的ACK位,使从设备释放SDA到高电平。
在主设备和从设备之间串联一个 I2C 缓冲器,可以自动检测死锁情况。当检测到死锁时,会主动断开与主设备的连接,并向从设备发送9个时钟信号,从设备释放SDA线后,会重新与主设备建立连接。
I2C死锁问题无法从根本上避免。除了MCU异常复位导致I2C死锁外,正常通信过程中从设备也可能异常拉低SDA导致死锁。因此,软件应该设计成当死锁发生时能够从死锁中恢复,这样I2C通信才能继续进行。
三、SPI
3.1 SPI 串行外设接口(Serial Peripheral Interface)
它是由摩托罗拉开发的一种串行、同步、全双工的通信协议,可以同时发送和接收数据,发送的数据先发到发送数据缓存区中,然后再到移位寄存器中按位传送,数据都是以字节为单位,高位优先发送。

① SPI 总线总共有 4 条线:
- MOSI :主设备数据输出,从设备数据输入;
- MISO :主设备数据输入,从设备数据输出;
- SCLK: 主设备产生的时钟信号;
- CS/SS:(Chip select)由master设备控制,选择与哪个SPI从设备通信;通常设为低电平表示使能该从设备;
② 支持一主多从,一个主设备控制多个从设备,通常配置为每个从设备对应一条CS线,通过拉低CS信号,选择需要通信的从设备,如果同时将两个SS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码;
③ 在一个时钟周期内,SPI 设备会进行1 bit 数据的发送和接收,其实就是主从间数据交换的过程,在数据传输的过程中,接收到的数据必须在下一次数据传输之前被采样,如果之前接收到的数据没有被采样,那么之前的数据就会被覆盖掉,丢失。
④ 主、从设备必须工作在同一模式下。
3.2 CPOL 和 CPHA
①CPOL(Clock Polarity,时钟极性)
当主从机没有数据传输的时候即空闲状态,SCL 线的电平状态。
- 假如空闲状态是高电平,CPOL=1;
- 若空闲状态时低电平,那么 CPOL = 0。
②CPHA(Clock Phase,时钟相位)。
实质指的是数据的采样时刻,CPHA = 0 的情况就表示数据的采样是从第 1 个边沿信号上即奇数边沿,具体是上升沿还是下降沿的问题,是由 CPOL 决定的。这里就存在一个问题:当开始传输第一个 bit 的时候,第 1 个时钟边沿就采集该数据了,那数据是什么时候输出来的呢?那么就有两种情况:
一是 CS 使能的边沿
二是上一帧数据的最后一个时钟沿
CPHA=1 的情况就是表示数据采样是从第 2 个边沿即偶数边沿,它的边沿极性要注意一点,不是和上面 CPHA=0 一样的边沿情况。前面的是奇数边沿采样数据,从 SCL 空闲状态的直接跳变,空闲状态是高电平,那么它就是下降沿,反之就是上升沿。由于 CPHA=1 是偶数边沿采样,所以需要根据偶数边沿判断,假如第一个边沿即奇数边沿是下降沿,那么偶数边沿的边沿极性就是上升沿。
同步通信时,数据的变化和采样都是在时钟边沿上进行的,每一个时钟周期都会有上升沿和下降沿两个边沿,那么数据的变化和采样就分别安排在两个不同的边沿,由于数据在产生和到它稳定是需要一定的时间,那么假如我们在第 1 个边沿信号把数据输出了,从机只能从第 2 个边沿信号去采样这个数据。

3.3 四种工作模式
SPI通信时钟信号是由主设备产生的,其工作模式就涉及到时钟极性(CKP/CPOL)和时钟相位(CKE/CPHA)了,时钟极性和时钟相位共同决定SPI读取数据的模式;
时钟极性:设为“0”表示空闲状态时钟为低电平,
设为“1”表示空闲状态时钟为高电平;
时钟相位:设为"0"表示在时钟信号的第一个跳变沿采样,
设为"1"表示在时钟信号的第二个跳变沿采样;
要理解这四个工作模式,你必须要知道的一点就是,SPI通信传输过程其实就是主、从设备数据交换的一个过程,MOSI 和 MISO在一个时钟周期内都会进行数据位的发送和接收,如果不需要接收的数据,直接忽略就可以了,不做处理。
①模式0 (CPOL = 0,CPHA = 0)
在空闲状态下,SCLK处于低电平,在第1个时钟边沿进行数据采样。SCLK由低电平到高电平的跳变进行数据采样(第一个跳变沿采样),采样完在下一个跳变沿发送数据。

②模式1 (CPOL = 0,CPHA = 1)
在空闲状态下,SCLK处于低电平,在第2个时钟边沿进行数据采样,第一个时钟沿进行发送数据。

③模式2 (CPOL = 1,CPHA = 0)
在空闲状态下,SCLK处于高电平,在第1个时钟边沿进行数据采样。SCLK由高电平到低电平的跳变进行数据采样(第一个跳变沿采样),采样完在下一个跳变沿发送数据。

④模式3 (CPOL = 1,CPHA = 1)
在空闲状态下,SCLK处于高电平,在第2个时钟边沿进行数据采样,第一个时钟沿进行发送数据。


四、Modbus
4.1 Modbus简介
Modbus诞生于1979年 莫迪康公司 后来被施耐德电气公司收购。Modbus提供通用语言用于彼此通信的设备和设备。
Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用最广泛的协议,Modbus就是一个总线通信协议,像IIC SPI这种,但是他不依赖于硬件总线。优点有以下几点:
- Modbus协议标准开放、公开发表且无版权要求
- Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等
- Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络
举个例子:IIC通信需要在物理上连接iic总线,然后加上拉电阻,规定好物理层的高低电平。而Modbus协议是一种应用层报文传输协议,协议本身并没有定义物理层,定义了控制器能够认识和使用的消息结构,不管它们是经过何种网络进行通信的。 所以能够适应多种电气接口,因此使用非常广泛。
4.2 通信过程
Modbus是一主多从的通信协议
Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从站处理信息和使用Modbus将其数据发送给主站。
也就是说,不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。
从机不会自己发送消息给主站,只能回复从主机发送的消息请求。

Modbus没有忙机制判断,比如,主机给从机发送命令, 从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。
就好比老师和你打电话,老师拨通了你的电话号,然后老师跟你说,我这里需要你给我发东西,发的内容是上周的一周总结,你说好的,然后打开你电脑的文件夹,把你的周报发给老师,这就是一个通信过程。
扩展
同步通信和异步通信
同步通信和异步通信的区别是:时钟线的有无。同步通信有时钟线,收发双方通过统一的时钟来频率确定何时进行数据的传输,如I2C和SPI。异步通信没有时钟线,可以任意时刻开始发送字符 但只能在数据的开始和尾加入标志位来区分不同的数据帧,即加上开始位和停止位,所传送的数据以字节为单位。每个字节前加上一位起始位,每个字节的后面加上停止位,接收数据之前也要预先知道波特率的大小,传输效率比同步通信要低。如UART 但方便简单,易于操作
简单来说:
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
串行通信与并行通信
串行通信就是一根数据线,数据是一位一位的依次传输
而并行通信则是8跟数据线,数据是一个字节一个字节的发送
串口形容一下就是一条车道,而并口就是有8/16个车道同一时刻能传送8/16位(一个字节/两个字节)数据。

6952

被折叠的 条评论
为什么被折叠?



