UART、IIC以及SPI通信协议

目录

一、UART总线通信协议

二、IIC总线时序图

2.1IIC总线时序图

2.1.1起始信号和终止信号时序图

2.2数据传输时序图

2.3字节传输和应答信号

2.4I2C的寻址

2.2IIC总线通信协议

2.2.1主机给从机发生一个字节的通信协议

2.2.2主机给从机发生连续的多个字节的通信协议

2.2.3主机从从机读一个字节的通信协议

2.2.4主机从从机读连续的多个字节的通信协议

三、SPI总线通信协议

3.1SPI基本的通信协议

3.2SPI共有4种通信模式


一、UART总线通信协议

起始位:发送数据的开始信号,由发送器产生;

数据位:要发送的数据,先发送低位,再发送高位;

校验位:校准数据的,常用奇偶校验位;

​ 奇校验:数据位和校验位中,1的个数之和为奇数;

​ eg : 假设数据位为0x55, 校验位自动补1;假设数据位为0x51, 校验位自动补0;

​ 偶检验:数据位和校验位中,1的个数之和为偶数;

​ eg : 假设数据位为0x55, 校验位自动补0;假设数据位为0x51, 校验位自动补1;

停止位:一帧数据发送结束,最重要的功能是用来校准时钟的。

​ 由于串口采用的是异步通信,通信的双方各自采用各自独立的时钟源,虽然要求时钟的频率保持一致,

​ 但是也会存在一定的误差,每发送一个bit位数据之后,误差就会进行累积,因此发送一帧数据完成之后,

​ 需要通过停止位校准时钟。

常用的串口协议为:8N1(8位数据位,没有校验位,1个停止位);

波特率(比特率):表示串口通信的数据的传输速率,每s钟传输数据的bit位数,单位为bps。

​ 常用的波特率为:115200bps或者9600bps

二、IIC总线时序图

2.1IIC总线时序图

2.1.1起始信号和终止信号时序图

1> SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号

2> SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号

3> 起始和终止信号都是由主机发出,起始信号产生后,总线就处于占用的态;终止信号产生后,总线就处于空闲态。

2.2数据传输时序图

1> I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

2> 在SCL为低电平期间,发送器可以向数据线上写入输入,因此数据线上的数据允许发生变化;

3> 在SCL为高电平期间,接收器从数据线上读取数据,因此必须保持数据线上的数据保持稳定。

2.3字节传输和应答信号

​ 1> 每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

​ 2> 在第9个时钟周期的低电平期间,接收器向数据线上写入数据,在第9个时钟周期的高电平期间,发送器从数据线上读取数据,如果读到的是高电平,则表示非应答信号;如果读到的是低电平,则表示应答信号。

​ 3> 应答信号是由接收器产生的。

2.4I2C的寻址

1> I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

2> 主机在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/W),用“0”表示主机发送数据(W),“1”表示主机接收数据(R)。总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己被主机寻址,根据R/W位将自己定为发送器或接收器。

2.2IIC总线通信协议

2.2.1主机给从机发生一个字节的通信协议

”8位数据“ 被写到 “寄存器的地址” 中。

2.2.2主机给从机发生连续的多个字节的通信协议

第1个 ”8位数据“ 被写到 “寄存器的地址” 中。

第2个 ”8位数据“ 被写到 “寄存器的地址+1” 中。

第3个 ”8位数据“ 被写到 “寄存器的地址+2” 中。

..............(地址会自动增加1)

2.2.3主机从从机读一个字节的通信协议

从机将 “寄存器地址”中的数据发送给主机

从机只能被动的进行数据的收发,如果从机给主机发送一个字节数据之后,如果主机给从机发送应答信号之后,则从机会认为主机还想接收下一个字节的数据,因此从机会将下一个字节的数据再次发送给主机;如果从机收到的是非应答信号,则从机不会发送下一个字节的数据给主机。

2.2.4主机从从机读连续的多个字节的通信协议

第一次, 从机将 “寄存器地址”中的数据发送给主机;

第二次, 从机将 “寄存器地址+1”中的数据发送给主机;

..........

三、SPI总线通信协议

3.1SPI基本的通信协议

         设备选择线/片选线 : CS SS NCS NSS

​          时钟线 : SCK SCL SCLK

​          串行输出数据线 : MOSI

​          串行输入数据线 : MISO

​          M : Master I : Input S : Slave O : Output

          MOSI:主器件数据输出,从器件数据输入

          MISO:主器件数据输入,从器件数据输出

          SCLK :时钟信号,由主器件产生

           /SS:从器件使能信号,由主器件控制(片选)

1> 起始信号: NSS信号线由高变低,是SPI通讯的起始信号

2> 结束信号:NSS信号线由低变高,是SPI通讯的停止信号

3> 数据传输:SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。

​ MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。

​ SPI每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

​ SPI总线发送的数据既有地址信息,命令信息和数据相关的信息。

3.2SPI共有4种通信模式

在SPI操作中,最重要的两项设置就是时钟极性(CPOL)和时钟相位(CPHA)这两项即是主从设备间数据采样的约定方式。

3.2.1时钟极性CPOL : 设置时钟空闲时的电平的状态

​ 当CPOL = 0 ,SCK引脚在空闲状态保持低电平;

​ 当CPOL = 1 ,SCK引脚在空闲状态保持高电平。

3.2.2时钟相位CPHA :设置数据采样时的时钟边沿

​ 当 CPHA=0 时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的奇数边沿被采样

​ 当 CPHA=1时, MOSI或 MISO 数据线上的信号将会在 SCK时钟线的偶数边沿被采样

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。 如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。 I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。 如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资料了解得比较少,这里的描述可能很不完备) UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。 显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。 第三,从第二点明显可以看出,SPIUART可以实现全双工,但I2C不行; 第四,看看牛人们的意见吧! wudanyu:I2C线更少,我觉得比UARTSPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 quickmouse:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。 1、UART和USART两个别区说不出来,USART是新出的,不过区别在什么地方我也搞不清楚。UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少。数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快。在多机通信上面用的最多。 2、SPI接口和上面UART相比,多了一条同步时钟线,上面UART的缺点也就是它的优点了,对通信双方的时序要求不严格不同设备之间可以很容易结合,而且通信速度非常快。一般用在产品内部元件之间的高速数据通信上面,如大容量存储器等。 3、I2C接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输数据的,通信速度不高,程序写起来也比较复杂。一般单片机系统里主要用来和24C02等小容易存储器连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我只是个小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值