单片机通信——spi、iic、uart

12 篇文章 9 订阅
7 篇文章 2 订阅

一、uart

        通用异步收发器,就是常说的串口通信,常常用在异步通信并且是一种全双工的通信方式,不需要严格的时间限制,两个设备之间连线简单,往往只需要将RX,TX端交叉相连即可。现实中利用面很广,多用于调试,在以后学习Linux驱动开发时是非常重要的。uart的连接过程如下图,很简洁明了。

 

         由图可见,数据在总线和uart之间还是并行传输的,但是两个设备之间的uart之间就采取了单线的传输,在传输的前,还会自动的添加起始位、奇偶校验位、停止位。具体的传输过程如下图:

         这样对uart整个的工作流程就全部解刨开了,学习难度降了好多。在以前的文章里有手撕uart代码的文章,有兴趣的可以去看看。

 二、spi-串行外设接口

        这是一种同步全双工的传输方式,他的连线是这三种通信方式里面最多的,有一个clk串行时钟、MOSI主设备输出、MISO主设备输入、cs从设备片选。他的缺点就是每个从设备都需要有一个cs口用来对其在传输时进行选择。在数据传输时还需要考虑传输时是低电平有效还是高电平有效、第一个下降沿有效还是第二个下降沿有效,相当于有四种传输方式。内部spi通信相当于一个环路,输出数据后又读入数据:

 

 具体读和取数据的过程如下(网上找到很好地一张工作流程图),需要16个脉冲才可以完成一个完整的读取周期。

三、iic

        iic实现连线简单,只需要一个clk时钟线和sda数据线即可,但是iic的协议相对复杂。如图iic可以挂载多个设备,但是传输时只能有一个设备工作,iic是利用地址来选择从机的,这点和spi不同,两条线都有上拉电阻且都设为开漏输出,目的是为了数据传输时的稳定,也是一种规范,iic在高电平时是空闲状态。在数据传输时,clk在高电平的时候,SDA绝对不能发生改变,否则会发生错误。

         在iic中想利用其收发数据必须会起始与终止信号:在SCL为高期间  SDA : 由高到低,起始信号、 SDA:由低到高,终止信号。

 IIC一次最多可以挂载多少个设备呢?由iic地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。但是IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。过多设备会导致信号传输速度变慢,这牵扯到模电方面的内容,不过多解释。

        主设备对从设备可以进行读写,主设备首先会发送7bit位的slave device地址,和1bit位的read或者write命令。

时序图如下write:

read: 

 语言描述就是:

(1)write命令

如果为write命令,则主设备释放总线(If the I2C-bus is free, both SDA and SCL lines should be both at High level),即SDA为高位;然后从设备拉低SDA,表示ACK主设备;然后主设备再发送8bit数据,从设备再ACK(A),通信结束(P)。

写寄存器的标准流程:

1.    Master发起START

2.    Master发送I2C addr(7bit)和w操作0(1bit),等待ACK

3.    Slave发送ACK

4.    Master发送reg addr(8bit),等待ACK

5.    Slave发送ACK

6.   Master发送data(8bit),即要写入寄存器中的数据,等待ACK

7.    Slave发送ACK

8.    第6步和第7步可以重复多次,即顺序写多个寄存器

9.    Master发起STOP

(2)read命令

如果为read命令,则从设备先拉低SDA表示ACK主设备,然后再发送8bit数据。主设备拉低SDA表示ACK从设备(我已经读取8bit的数据了),之后结束。

读寄存器的标准流程

1、Master发送I2Caddr(7bit)和 W操作1(1bit),等待ACK

2.    Slave发送ACK

3.    Master发送reg addr(8bit),等待ACK

4.    Slave发送ACK

5.   Master发起START

6.    Master发送I2C addr(7bit)和 R操作1(1bit),等待ACK

7.    Slave发送ACK

8.   Slave发送data(8bit),即寄存器里的值

9.   Master发送ACK

10.    第8步和第9步可以重复多次,即顺序读多个寄存器

以上文字来源于以下链接:原文链接:https://blog.csdn.net/oqqHuTu12345678/article/details/72356722

四、三种通信方式对比图

对比项         UART                     SPI            I2C
信号线数目3根,RX、TX、GND4根,SDO、SDI、SCLK、SS2根,SDA、SCLK
设备从属关系           ——存在主从设备。SPI用片选信号选择从机 存在主从设备。IIC用地址选择从机。
通信方式全双工通信全双工通信半双工通信
通信速率速度慢比I2C总线要快,速度可达到几MbpsI2C的速度比SPI慢
应用领域

1、UART常用于控制计算机与串行设备的芯片

2、就是我们经常所说的串口,基本都用于调试。

主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间I2C一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块。
传输距离I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信
通信特征异步,一帧可以传5/6/7/8位同步,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传。同步,电平信号,一次连续8bit。从最高位开始传
协议复杂度结构比较复杂SPI实现要比UART简单,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。协议比SPI复杂,但是连线比标准的SPI要少
对比只能与一个设备相连

在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。

在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西邮小菜机

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

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

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

打赏作者

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

抵扣说明:

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

余额充值