UART
UART(通用异步接收发送器):也就是我们通常所说的串口,主要用于调试。UART的主机和从机,至少需要三根线,分别是
RX,TX和GND
,其中TX用于发送数据,RX用于接收数据,因此是
全双工
的
UART协议也很简单,主要包括
空闲位,起始位,数据位,奇偶校验位和停止位
,空闲位为高电平,表示当前无数据传输,起始位为一个一位的低电平信号,数据位一般是5,6,7,8位(
如果不使用奇偶校验位,则数据帧的长度可以为9位
),由双方事先约定好,然后是奇偶校验位,用于数据出错的检测,但由于出错的概率很小,因此现在一般都不需要,最后停止位是1位、1.5位、2位的高电平信号。
UART中,还有一个概念就是
波特率
,即数据传输的速率,常见的有300,600,1200,2400,4800,9600,19200,38400,43000,56000,57600和115200。
SPI
即Serial Peripheral Interface,同步外设接口,是由摩托罗拉公司开发的
全双工同步串行总线
,该总线大量用于与EEPROM,ADC,FRAM和显示驱动器之类的慢速外设器件通信。
SPI是一种串行同步通讯协议,由
一个主设备和一个或多个从设备组成
,主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI接口由
SDI串行数据输入,SDO串行数据输出,SCK时钟信号,CS片选信号
四种信号构成,CS决定了唯一的与主设备通信的从设备,片选信号
低电平有效
。如没有CS信号,则只能存在一个从设备,主设备通过产生移位时钟来发起通讯。通讯时,数据由SDO输出,SDI输入,数据在时钟的上升或下降沿由SDO输出,在紧接着的下降或上升沿由SDI读入,这样经过8/16次时钟的改变,完成8/16位数据的传输。
SPI协议有多种不同的配置,由
时钟相位
和
时钟极性
决定。
时钟极性(CPOL)
Clock Polarity的缩写,SPI的CPOL,表示当SCLK空闲(idle)的时候,其电平的值是低电平0还是高电平1:
CPOL=0,时钟空闲idle时候的电平是低电平
CPOL=1,时钟空闲idle时候的电平是高电平
时钟相位(CPHA)
用于决定在第几个时钟变化边沿开始采样数据:
CPHA=0:在时钟信号SCK的第一个跳变沿采样
CPHA=1:在时钟信号SCK的第二个跳变沿采样
因此,不同的CPOL和CPHA组合,可以得到一共四种不同的SPI协议的配置:
CPHA=0,表示第一个边沿:
对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿采样
对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿采样
CPHA=1,表示第二个边沿:
对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿采样
对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿采样
如下图所示
IIC
IIC,即Inter Integrated Circuit,两根线:一根时钟线
SCL
和一个数据线
SDA
。由于只有一根数据线,所以是
半双工通信
。
IIC的
起始条件
为在
SCL为高电平期间,SDA出现下降沿
IIC的
结束条件
为在
SCL为高电平期间,SDA出现上升沿
而在数据传输时,
只有在SCL为低电平期间,才允许数据变化
,在高电平期间,不允许数据变化,否则就会出现起始位或结束位。
IIC还有一个很重要的概念:
应答(ACK,Acknowledgement)
。即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。主机每向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,来确认从机是否成功接收到了数据,从机应答主机所需要的时钟也是由主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,
低电平0表示应答,1表示非应答
。需要应答时,数据发出方将SDA总线设置为3态输入,由于IIC总线上有上拉电阻,因此此时总线默认高电平,若数据接收方正确接收到数据,则数据接收方将SDA总线拉低,以示正确应答。
此外,
IIC传输时是从MSB开始传输到LSB结束的
。
IIC写时序:
其流程为
1.产生start位
2.传送
器件地址ID_Address
,
器件地址的最后一位为数据的传输方向位
,R/W,低电平0表示主机往从机写数据(W),1表示主机从从机读数据3.ACK应答,应答是从机发送给主机的应答。
4.传送
寄存器地址
,即数据要写入的位置,从机ACK。
5.传送要写入的数据,从机ACK。
6.产生stop信号。
IIC读时序:
其流程为
1.产生start信号
2.传送器件地址(写ID_Address),ACK。
3.传送字地址(写REG_Address),ACK。
4.
再次产生start信号
5.再传送一次器件地址,ACK。
6.读取一个字节的数据,
读数据最后结束前无应答(NO ACK)信号
。
7.产生stop信号。
IIC协议在读写数据时,总是要发送器件地址,这里需要注意的是,不是主机给从机发送地址,而是主机给地址总线上发送地址,挂IIC总线上的所有从机都能收到地址,如果发过来的地址和自己的地址匹配上了,从机就会给主机一个应答,这样就建立起来了一个通讯。
关于IIC总线一些需要注意的地方:
1.对IIC总线的一次操作完之后,需要等待一段时间才能进行第二次操作。否则是启动不了总线的
2.在时钟线(SCL)为高电平的时候,一定不能动数据线(SDA)状态,除非是启动或者结束总线
UART,IIC,SPI的区别和联系
信号线数目
UART为3根,RX、TX、GND ,SPI为4根,SDO、SDI、SCLK、SS,IIC为2根,SDA、SCLK
设备从属关系
UART无从属关系,SPI存在主从设备,通过
片选信号
选择从机 ,而IIC同样也存在主从设备,不过是通过
地址
选择从机。
通信方式
UART和SPI为全双工通信,IIC为半双工通信
UART为异步通信(无时钟),SPI和IIC为同步通信
传输速度
UART传输速度较慢 ,SPI比I2C总线要快,速度可达到几Mbps。
应用场景
UART常用于控制计算机与串行设备的芯片,也就是我们经常所说的串口,基本都用于调试。
SPI主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 。
I2C一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块。
传输距离
IIC弱于UART和SPI,因为I2C需要有双向IO的支持,而且使用上拉电阻(
为了实现线与
),
抗干扰能力较弱
,一般用于同一板卡上芯片之间的通信,较少用于远距离通信
通信特征
UART:异步,一帧可以传5/6/7/8位,
低位先发送
。
SPI: 同步,SPI允许数据一位一位的传送,甚至允许暂停。
从最高位开始传
。
IIC:同步,电平信号,一次连续8bit。
从最高位开始传
。
协议复杂度
UART:结构比较复杂
SPI:实现要比UART简单,UART需要固定的波特率,也就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。
IIC:协议比SPI复杂,但是连线比标准的SPI要少
此外,在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。而在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。