参考链接
IIC总线的原理与Verilog实现_iic verilog-CSDN博客
I2C(IIC)的仲裁、时钟同步和时钟扩展_i2c,clock stretch波形-CSDN博客
精解IIC协议_iic写数据-CSDN博客
串行通信——UART总结-CSDN博客
SPI协议详解(图文并茂+超详细)-CSDN博客
目录
1、总线分类
2、IIC
2.1、IIC的时序
2.2、IIC的仲裁机制
3、UART
3.1、UART数据传输
4、SPI
4.1、SPI主从模式
4.2、SPI数据传输
4.3、时钟极性和时钟相位
1、总线分类
同步通信:阻塞通信,发送方发送数据后,接收方响应后才能发送下一个数据包(带时钟线);举例:SPI和IIC
异步通信:非阻塞通信,发送后不考虑接收方是否响应(不带时钟线);举例:UART
单工通信:固定主从,数据只能从主机到从机。
半双工通信:双方均可发送和接收数据,但是同一时间只能一方发送;举例:IIC。
全双工通信:双方可同时发送数据;举例:UART,SPI。
2、IIC
-
同步半双工总线,多主多从;
-
具有两根信号线:SDA(数据线),SCL(时钟线)。
-
I2C总线理论最多可以有127个从机。这是因为I2C协议使用7位地址,减去广播地址后,理论上可以挂载127个从设备。但实际上I2C协议并没有规定总线上设备的最大数目,而是规定了总线电容不能超过400pF。在实际设计中,经验值通常不超过8个器件。
-
IIC总线上所有器件的SDA、SCL引脚输出驱动都为开漏(OD) 结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系;
-
IIC的ACK应答信号为通过SDA返回一个低电平,这是由于外接上拉电阻,只有低电平时候,才是主动改变的状态。每接收到一字节数据,就要产生一个应答信号。
-
IIC的传输速率模式包括标准模式、快速模式和高速模式。标准模式的传输速率为100kbit/s;快速模式的传输速率为400kbit/s;高速模式的传输速率可达3.4Mbit/s,但目前大多数I2C设备尚不支持高速模式。
2.1、IIC的时序
1、数据有效性
IIC 的数据读取动作都在 SCL为高时产生,SCL为低时是数据改变的时期,无论SDA如何变化都不影响读取。所以,传输数据的过程中,当SCL为高时,数据应当保持稳定,避免数据的采集出错。
2、开始和结束信号
开始信号(START/S):SCL为高时,SDA从高到低的跳变产生开始信号
结束信号(STOP/P):SCL为高时,SDA从低到高的跳变产生结束信号
这里是由于在数据有效性中规定了SCL为高的时候,数据必须稳定以方便采样,因此才设置了SDA在SCL为高是变化作为指示信号
3、写时序
4、读时序
读时序最开始发送第一个设备端口号的时候,发送的是写指令。中间需要STOP一次传输,再重新开启。
5、字节传输与应答
每一个字节必须保证是8bit长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随1bit的应答位(即每一帧数据一共有9bit),ACK为低电平应答信号,
2.2、IIC的仲裁机制
(这部分我看的时候觉得很有意思,IIC的仲裁不像是之前APB那样靠的是仲裁器提前设置优先级,而是单纯凭借它的硬件电路结构)
发生仲裁的前提是,一条总线上挂载了多个主机,并且这些主机都支持多主机模式,即每一个主机都可以实时监测SDA以及SCL的情况,从而通过start和stop位来确定总线的情况(被占用还是空闲)。当多个主机检测到当前总线处于空闲状态时(这里以2个主机为例),可能会同时发出启动标志位(发出的时间间隔很短,因此无法检测到其他节点产生的电平变化,误认为总线是空闲的),这时候仲裁机制开始生效。
总线归属权的仲裁是通过SDA线完成的。由于IIC的总线设计是线与(wired-AND),因此低电平是显性电平。只要有一个节点将SDA拉低,那么整条总线都会拉至低电平。在两个主机都认为总线空闲并开始通信之后,当遇到第一个两者发送的不同的位时,会决出总线的归属者。
设主机1将向address为0b10100111的从机发送数据,主机2将向addres为0x10101000的从机发送数据。两者都占有总线并同时向SDA写入数据。注意IIC发送的顺序是MSB->LSB(先发送高位)。两者的前四位数据相同,而当发送进行到第五个时钟周期时,master1的第五位为0,而master2的第五位为1,此时根据线与特性,SDA总线的电平会被master1拉低。master2会检测到自己要发送的电平和总线的实际电平不符,从而获知有其他主机正在发送,随之停止后续的发送,让出总线的归属权。若两主机向相同的地址写入数据,那么仲裁过程将继续,直到在后续的数据位中决出总线的归属权(仍然是通过上述的方法)。
IIC的仲裁是通过采样SDA完成的,因此不会破坏数据的有效性,通信不会停止,也不会有数据帧丢失。但是IIC不具有主机优先级的设定,因为总线的归属权是根据主机发送的数据确定的,因此无法提前为每个主机设定发送或接收的优先级。
3、UART
-
UART是异步,全双工串口总线,一对一,不支持多主多从结构。
-
TXD用于发送数据,RXD用于接收数据。UART的串行数据传输不需要使用时钟信号来同步传输,而是依赖于发送设备和接收设备之间预定义的配置。
-
UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(RX 和TX)就可以完成通信过程。
3.1、UART数据传输
数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。
比特率和波特率区别:比特率指的是传输的有效位数个数。上面案例中10位数据,其中有效数据只有7个,比特率为7x120=840比特。
异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。
由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。
UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这是计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。
尽管UART在某些方面效率较低,但其优点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信。此外,由于其设计简单和易于实现,UART在嵌入式系统中仍然广泛使用。
4、SPI
-
同步,全双工串口总线,一对多,不支持多主机。(正好这三种串行总线在主从数量上都完全不一样)。
-
产生时钟信号的器件称为主机,主机和从机之间传输的数据与主机产生的时钟同步。同I2C接口相比,SPI器件支持更高的时钟频率。
-
灵活的数据传输方法,不限于8位,可以是任意大小的字。从机不需要唯一的地址。
-
没有硬件从机应答信号,没有只能支持比较短的距离。
4.1、SPI主从模式
SPI单从机模式:
SPI多从机模式:
片选信号CS通常是一个低电平有效的信号;如果要和特定的从机进行通讯,可以将相应的 CS信号线拉低,并保持其他 CS信号线的状态为高电平:如果同时将两个CS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条 MIS0 线上传输数据,最终导致接收数据乱码。
4.2、SPI数据传输
开始信号:主机发送时钟信号,并通过使能CS信号选择从机。
SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)同时进行。
在每个SPI时钟周期内,都会发生全双工数据传输。
主机在MOSI 线上发送一位数据,从机读取它,而从机在 MIS0 线上发送一位数据,主机读取它就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送些东西!在这种情况下,我们称其为虚拟数据。
4.3、时钟极性和时钟相位
在 SPI 中,主机可以选择时钟极性和时钟相位。在空闲状态期间,CPOL为设置时钟信号的极性。空闲状态是指传输开始时 CS为高电平且在向低电平转变的期间,以及传输结束时 CS 为低电平且在向高电平转变的期间。CPHA 为选择时钟相位。
根据CPHA位的状态,使用时钟上升沿或下降沿来采样和/或移位数据。主机必须根据从机的要求选择时钟极性和时钟相位。根据 CPOL 和 CPHA 位的选择,有四种SPI 模式可用。
数据传输举例,CPOL=0,CPHA=0: