uart、spi、i2c通信协议详解

文章目录

  • 前言
  • 一、uart(串口)
    • 介绍
    • 使用
    • rs232、rs485拓展
  • 二、I2C
    • 介绍
      • 1.宏观流程
      • 2.时序上
      • 3.典型操作
  • 三、spi(串行外设接口)
    • 介绍
    • 使用
      • 1.宏观上
      • 2.微观上
  • 总结
    • 1.i2c和spi对比


前言

之前对于各种通信协议学习了就忘,学了就忘,多种通信方式经常搞混,索性直接一次性在这里进行比较学习,没有进行具体代码实现,都是从原理上进行分析


`

一、uart(串口)

uart、spi、i2c通信协议详解_第1张图片

介绍

uart(串口)有两根线实现全双工、异步、串行通信,每次传输的数据最多为8位(5-8),还有1位起始位,停止位,校验位可有可无,偶校验:1的个数是偶数将这位置1。比如发送10101010,第一位发的是低位的0而不是高位的1,i2c则相反,第一位发的是最高位1,异步说明了这两者的时钟是不同的,时钟不同即波特率不同,比如发送方波特率是1,接收方波特率是2,那么发送方发送数据10101010就得需要8s,即每位都是1s,接受方接受这些数据会变成1100110011001100,即接受一位0.5s,这也就是说明了我们要把双方的波特率设置成一样的原因,同时,我们还限制了一次最多只能发送8位数据位的原因也在这里,如果双方由于波特率的差异,比如一方波特率是1,发送了10位,接受方波特率0.9,接受就只能接收9位,那么后面的就全乱套了,所以每次发送8位后重新开始,重新对时间,可以避免这种情况

uart、spi、i2c通信协议详解_第2张图片

使用

1.将gpio设置为uart
2.配置uart控制器,即串口控制器的寄存器

rs232、rs485拓展

rs232、rs485都是一种电气协议而已,是依附于uart硬件使用的,时序跟uart一样,都是一种标准
由于uart只规定了时序,没有规定什么电平(高电平代表1、低电平代表0,但是具体是多少?),一般uart都是使用ttl电平,所以向非ttl接收端就无法进行通信,所以我们一般不直接使用串口进行通信

rs232(15m)
-5 - -15 为1,5 - 15 为0 一般有max232将单片机的串口ttl电平转成rs232,发送出去,接收方将rs232转成ttl再给回单片机,这样可以将延长通信距离(232可传输15m左右)

rs485(1.5km,串口、232都只能两个,485可形成网络(一个主机,与多个485从机设备),串口、232都是用一根线进行传输,即非差分,485用两根线,为差分,同时485兼容ttl电平,不需要max232进行转换)所以如果只有两根线,那只能半双工,
2 - 6 为1,-2 - -6为0

二、I2C

介绍

i2c是同步、串行、半双工、近距离(板级之间)、多机通信(uart是仅有两个),有两根线,一个scl实现时钟同步,就没有了由于波特率不同导致的误差,就可以一直发送,不同跟uart一样,每次最多可发送8个数据位,然后还得重新发起始位,停止位等,效率高了很多、一个sda可用来发送数据,所以只能进行半双工,由于使用的是电平信号,所以传输距离短,通常连接在上面的有主机从机之分,当然这个主机从机是不固定的,每个从机可以成为主机,,当多个从机同时想启用总线,这时候主机就得进行仲裁,防止错误,每个从机都有唯一7位的地址,所以i2c最多可有127个从机,每次将通过sda发送时先发一个地址,再发数据

uart、spi、i2c通信协议详解_第3张图片

1.宏观流程

1.有多个主机,但是同一时刻只能有一个主机进行工作,所以需要工作的主机发送起始信号,占用总线,然后其他主机这个时候就不会占用了
2.一个字节8位,前7位是从机地址,最后一位决定是从机给主机发(1),还是主机给从机发(0),这一个字节所有从机都可以接收到,将前7位与自己相比对,如果不一样就闭嘴了
3.当正确的从机接受到这一字节后,发一个应答信号给主机
4.两者已经建立连接了,所以这个时候就开始了发送器给接收器了(这里第一个字节的最后一位是1,发送器就是主机)
5.接收器接受完也会给发送器一个应答 … 注意:这里的两个已经确定身份了,所以这个时候发送器和接收器不能互换
6.通信完成后,主机发送停止信号释放总线

uart、spi、i2c通信协议详解_第4张图片

2.时序上

简介:i2c通信时,总的分出来就4种信号:总用总线时的起始信号、发送一字节数据的数据发送信号、接收器的应答信号、释放总线的停止信号

起始信号和停止信号
uart、spi、i2c通信协议详解_第5张图片

发送信号与应答信号 即发送器发送了8位数据,接收器发送了1位应答位,即一帧数据有9位,uart有起始位、数据位(5-8)、校验位、停止位。

uart、spi、i2c通信协议详解_第6张图片

同步信号的要求:i2c规定,scl实现双方同步,scl为低,就是给发送器发送数据的,这时候sda可以改变,scl为高,就是给接受器接受的,所以scl为高,那么sda这个时候不能变,这样就成功发送了一位,一帧数据有9位,就发9次

uart、spi、i2c通信协议详解_第7张图片

3.典型操作

方向位为0:主机作为发送器,这个时候要停止有两种情况:1.主机主动停止,那么就在从机应答后发送停止
2.从机想停止,那么发送器(即主机)发数据,从机不应答,这个时候主机就知道从机想停止了,那么就发送停止

uart、spi、i2c通信协议详解_第8张图片

方向位为1:主机作为接收器,停止:接收器(主机)应答/不应答,然后发送结束

在这里插入图片描述

半双工:主机先作为发送器,发送完数据,从机作为接收器,接受完应答,然后主机再发送一个开始信号,然后从机发送数据,主机接收数据。注意两者没有停止信号,防止由于主机释放总线后被其他抢走

在这里插入图片描述

三、spi(串行外设接口)

介绍

spi是全双工、同步、比uart、i2c快速,用来mcu与各种外设通信,主机至少有4根线,mosi(主设备输出从设备输入)、miso(主设备输入从设备输出)实现全双工、sclk(实现同步)、cs(片选,每个从机只需要4个线,当有多个从机,那么主机就得多cs线),这也就导致了相比于i2c,spi主机是固定的,不会像i2c变来变去,spi与i2c一样先发高位,后发地位,与uart不一样,同时spi无虚应答信号,无起始信号,无停止信号,直接就是数据,与i2c不一样,这样容易导致接收器没接收到,然而发送器一直发

使用

1.宏观上

1.主机向要发送的从机的cs发送使能信号(高/低不确定,看从机),表明选定了该从机,比如,3个主机,使能信号为0,那么就给所有非目标从机cs发1,给目标从机发0。

uart、spi、i2c通信协议详解_第9张图片

2.微观上

总结

1.i2c和spi对比

1.i2c半双工、spi全双工,i2c两根线、spi4根线或更多
2.spi速度比i2c快
3.i2c有四种信号,spi只有数据格式
4.spi有四种工作模式,i2c只有一种规定好的时钟相位和时钟极性
5.i2c可用多主机,spi只有一个主机

相同点
1.数据传输都是高位在前,低位在后
2.都是同步通信,使用的都是ttl电平

你可能感兴趣的:(单片机,stm32,arm)