UART、SPI、I2C通信协议超全入门教程

本文引注:

https://mp.weixin.qq.com/s/lVWK8xlDt7cOLi8WHYSuPg
http://t.csdnimg.cn/gHcrG

1.SPI协议

1.基础

在这里插入图片描述

2.简介

在这里插入图片描述
在这里插入图片描述
SPI(Serial Peripheral Interface)是一种常见的集成电路间通信接口标准,它允许一个主设备与一个或多个从设备之间进行全双工同步串行通信。SPI接口以其高速、灵活和简单易用的特性被广泛应用于嵌入式系统和众多电子设备中。

主要应用领域包括但不限于:
1.存储芯片:如EEPROM(电可擦除可编程只读存储器)、Flash(闪存)、SRAM(静态随机访问存储器)等。
2.AD转换器(Analog-to-Digital Converters):用于将模拟信号转换为数字信号,常用于数据采集系统和传感器数据读取。
3.LCD(Liquid Crystal Display)驱动器:用于控制液晶显示屏的内容显示,SPI接口可用于传输图像数据和控制命令。
4.数字信号处理器(DSP)和微控制器(MCU)之间、以及其他多种嵌入式系统组件之间的通信连接,如传感器、电机驱动器、通信模块等。

SPI接口通常由四条信号线组成,包括:
SCLK(Serial Clock):主设备提供的时钟信号,用于同步数据传输。
MOSI(Master Out, Slave In):主设备数据输出线,从设备数据输入线。
MISO(Master In, Slave Out):主设备数据输入线,从设备数据输出线。
SS/CS(Slave Select/Chip Select):从设备使能信号,用于选择要与之通信的从设备。

此外,某些SPI实现可能还包括额外的控制线或中断线,以便增强功能或优化通信。SPI的最大特点是它的高速同步通信能力,使其在需要高速数据传输和精确同步的场合尤为适用。

SPI 和 IIC
在这里插入图片描述
SPI和IIC(I²C)都是常见的串行通信接口协议,它们都有各自的特点、优缺点以及适合的应用场景:

SPI(Serial Peripheral Interface)
差异:
1.通信方式:SPI是全双工通信,数据可以在两个方向上同时传输。
2.总线结构:SPI支持多个从设备,但每个从设备需要独立的片选(CS)线,故连线数量随从设备增多而增加。
3.时钟控制:SPI由主设备提供时钟信号,所有的从设备共享同一个时钟信号,且速率可调节。
4.通信速率:SPI的速度通常比I²C更快,可达数Mbps到数十Mbps。

优点:
1.高速:SPI能够实现更高的数据传输速率,适合大数据量、高速传输的应用。
2.灵活:主设备可以单独控制每个从设备的数据传输,适合需要独立控制多个设备的场合。

缺点:
1.线路复杂:每个从设备都需要独立的CS线,当从设备数量增加时,连线成本和布线难度增大。
2.不具备仲裁机制:在多主设备环境下无法自行解决冲突,一般只能用于单主设备系统。

应用场景:
大容量存储器(如闪存、RAM)读写。
显示驱动器(如LCD、OLED)控制。
高速AD/DA转换器的数据传输。
实时数据采集系统。

I²C(Inter-Integrated Circuit)
差异:
1.通信方式:I²C是半双工通信,同一时刻只能在一个方向上传输数据,但可以在数据传输间隙进行方向切换。
2.总线结构:I²C仅需两条线(SDA和SCL),允许多个设备共享总线,采用广播式的地址寻址方式。
3.时钟控制:I²C的时钟由主设备提供,所有设备共享同一时钟,且速率相对较慢。
4.通信速率:I²C速率较低,典型速率从几kbps到几百kbps,现代高速I²C(Fast-mode Plus)可达到几Mbps。

优点:
1.简单:只需要两条线路,简化了硬件设计和布线。
2.半双工:虽然通信速率较低,但在某些应用中足以满足需求。
3.内建仲裁:支持多主控模式,当多个主设备同时尝试通信时,可通过仲裁机制解决冲突。

缺点:
速度较慢:相比于SPI,I²C的传输速率较低。
总线负载能力有限:过多的设备挂在总线上会影响通信质量和可靠性。

应用场景:
基本传感器(如温度、湿度、压力传感器)数据读取。
IC配置和控制(如EEPROM、PLL、音视频编解码器等)。
低速外设控制(如键盘、触摸屏控制器)。

总结:
SPI更适合高速、实时性强、需要与多个独立从设备进行高速交互的场合,而I²C则适合低成本、低速、轻型设备互联和系统内部通信。两者在实际应用中可根据具体需求选择合适的接口标准。

SPI与I²C对比表
在这里插入图片描述

3.工作原理

在这里插入图片描述
在这里插入图片描述

4.SPI数据传输步骤与优缺点

在这里插入图片描述

5.SPI结构框图介绍

在这里插入图片描述

在这里插入图片描述
SPI(Serial Peripheral Interface)结构框图通常包含以下几个关键组成部分:
1.SPI相关引脚:
MOSI(Master Output, Slave Input):主设备数据输出线,主设备向从设备发送数据。
MISO(Master Input, Slave Output):主设备数据输入线,从设备向主设备发送数据。
SCK(Serial Clock):SPI时钟信号线,由主设备产生并决定数据传输的速率和时序。
NSS/CS(Slave Select/Chip Select):从设备选择线,用于选择SPI总线上活动的从设备。

2.数据发送和接收模块:
缓冲区:用于暂存待发送或接收的数据。
移位寄存器:在SPI通信过程中,数据通过移位寄存器逐位传输。
引脚接口:将内部电路与SPI引脚连接,实现数据的物理传输。

3.时钟信号生成:
SPI_CR1寄存器:在大多数嵌入式系统中,SPI的时钟频率、极性(CPOL)和相位(CPHA)等时序参数通常通过SPI控制器的控制寄存器(如SPI_CR1)进行配置。

4.主控制逻辑:
SPI_CR1/2:这两个寄存器用于配置SPI的工作模式、数据大小、时钟速率、通信方向等属性。
SPI_SR(Status Register):SPI状态寄存器,用来监控SPI的当前工作状态,例如传输完成标志位、接收过载标志位、忙标志位等,以便于微控制器判断SPI传输是否完成或是否存在错误。

SPI的结构框图通常展示以上组件之间的连接关系和工作流程,清晰描绘了SPI通信的硬件架构和软件控制逻辑。
在这里插入图片描述
在这里插入图片描述

(1)数据发送、数据接收

在这里插入图片描述
SPI数据发送与接收的过程可以这样描述:
数据发送过程:
1.发送缓冲区:主机(Master)首先将待发送的数据加载到SPI控制器的发送缓冲区中。当缓冲区为空时,即TXE(Transmit Buffer Empty)标志位被置位,表明可以向缓冲区写入新数据。

2.移位寄存器:一旦数据被写入发送缓冲区,SPI控制器会在下一个时钟脉冲到来时将数据移位至移位寄存器中。随着SCK时钟信号的上升和下降沿,数据按位依次通过MOSI(Master Output, Slave Input)线传输给从机(Slave)。

3.(地址&数据总线):实际上在SPI协议中,地址和数据通常是结合在一起连续传输的,不存在独立的地址总线。所有信息都通过MOSI线串行发送。

数据接收过程:
1.MISO发送DATA:从机通过其MISO(Master Input, Slave Output)线将数据串行发送回给主机。在每一个SCK时钟周期内,从机的移位寄存器中的数据位会转移到MISO线上。

2.移位寄存器:主机端的SPI控制器通过SCK同步接收这些数据,并将其存放在自身的移位寄存器中。

3.接收缓冲区:当接收到一个完整的数据字后,SPI控制器会将移位寄存器中的数据移入接收缓冲区中。当接收缓冲区中有新的数据可供读取时,RXNE(Receive Buffer Not Empty)标志位会被置位,提示主机可以从SPI接收缓冲区中读取接收到的数据。

总结来说,SPI数据的发送和接收都是通过共享的时钟信号和单向的数据线进行串行通信的,发送和接收操作可以同时进行,因此SPI具有全双工通信能力。在实际应用中,通过对SPI的状态寄存器进行监控,可以确保正确且高效地进行数据的发送和接收。

(2)SPI 工作原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SPI(Serial Peripheral Interface)工作原理基于主从模式,其核心在于主机(Master)控制通信过程,包括时钟信号的产生和数据传输的时序。以下是SPI工作原理的简要描述:

1.通信时序:
SPI通信通常以字节(8位)为基本单位进行数据传输。
主机通过SCK(Serial Clock)提供时钟信号,决定数据传输速率和时序,从机跟随这个时钟信号进行数据的采样和发送。

2.主机写操作:
当主机需要向从机写入数据时,主机首先通过MOSI(Master Out, Slave In)线将数据串行发送给从机。
主机会先拉低从机片选线(NSS)以选中目标从机,然后通过SCK时钟信号的上升沿和下降沿驱动数据在MOSI线上逐位传输。
在这种情况下,主机并不关心从机返回的数据,因为它没有通过MISO(Master In, Slave Out)线读取数据。

3.主机读操作:
若要进行读取操作,主机同样需要先拉低NSS选中从机,然后开始发送一个字节(可能是预设的空数据或指令)。
即便这个字节对主机而言没有实际意义,但从机会在接收到这个字节的同时,通过MISO线回传数据给主机。
主机通过监听MISO线上在SCK时钟信号驱动下的数据变化,接收从机返回的数据。

总结起来,SPI协议允许主机在单个时钟周期内同时进行写和读操作,实现了全双工通信。虽然在主机写操作时不关注从机的返回数据,但在进行读操作时,即使主机不关心从机的数据内容,也需要发送一个“触发”信号(通常是空数据或特定指令)来促使从机开始发送数据。

6.SPI工作模式介绍

s

在这里插入图片描述

SPI(Serial Peripheral Interface)有四种工作模式,这些模式由两个参数决定:时钟极性(CPOL)和时钟相位(CPHA)。下面是SPI四种工作模式的详细解释:
1.时钟极性(CPOL):
CPOL=0:在没有数据传输时,SCK(Serial Clock)时钟线处于低电平(逻辑0)状态。
CPOL=1:在没有数据传输时,SCK时钟线处于高电平(逻辑1)状态。

2.时钟相位(CPHA):
CPHA=0:数据在SCK的第一个边沿(上升沿或下降沿,取决于CPOL设置)被采样,数据在SCK的紧接着的第二个边沿被锁存到移位寄存器中。
CPHA=1:数据在SCK的第二个边沿被采样,数据在SCK的紧接着的第一个边沿被锁存到移位寄存器中。

结合CPOL和CPHA的不同设置,SPI共有四种工作模式:
模式0:CPOL=0,CPHA=0。数据在SCK时钟的上升沿被采样,在下降沿被锁存。
模式1:CPOL=0,CPHA=1。数据在SCK时钟的下降沿被采样,在上升沿被锁存。
模式2:CPOL=1,CPHA=0。数据在SCK时钟的下降沿被采样,在上升沿被锁存。
模式3:CPOL=1,CPHA=1。数据在SCK时钟的上升沿被采样,在下降沿被锁存。

每种模式都会影响数据与时钟信号的相对位置,但无论哪种模式,SPI通信的基本原理都是在主设备的控制下,通过共享的时钟信号,在每个时钟周期内逐位传输数据。

时钟极性(CPOL)、时钟相位(CPHA)
时钟极性(CPOL)和时钟相位(CPHA)是SPI通信协议中用来描述数据采样和时钟信号关系的两个重要参数。下面我们将详细讲解并通过一个象限图来分析这两种参数对SPI时序的影响。

时钟极性(CPOL):
CPOL=0:在这种模式下,SPI的时钟信号在没有数据传输时的空闲态(idle state)为低电平(Low)。也就是说,当没有数据交换时,SCK线为低电平。
CPOL=1:在这种模式下,SPI的时钟信号在没有数据传输时的空闲态为高电平(High)。即SCK线在不传输数据时保持高电平。

时钟相位(CPHA):
CPHA=0:在这种模式下,数据在SCK时钟信号的第一个有效边沿(上升沿或下降沿,取决于CPOL设置)被采样。数据在下一个时钟边沿被锁存到接收寄存器中。
CPHA=1:在这种模式下,数据在SCK时钟信号的第二个有效边沿被采样。数据在前一个时钟边沿被锁存到接收寄存器中。

现在,我们可以用一个二维象限图来表示这两种参数的不同组合:
1.Mode 0(CPOL=0, CPHA=0):
空闲时,SCK为低电平。
数据在SCK的下降沿被采样,上升沿时数据被锁存。

2.Mode 1(CPOL=0, CPHA=1):
空闲时,SCK为低电平。
数据在SCK的上升沿被采样,下降沿时数据被锁存。

3.Mode 2(CPOL=1, CPHA=0):
空闲时,SCK为高电平。
数据在SCK的下降沿被采样,上升沿时数据被锁存。

4.Mode 3(CPOL=1, CPHA=1):
空闲时,SCK为高电平。
数据在SCK的上升沿被采样,下降沿时数据被锁存。

综上所述,通过设定不同的CPOL和CPHA组合,可以实现SPI通信的四种不同的时序模式,以适应不同设备的需求。在实际应用中,必须确保主从设备间的SPI模式匹配,才能保证正确可靠的数据传输。
在这里插入图片描述
在这里插入图片描述

7.SPI相关寄存器介绍

在这里插入图片描述

在这里插入图片描述

SPI(Serial Peripheral Interface)是一种常用的串行通信协议,在嵌入式系统和微控制器中广泛使用。下面是对您提到的几个关键SPI寄存器的详细说明:

1.SPI_CR1(SPI Control Register 1)
这个寄存器主要用于设置SPI的工作模式、速度、极性和相位等基本操作参数。它通常包含以下部分功能位:
MSTR:主/从模式选择,决定SPI设备作为主设备还是从设备。
BR[2:0] 或类似字段:波特率预分频设置,用于确定SPI总线的时钟频率。
CPOL 和 CPHA:用来设置时钟极性和相位,对应之前所描述的四种工作模式(Mode 0至Mode 3)。
SSM 和 SSI:硬件/软件管理片选信号的选择及内建的NSS信号的状态。
LSBFIRST:字节内的数据传输顺序选择,低位先传(LSB-first)或高位先传(MSB-first)。
SPE:SPI外设使能位,用于开启或关闭SPI模块

2.SPI_SR(SPI Status Register)
SPI状态寄存器用于反映SPI接口的实时状态,包括但不限于:
TXE:Transmit Buffer Empty,发送缓冲器空标志,当SPI准备好接受新的待发送数据时置位。
RXNE:Receive Buffer Not Empty,接收缓冲器非空标志,当SPI接收到有效数据并存放在接收缓冲器中时置位。
BSY:Busy,忙标志,SPI正在进行数据传输时置位。
可能还有其他标志如OVRE(Overrun Error)、CRCERR(CRC错误)等,用于指示SPI在数据传输过程中可能出现的各种异常状况。

3.SPI_DR(SPI Data Register)
SPI数据寄存器是SPI发送和接收数据的核心单元,通常具有两个独立的功能区域:
TXDR(Transmit Data Register):向此寄存器写入数据将会启动SPI发送过程,一旦数据发送完毕,硬件会自动清除该位置的数据准备下一次发送。
RXDR(Receive Data Register):读取此寄存器会获取到SPI从外部设备接收到的数据。当RXNE标志置位时,表明有新数据可读。

通过配置和监控这些寄存器,开发人员能够有效地控制SPI接口的操作和数据传输。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于STM32H7系列微控制器来说,SPI相关的寄存器略有不同,但基本功能相似。以下是针对H7系列的SPI寄存器介绍:

1.SPI时钟源选择:
寄存器:RCC_D2CCIP1R(RCC Domain 2 Configurable Clocks Peripherals 1 Register)
功能:通过设置此寄存器,可以选择为SPI模块分配合适的时钟源。

2.使能SPI:
寄存器:SPI_CR1(SPI Control Register 1)
功能:通过设置SPIEN位,可以开启或关闭指定SPI外设。

3.配置SPI工作参数:
寄存器:SPI_CFG1(SPI Configuration Register 1)
功能:用于配置SPI的传输速率、帧格式等基本参数。

寄存器:SPI_CFG2(SPI Configuration Register 2)
功能:进一步配置SPI的工作模式(例如CPOL、CPHA等)、NSS管脚的行为(硬件或软件控制)、数据传输顺序(MSB或LSB优先)等。

4.选择SPI模式:
寄存器:SPI_I2SCFGR(SPI/I2S Configuration Register)
注意:在H7系列中,某些SPI配置可能与其他系列有所不同,SPI_I2SCFGR寄存器用于选择SPI模式和其他相关配置。

5.查看SPI传输状态:
寄存器:SPI_SR(SPI Status Register)
功能:通过检查此寄存器中的标志位,如TXE、RXNE等,可以了解到SPI当前的传输状态。

6.发送数据寄存器:
寄存器:SPI_TXDR(SPI Transmit Data Register)
功能:向此寄存器写入数据时,数据会被放入发送FIFO队列中等待传输。

7.接收数据寄存器:
寄存器:SPI_RXDR(SPI Receive Data Register)
功能:从该寄存器读取数据时,可以从接收FIFO队列中取出已接收到的数据。

在STM32H7系列中,SPI外设可能集成了FIFO(First-In-First-Out)缓冲区,从而提高了数据传输的效率和性能。

8.相关HAL库驱动介绍

在这里插入图片描述
在这里插入图片描述
1.__HAL_RCC_SPIx_CLK_ENABLE(…)
关联寄存器:RCC_APB2ENR(或者RCC_APB1ENR、RCC_AHBxENR等,取决于SPI位于哪个APB或AHB总线上)
功能描述:该函数用于启用指定SPI外设的时钟,确保SPI模块能够正常工作。

2.HAL_SPI_Init(…)
关联寄存器:SPI_CR1(以及其他SPI配置寄存器如SPI_CFG1、SPI_CFG2、SPI_I2SCFGR等)
功能描述:初始化SPI外设,设置SPI的工作模式、速度、极性、相位、数据位宽、NSS管理模式、第一边沿采样或第二边沿采样等参数。

3.HAL_SPI_MspInit(…)
功能描述:这是一个用户自定义的回调函数,用于初始化与SPI相关的外围硬件,比如GPIO引脚配置,确保SPI的SCK、MISO、MOSI和NSS等引脚被正确配置为SPI功能。

4.HAL_SPI_Transmit(…)
关联寄存器:SPI_DR(SPI数据寄存器)和SPI_SR(SPI状态寄存器)
功能描述:向SPI外设发送数据,将数据写入SPI_TXDR寄存器,并等待发送完成。通过监控SPI_SR寄存器中的TXE和BTF(Buffer Transfer Finished)标志位来判断发送状态。

5.HAL_SPI_Receive(…)
关联寄存器:SPI_DR(SPI数据寄存器)和SPI_SR(SPI状态寄存器)
功能描述:从SPI外设接收数据,通过SPI_RXDR寄存器获取接收到的数据,并等待接收完成。通过监控SPI_SR寄存器中的RXNE标志位来判断接收状态。

6.HAL_SPI_TransmitReceive(…)
关联寄存器:SPI_DR(SPI数据寄存器)和SPI_SR(SPI状态寄存器)
功能描述:执行SPI的全双工通信,即同时发送和接收数据。数据发送和接收均通过SPI_DR寄存器,并监控SPI_SR寄存器中的相关标志位来确保操作完成。

7.__HAL_SPI_ENABLE(…)
关联寄存器:SPI_CR1(SPE位)
功能描述:使能SPI外设,设置SPI_CR1寄存器中的SPE(SPI Enable)位,激活SPI总线以便进行数据传输。

8.__HAL_SPI_DISABLE(…)
关联寄存器:SPI_CR1(SPE位)
功能描述:禁用SPI外设,清除SPI_CR1寄存器中的SPE位,暂停SPI总线的数据传输。
在这里插入图片描述
对于STM32H7系列微控制器来说,除了基本的HAL库函数外,确实需要使HAL_RCCEx_PeriphCLKConfig函数来配置SPI的时钟源。这是因为H7系列拥有更丰富的时钟树结构,SPI时钟可以源自不同的振荡器或者PLL分频输出。

9.HAL_RCCEx_PeriphCLKConfig:
此函数用于配置外设的特定时钟源,对于SPI而言,它可以设置SPI外设使用的时钟源(比如PLLI2S、PLLQ、HSI、HSE等),通过此函数可以灵活选择最合适的SPI时钟频率。
此外,STM32F7和STM32H7系列还提供了额外的SPI功能选项:

NSS管理:
SPI_CR2寄存器中的NSSP位可以配置NSS信号是否由硬件还是软件管理,这在SPI作为主设备时特别有用。

CRC功能:
SPI_CR1和SPI_CR2寄存器中的相关位可以启用或禁用SPI的CRC(循环冗余校验)功能,用于数据包的错误检测。

IO交换功能:
对于某些应用,可能需要在SPI通信中交换MOSI和MISO引脚的功能,H7系列的SPI提供了IO交换功能,可以通过SPI_I2SCFGR寄存器中的IOFFSET位来配置。

在使用HAL库进行SPI驱动开发时,开发者可以根据实际项目需求,利用这些附加功能来优化SPI接口的性能和灵活性。

2.UART协议

1.简介

在这里插入图片描述

2.工作原理

在这里插入图片描述

3.传输步骤

在这里插入图片描述

4.优缺点

在这里插入图片描述

3.I2C协议

1.简介

I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980年代初设计的,方便了主板、嵌入式系统或手机与周边设备组件之间的通讯。

由于其简单性,它被广泛用于微控制器与传感器阵列、显示器、IoT设备、EEPROM等之间的通信。结合了SPI和UART的最佳功能使用 ,您可以将多个从机连接到单个主机(类似 SPI)。

另外,您可以让多个主机控制单个或多个从机。当您希望多个微控制器将数据记录到单个存储卡或将文本显示到单个 LCD 时,这个特性就非常有用了。与UART 通信一样, 仅使用两根电线在设备之间传输数据:
在这里插入图片描述
SDA (Serial Data) – 这条线为主机和从机提供数据发送和接收功能。
SCL (Serial Clock) – 这条线为时钟信号线。
与 SPI 一样,I2C 是同步的,因此位的输出通过主机和从机之间共享的时钟信号同步到位的采样。时钟信号总是由主机控制。

在这里插入图片描述

2.工作原理(HOW WORKS)

使用 ,数据在消息中传输。消息被分解成数据帧。每条消息都有一个地址帧,其中包含从机的二进制地址,以及一个或多个包含正在传输数据的数据帧。该消息还包括每个数据帧之间的启动和停止条件、读/写位以及ACK/NACK位:
在这里插入图片描述
(1)启动条件(StartCondition):SDA 线在SCL线从高到低切换之前从高电位切换到低电位。
(2)停止条件(StopCondition):SDA 线在SCL线从低到高切换之后从低电位切换到高电位。
(3)地址帧(AddressFrame):每个从机都有唯一的7位或10位数列,主机可以通过该序列识别从机,主机如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址。
(4)读/写位(Read/Write Bit):指定主机是向从机发送数据(低电位)还是请求从机发送数据(高电位)的1个位。
(5)ACK/NACK位(ACK/NACK Bit):在一条消息中,每一帧后都跟随1个确认应答(ACK)/非确认应答(NACK)位。如果一个地址帧或数据帧是被成功接收,一个确认应答位(ACK bit)将从接收设备返回给发送设备。

3.寻址(ADDRESSING)

没有像SPI这样的从机片选接口线,所以它需要另一种方式让从机知道数据被发送到它,而不是另一个从机。它需要通过寻址来实现。地址帧始终是新消息中开始位后的第一帧。

主机将它想要与之沟通的从机的地址发送给与之相连的每一个从机。然后,每个从机将从主机发送的地址与自己的地址进行比较。如果地址匹配,它会向主发送低电压ACK位。如果地址不匹配,从机什么都不做,SDA线仍然很高。

4.读/写位(READ/WRITE BIT)

在地址帧的末尾包含一个单独的位,用于通知从机,主机是否想向它写数据还是想从它接收数据。如果主机要将数据发送给从机,读/写位是低电位;如果主机请求来自从机的数据,则该位为高电位1。

5 .数据帧(THE DATA FRAME)

在主机检测到从机发出的ACK位后,第一个数据帧已准备好发送。

数据帧始终为8位长,并且首先发送最重要的位。每个数据帧后面都立即有ACK/NACK 位,以验证帧是否已成功接收。在发送下一个数据帧之前,主机或从机(取决于谁发送数据)必须接收ACK位。

在发送完所有数据帧后,主机可以向从机发送停止条件以停止传输。停止条件是在SCL线路上从低到高过渡后,SDA线的电压从低到高过渡,SCL线保持高位。

6.数据传输的步骤(STEPS OF I2CDATATRANSMISSION)

1.主机发送启动条件给每一个连接的从机,在SCL线从高到低切换之前,主机将SDA线从高切换到低电平即可触发启动条件,即在SCL高电平时候给SDA一个下降沿,如下图所示,注意箭头的时序方向:
在这里插入图片描述

2.主机发送它想与之沟通的7位或10位从机地址,以及读/写位:
在这里插入图片描述
3.每个从机将从主机发送的地址与自己的地址进行比较。如果地址匹配,则从机通过将SDA 线拉低1个位来返回ACK位。如果主机的地址与从机自己的地址不匹配,则从机会将SDA线留在高电位(通过上拉电阻)。地址匹配的从机返回ACK位如下图所示:
在这里插入图片描述
4.主机发送或接收数据帧:
在这里插入图片描述

5.传输每个数据帧后,接收设备会将另一个ACK 位返回给发件人,以确认成功接收帧:
在这里插入图片描述

6.为了停止数据传输,主机发送一个停止条件给从机,通过在SDA拉高之前先拉高SCL,即在SCL高电平时候给SDA一个上升沿,如下图所示,注意箭头表示的传输顺序:
在这里插入图片描述

7.单主机与多从机(SINGLE MASTER WITH MULTIPLE SLAVES)

由于使用寻址,因此可以实现单个主机控多个从机。使用7位地址理论上可提供 128(27)个唯一地址。使用10位地址并不常见,但理论上可提供1024(210)个唯一地址。要将多个从机连接到单个主机,请像下面这样将它们连接起来,并用4.7K Ohm上拉式电阻器将SDA和SCL线连接到Vcc:
在这里插入图片描述

8 .多主机与多从机(MULTIPLE MASTERS WITH MULTIPLE SLAVES)

多个主机可以连接到一个单一的从机或多个从机。在多主机系统总,当两个主机尝试同时通过SDA线发送或接收数据时,问题就出现了。为了解决这个问题,每个主机在传输消息之前需要检测SDA线是低电平还是高电平。如果SDA线为低电平,则意味着另一个主机正控制着总线,该主机应等待发送消息。如果SDA线被拉高,则传输消息是安全的。

要将多个主机连接到多个从机,请按下图连接,并使用4.7K Ohm上拉式电阻器将SDA和 SCL线连接到Vcc:
在这里插入图片描述

9.的优缺点(ADVANTAGES AND DISADVANTAGES OF )

优势:
(1)仅使用两根电线
(2)支持多个主和多个从机
(3)ACK/NACK 位确认每个帧都成功传输
(4)硬件不如UART复杂
(5)众所周知和广泛使用的协议

缺点:
(1)数据传输速率低于SPI
(2)数据框架的大小限制为8位
(3)实现所需的硬件比SPI更复杂

10. 总结

(1)总线由9bit的块构成。开始条件:当SCL是高电平时候SDA从高到底跳变的下降沿,作为开始条件。在总线上的所有从机都要开始注意了:
在这里插入图片描述

(2)地址位为紧跟开始条件的7bit数据,主机想要与该地址从机沟通:
在这里插入图片描述

(3)读写位为紧跟7bit地址后的第8位作为读写选择位:该位用于表示主机是想读从机的数据还是想往从机里写数据:为1表示读;为0表示写。
在这里插入图片描述

(4)主机和从机之间的同步位:0表示ACK;1表示NACK。0:我在或数据已接收。1:没有我或数据未接收。
在这里插入图片描述

(5)数据字节:在地址字节后的8位是来自主机或从机的数据字节。至于来自谁,要看读写位。当写周期,主机发送数据;当读周期,从机发送数据:
在这里插入图片描述

(6)停止条件:当SCL是高电平时,数据线SDA从低电平跳变到高电平产生的上升沿作为停止条件。主机通知从机本次沟通结束。
在这里插入图片描述

(7)完整的总线协议时序,如下图所示:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值