关于UART、SPI、I2C通信接口解析

网友投稿 370 2022-11-22

关于UART、SPI、I2C通信接口解析

1、UART几个相关的概念

COM口是PC(个人计算机)上,异步串行通信口的简写。在PC等操作系统上,COM口区别于USB、SATA接口的串行接口,定义了在操作系统中的规范。由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口均为RS232。若配有多个异步串行通信口,则分别称为COM1、COM2等等,但由于串口(COM)不支持热插拔及传输速率较低,目前部分新主板和大部分便携电脑已开始取消该接口。目前串口多用于工控和测量设备以及部分通信设备中。

我们常说的串口,是指使用RS232标准进行传输的UART接口(9针)。

2、UART通讯需要配置的参数

1)波特率

波特率部分文章参考,DigCore:嵌入式硬件通信接口协议-UART(一)协议基础

在各类MCU的UART配置中,常用的波特率值有:4800Bd、9600Bd、19200Bd、115200Bd,单位Bd。

在百度百科的词条介绍中

调制速率,指的是有效数据信号调制载波的速率,即单位时间内载波调制状态变化的次数。它是对符号传输速率的一种度量,1波特即指每秒传输1个符号,而通过不同的调制方式,可以在一个码元符号上负载多个bit位信息。单位“波特”本身就已经是代表每秒的调制数,以“波特每秒”(Baud per second)为单位是一种常见的错误。 它代表的是信号的变化,而不是传输数据的多少。它表示每秒钟内通信线路状态改变的次数。如果数据不压缩,波特等于每秒钟传输的数据位数,如果数据进行了压缩。那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒有时会产生错误。

但是在现代的实际使用中,多数情况下,配置了MCU的波特率后,对输出信号进行观测发现,此时波特率就等于比特率。也正是因为此时传输的符号即8bit一个Byte的数据量,从而波特率等于比特率。

比如抓到波形116us/bit, 直接转换得:1bit/116us = 1 bit/(116/1000000)s = 8620.68 bit/s,此时配置串口助手的波特率,利用串口助手模块与被测信号管脚进行连接,即可实现串口数据的抓取。

2)数据格式

起始位:数据线空闲状态为高电平,要发送数据时将其拉低一个时钟周期表示起始位。

数据位:使用校验位时,数据位可以有5~8位;如果不使用校验位,数据位可以达9位。

校验位:奇偶校验,保证包括校验位和数据位在内的所有位中1的个数为奇数或偶数。

停止位:为了表示数据包发送的结束,发送端需要将信号线从低电平变为高电平,并至少保持2个时钟周期。

3)流控制

流控制,俗话说就是“握手”。流控制的作用,在不同处理性能的设备之间,数据传输之前,接收方会以“流控制”来通知发送方,是否可以继续进行接下来的数据传输。这样的应用场景多见于计算机与低性能的微控制器通信,也可见于PC与打印机之间进行的数据传输,该特点都是接收方的接收缓存已满或处理事务较慢时,从而需要流控制来告知发送方稍后再发送。

流控制的方式分别有软件和硬件两种。

软件的流控制方式,在UART通信中,只需RxD、TxD、GND三根即可,数据在传输过程中,依靠代码的判断处理,并通过收发双方进行的数据交互完成控制,在现有通信物理信号线基础上,使用控制字符(ASCII表中的0x00~0x0x1F、0x7F)完成控制指令的交互。一般在私有协议下也会定义一些特殊字符设为控制指令。

3、UART的优缺点

1)优点 只使用两根电线,不需要时钟信号。有一个奇偶校验位,只要双方设置后,就可以改变数据包的结构

2)缺点 数据帧的大小限制为最多9位,不支持多个从属或多个主系统,每个UART的波特率必须在10%之内

二、SPI

SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。

1、SPI使用的四根信号线

SCLK: Serial Clock (output from master):串行时钟,用来同步数据传输,由主机输出;

MOSI SIMO: Master Output, Slave Input(output from master):主机输出从机输入数据线,通常先传输MSB;

MISO SOMI: Master Input, Slave Output(output from slave):主机输入从机输出数据线,通常先传输LSB;

SS: Slave Select (active low, output from master):片选线,低电平有效,由主机输出。

SSCS:控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(一般默认为低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。也就是说:当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低。

2、SPI的四种操作模式

SPI的四种操作模式,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还低)。

Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成了时钟信号(Clock Signal) ,每种模式由时钟信号中的时钟极性(clock polarity)CPOL与时钟周期(clock phase)CPHA来定义。

不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的,但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,从而实现主从通讯。

时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态;时钟相位CPHA是用来配置数据采样是在第几个边沿。

CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时;

CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时;

CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿;

CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿。

在高电平有效状态时,第一边沿为上升沿,第二边沿为下降沿;在低电平有效状态时,第一边沿为下降沿,第二边沿为上升沿

具体四种模式如下:

CPOL = 0,CPHA = 0:时钟高电平时为有效状态,时钟上升沿(第一个边沿)采样。

CPOL = 0,CPHA = 1:时钟高电平时为有效状态,时钟下降沿(第二个边沿)采样。

CPOL = 1,CPHA = 0:时钟低电平时为有效状态,时钟下降沿(第一个边沿)采样。

CPOL = 1,CPHA = 1:时钟低电平时为有效状态,时钟上升沿(第二个边沿)采样。

3、SPI的数据交换

参考文章,不撑了不撑了:SPI通信协议介绍

SPI可分为主、从两种模式,并且支持全双工模式,所以这也就导致STM32的SPI接口比较复杂。比如:配置SPI为主模式、配置SPI为从模式、配置SPI为单工通信、配置SPI为双工通信等等。

在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备还是从设备),相当于该设备有一个 bit 大小的数据被交换了。

1)主从机的选择:

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave)。一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock,没有 Clock 则 Slave 设备不能正常工作。

2)数据交换的流程:

参考文章:曾小庆:SPI通信协议详解(spi总线)

主机和从机都有一个串行移位寄存器(SSPSR) 。它的主要作用是根据 SPI 时钟信号状态,往 SSPBUF 里移入或者移出数据,每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定。Bus-Width 的作用是指定地址总线到 Master(主)设备之间数据传输的单位。Channel-Width 的作用是指定 Master(主)设备与 Slave(从)设备之间数据传输的单位。

主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。串行移位寄存器通过MOSI信号线将字节传送给从机,同时从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

SPI的时序其实很简单,主要是在SCLK的控制下,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。

假设主机的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候,主机将会通过MOSI信号线传输给从机最高位1,自身寄存器变成0101010x。同时,MISO信号线会从从机处返回一个数据给主机,那么这时寄存器为0101010MISO,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个SPI时序。

主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。也就是说,当上升沿主机发送数据的时候,从机也发送了数据。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。

3)SPI的传输速率:

参考文章;王超:一文看懂SPI协议

SCLK的速率就是SPI的传输速率,SPI协议没有一个固定的速率,不像I2C标准模式100K,快速模式400K,高速模式3.4M,SPI的传输速率取决于器件本身支持多高的速率。最初的标准定义总线速度为100kbps。经历几次修订,主要是1995年的400kbps,1998的3.4Mbps。

4)SPI的传输的特点:

参考文章:对三种总线SPI、UART、I2C分析理解 - 接口/总线/驱动 - 网

主从设备必须使用相同的工作参数——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个从设备,并且它们使用了不同的工作参数,那么主设备必须在读写不同从设备间重新配置这些参数。

参考文章: 华清远见:史上讲得最清楚的I2C和SPI总线协议

SPI也没规定通信应答机制,没有规定流控制规则。事实上,SPI主设备甚至并不知道指定的从设备是否存在。这些通信控制都得通过SPI协议以外自行实现。例如,要用SPI连接一支命令-响应控制型 解码芯片,则必须在SPI的基础上实现更高级的通信协议。SPI并不关心物理接口的电气特性,例如信号的标准电压。在最初,大多数SPI应用都是使用间断性时钟脉冲和以字节为单位传输数据的,但现在有很多变种实现了连续性时间脉冲和任意长度的数据帧。

三、IIC

参考文章:SPI、I2C、UART、CAN_一只大笨猫的博客-CSDN博客_i2c spi

IIC 是多主设备的总线,IIC没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用serial data (SDA)数据线 和 serial clock(SCL)时钟线两条信号线,数据线用来传输数据,时钟线用来同步数据收发。两根信号线都是双向传输的,这两条线都是漏极开路或者集电极开路结构,使用时需要外加上拉电阻,可以挂载多个设备。

1、IIC的传输流程

参考文章:Kevin Zhang:硬件知识——IIC传输

IIC协议标准规定发起通信的设备称为主设备,主设备发起一次通信后,其它设备均为从设备。

1)IIC 通信过程大致如下

首先,主设备发一个START信号。然后其它设备开始监听总线以准备接收数据。当START起始信号产生后,I2C总线就处于被占用的状态,当停止信号产生后,总线就处于空闲状态。

接着,主设备发送一个8位的数据帧(IIC规定数据帧大小必须为8位的字节),包括7位设备地址数据帧(每一个IIC设备都有一个唯一的七位设备地址)和 1位的读写操作的数据帧(读/写位用于确定主设备是向从设备发送数据还是主设备从从设备接受数据,0代表写,1代表读)。

当所有设备接收到数据后,比对地址自己是否为目标设备。如果比对不符,设备进入等待状态,等待STOP信号的来临;如果比对相符,该设备会发送一个应答信号ACKNOWLEDGE作回应。这时主设备就和该从设备建立了连接。

当主设备收到应答后便开始传送或接收数据。数据帧大小为8位,尾随一位的应答信号。主设备发送数据,从设备应答;相反主设备接收数据,主设备应答。

当数据传送完毕,主设备发送一个STOP信号,向其它设备宣告释放总线,其它设备回到初始状态。

2)两条数据线在各个通讯过程中高低电平的状态

空闲时SDA和SCL被拉高,处于高电平的位置。连到IIC总线上的任一设备输出低电平都会把总线信号拉低,即各器件的SDA和SCL都是与的关系。根据这两条线的高低电平、上升沿、下降沿就可以实现主机与I2C设备的通讯。

开始与结束:当SCL保持高电平期间,SDA从高电平跳变到低电平,即为开始条件START。当SCL保持高电平期间,SDA从低电平跳变到高电平,即为结束条件STOP。

传输:IIC总线标准规定SDA线的数据转换必须在SCL线的低电平期。在SCL线的高电平期,SDA线的上数据是稳定不变的。数据传输时先传数据位。

主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着,从设备在每个字节后的第9个时钟周期将SDA保持低电平进行确认数据,回传给主设备一个ACK,此时才认为一个字节真正的被传输完成。

当然,并不是所有的字节传输都必须有一个ACK,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否定ACK,SDA线为高表示否定ACK。

应答:当IIC主机(不一定是发送端还是接受端)将8位数据或命令传出后,会将SDA信号设置为输入,等待从机应答(等待SDA由高电平拉为低电平)。若从机正确应答,表明数据或者命令传输成功,否则传输失败,注意,应答信号是数据接收方发送给数据发送方的。

3、IIC的一些拓展知识

参考文章:华清远见:史上讲得最清楚的I2C和SPI总线协议

1)10位设备地址

任何IIC设备都有一个7位地址,理论上,现实中只能有127种不同的IIC设备。实际上,已有IIC的设备种类远远多于这个限制,在一条总线上出现相同的地址的IIC设备的概率相当高。为了突破这个限制,很多设备使用了双重地址——7位地址加引脚地址(external configuration pins)。IIC 标准也预知了这种限制,提出10位的地址方案。

2)设备冲突的解决办法

如果有两个设备同时向SCL线和SDA线发送信息,基于IIC总线的设计,线路上不可能出现电平冲突现象。如果一支设备发送逻辑0,其它发送逻辑1,那么线路看到的只有逻辑0。也就是说,如果出现电平冲突,发送逻辑0的始终是“赢家”。

3)IIC的传输速率

IIC 数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)。

四、三种通讯方式的特点与区别:

同步通讯:I2C,SPI  异步通讯:UART 采集数据是否用的是时钟的沿,如果是时钟沿采数据,同步传输,如果电平采集数据是异步。串口接受数据其实就是一个串转并的过程。

SPI和UART可以实现全双工,但I2C不行

I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存这两种线属于低速传输。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:poj2406 Power Strings
下一篇:卡特兰数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~