zxopenluyutong 发表于 2021-1-7 18:33:57

UART, SPI, IIC的详解

1、UART, SPI, IIC的详解

UART、SPI、IIC是经常用到的几个数据传输标准,下面分别总结一下:

UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基本都用于调试。

主机和从机至少要接三根线,RX、TX和GND。TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式)。注意A和B通信A.TX要接B.RX,A.RX要接B.TX(A用TX发B当然要用RX来收了!)

如果A是PC机,B是单片机,A和B之间还要接一块 电平转换芯片,用于将TTL/CMOS(单片机电平)转换为RS232(PC机电平)。因为TTL/CMOS电平范围是0~1.8/2.5/3.3/5V(不同单片机范围不同),高电压表示1,低电压表示0。而RS232逻辑电平范围-12V~12V,-5~-12表示高电平,+5~+12V表示低电平(对!你没有听错)。为什么这么设置?这就要追溯到调制解调器出生时代了,有兴趣自己去查资料!

数据协议:以PC机A给单片机B发数据为例(1为高电平,0为低电平):A.TX to B.RX。刚开始B.RX的端口保持1,当A.TX发来一个0作为起始位告诉B我要发数据了!然后就开始发数据,发多少呢?通常一次是5位、6位、7位、8位,这个双方事先要用软件设置好。PC机一般会用串口助手设置,单片机会在uart的驱动中设置。一小帧数据发送完了以后,A.TX给个高电平告诉B.RX我发完了一帧。如果还有数据,就再给个0然后重复上一步。如果双方约定由校验位,还要在发停止位1之前发送个校验位,不过现在一般都不需要校验位了,因为出错的概率太小了,而且一般用于调试。

一般在串口助手上还有个RTS/CTS流控选项,也叫握手,我从来没用过。搬一段我能理解的介绍:RTS(请求发送),CTS(清除发送)。如果要用这两个功能,那就至少要接5根线:RX+TX+GND+RTS+CTS。当A要发送数据时,置RTS有效(可能是置1),告诉B我要发送数据了。当B准备好接受数据后,置CTS有效,告诉A你可以发了。然后他们就实现了两次握手!挺耽误时间是不是?这个RTS还可以当电源使用,如果你不用它的握手功能,且电源电流在50mA以下时,就可以把它置为高电平可以当电源用喔~!



SPI(Serial Peripheral Interface, 同步外设接口)是由摩托罗拉公司开发的全双工同步串行总线,该总线大量用在与EEPROM、ADC、FRAM和显示驱动器之类的慢速外设器件通信。

SPI是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI 接口由SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(从使能信号)四种信号构成,CS 决定了唯一的与主设备通信的从设备,片选信号低电平有效。如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟来发起通讯。通讯时,数据由SDO 输出,SDI 输入,数据在时钟的上升或下降沿由SDO 输出,在紧接着的下降或上升沿由SDI 读入,这样经过8/16 次时钟的改变,完成8/16 位数据的传输。



IIC(Inter Integrated Circuit):两根线:一个时钟线SCL和一个数据线SDA。只有一根数据线,所以是半双工通信。接线不难,而且两根线上也可以挂很多设备(每个设备的IIC地址不同),数据协议比较麻烦:


还是假设A给B发数据(这里A.SCL接B.SCL, A.SDA接B.SDA)。起初SDA和SCL上的电平都为高电平。然后A先把SDA拉低,等SDA变为低电平后再把SCL拉低(以上两个动作构成了iic的起始位),此时SDA就可以发送数据了,与此同时,SCL发送一定周期的脉冲(周期和PCLK有关,一般会在IIC的控制寄存器中设置)。SDA发送数据和SCL发送脉冲的要符合的关系是:SDA必须在SCL是高电平是保持有效,在SCL是低电平时发送下一位(SCL会在上升沿对SDA进行采样)。规定一次必须传8位数据,8位数据传输结束后A释放SDA,但SCL再发一个脉冲(这是第九个脉冲),这会触发B通过将SDA置为低电平表示确认(该低电平称为ACK)。最后SCL先变为高电平,SDA再变为高电平(以上两个动作称为结束标志)如果B没有将SDA置为0,则A停止发送下一帧数据。IIC总线(即SDA和SCL)上的每个设备都有唯一地址,数据包传输时先发送地址位,接着才是数据。一个地址字节由7个地址位(可以挂128个设备)和1个指示位组成(7位寻址模式)。指示位是0表示写,1表示读。还有10位寻址模式,使用两个字节来保存地址,第一个字节的最低两位和第二个字节的8位合起来构成10位地址。




在I2C总线的应用中应注意的事项总结为以下几点 :
1) 严格按照时序图的要求进行操作,
2) 若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。
3) 程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。
4) 为了减少意外的干扰信号将EEPROM内的数据改写可用外部写保护引脚(如果有),或者在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。

关于IIC总线的操作注意事项

1、对IIC总线的一次操作完之后,需要等待一段时间才能进行第二次操作。否则是启动不了总线的:)
2、在时钟线(SCL)为高电平的时候,一定不能动数据线(SDA)状态,除非是启动或者结束总线

afei6969 发表于 2021-1-7 19:09:24

56666666666666

zhangyukun 发表于 2021-1-8 10:07:05

UART, SPI, IIC的详解

zxopenhl 发表于 2021-1-8 12:46:57

UART, SPI, IIC的详解
页: [1]
查看完整版本: UART, SPI, IIC的详解