一文讲解清楚UART IIC SPI外设协议

0.概述

在计算机的设备与设备之间或集成电路之间常常需要进行数据传输,本文主要讲解了三种外设协议,涉及编程的部分都是有关stm32F10x的库函数编程

1.UART IIC SPI在计算机网络中所处位置

这是一个比较有趣的视角,我们很多时候都是把uart iic spi做对比,但是如果把他们和HTTP MQTT这些协议做对比呢?

我们都知道计算机网络可以分为五层,即物理层 数据链路层 网络层 传输层 应用层

  • UART,IIC和SPI都是物理层协议,即它们负责在设备之间传输比特流,但是,它们也可以被看作是链路层协议,即它们负责在相邻设备之间建立连接
  • 而http和mqtt都处于应用层,都是基于tcp这个传输层协议

2. 通信概念

2.1 串行和并行通信

2.1.1 串行传输

串行通信技术,是指通信双方按位进行,遵守时序的一种通信方式。串行通信中,将数据按位依次传输, 每位数据占据固定的时间长度,即可使用少数几条通信线路就可以完成系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。串行通信多用于系统间通信(多主控制系统)、设备间(主控设备与附属设备)、器件间(主控CPU与功能芯片)之间数据的串行传送,实现 数据的传输与共享。

串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
在这里插入图片描述

2.1.2 并行传输

并行传输指的是数据以成组的方式,在多条并行信道上同时进行传输。常用的是将构成一个字符的几位二进制码同时分别在几个并行的信道上传输。另外加一条控制信号即“选通”脉冲,它在数据信号发出之后传送,用以通知接收设备所有位已经发送完毕,可对各条信道上的信号进行取样了。

并行传输时,一次可以传一个字符,收发双方不存在同步的问题。而且速度快、控制方式简单。但是,并行传输需要多个物理通道。所以并行传输只适合于短距离、要求传输速度快的场合使用。

这类传输比较简单,对8位微处理器来说,8位的数据一次同时传送。微处理器本身处理的数据就是并行处理,所以这就不需要对数据进行格式的变化。因此实现这类传输的接口电路也比较简单。

在这里插入图片描述

2.1.2 串行传输和并行传输的不同

在这里插入图片描述

2.2 全双工 半双工 单工

  • 全双工(Full Duplex)指的是通信双方可以同时发送和接收数据的通信方式,比如电话通信就是一种全双工通信方式。
  • 半双工(Half Duplex)指的是通信双方可以交替地发送和接收数据的通信方式,比如对讲机就是一种半双工通信方式。
  • 单工(Simplex)指的是通信双方只能单向地发送和接收数据的通信方式,比如广播电台就是一种单工通信方式。
    在这里插入图片描述

2.3 同步和异步

2.3.1 同步

同步传输是指在发送方和接收方之间建立了一个时钟同步信号来保持数据传输的同步。发送方按照时钟信号的节拍来发送数据,接收方也按照同样的节拍来接收数据。这种方式可以保证数据的可靠性和一致性,但是需要在传输前建立一个同步信号,且在传输过程中需要不断地维护同步信号,因此效率较低。

在这里插入图片描述

例如这张图我们可以设定当时钟线被拉高的时候数据的传输是有效的。

2.3.2 异步

异步传输则是指数据的传输不需要在发送方和接收方之间建立时钟同步信号,每个数据包都包含了自己的时钟信号和控制信息。发送方和接收方之间不需要保持同步,可以自由地进行数据传输,这种方式效率较高。但是由于数据包中包含了控制信息,因此数据包的大小通常会比同步传输中的数据块更大,也会有一定的数据丢失风险。

在这里插入图片描述

2.4 通信速率(比特率和波特率)

  • 比特率(Bitrate)是指单位时间内传输的比特数,通常用“bps”(bits per second)来表示。比特率是衡量数字通信系统中数据传输速度的一个重要指标,它表示在一秒钟内传输的二进制比特数,越高表示传输速度越快。

  • 波特率(Baud rate)则是指单位时间内传输的波特数,通常用“baud”来表示。波特率是衡量模拟通信系统中信号传输速率的一个指标,它表示在一秒钟内信号变化的次数,通常用于调制和解调中,例如调制解调器、调频电台、调幅电台等。

  • 两者之间的关系在于,波特率决定了在信号中每秒钟有多少个状态变化,而比特率则决定了每个状态变化中传输的比特数。在数字通信中,波特率和比特率通常是相等的,即每秒钟有多少个状态变化就传输多少比特,因此通常可以将它们混用。

  • 然而,在某些特定情况下,波特率和比特率可能不相等,比如在调制解调器中采用多符号调制技术时,一个符号可能传输多个比特,此时波特率与比特率就不相等。例如如果我们采用两个二进制表示一个码元,此时波特率就是比特率的一半,例如将两个二进制位当作一个码元的编码方式称为四相位编码(Quadrature Phase Shift Keying,QPSK)。在QPSK编码中,每个码元由两个相位表示,每个相位表示一个二进制位,因此每个码元包含两个二进制位。QPSK编码常用于数字调制技术中,可以将两个二进制位编码为四个不同的相位,从而实现高速数据传输。

在这里插入图片描述

3. USART—串口通信

3.1 串口通信简介

  • 串口通信是一种通过串口进行数据传输的通信方式,它是计算机和外部设备之间的一种基本的串行通信方式。串口通信通常使用异步串行传输,即数据位和停止位之间的时间间隔是不固定的,这种通信方式在现代计算机系统中已被大多数人认为过时,但是在很多嵌入式系统和一些老旧设备上,它仍然被广泛使用。

  • 对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的
    特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

下面我们分别对串口通讯协议的物理层及协议层进行讲解

3.2 串口通信的物理层

RS232标准

在这里插入图片描述

  • RS232(Recommended Standard 232)是一种串行通信协议和物理接口标准,也被称为EIA-232标准(Electronics Industries Association)。该标准最初由美国电子工业协会(EIA)于1962年发布,用于定义数据通信设备之间的接口和信号规范,广泛应用于计算机、调制解调器、打印机、条码扫描仪、传感器等设备之间的通信。
  • RS232标准定义了数据通信设备之间的物理连接方式,包括信号电平、数据位、校验位、停止位、传输速率等参数。RS232接口一般使用9个针脚,包括一个发送线(TX)、一个接收线(RX)、一个数据终端就绪线(DTR)、一个数据载波检测线(DCD)、一个数据集准备线(DSR)、一个数据终止线(DTR)、一个清除发送线(RTS)、一个清除接收线(CTS)和一个保护地线(GND)。
  • RS232标准中定义了三种不同的电信号电平:正电平、负电平和零电平。数据传输时,每个数据位使用一个电信号电平来表示,0通常表示负电平,1表示正电平,而停止位和校验位使用一个零电平来表示。
  • RS232标准中定义了不同的传输速率,通常称为波特率。波特率表示每秒钟传输的比特数,一般可选的波特率包括110、300、600、1200、2400、4800、9600、19200、38400等。RS232标准中还定义了两种数据格式:异步和同步传输。异步传输通常用于低速数据传输,而同步传输通常用于高速数据传输。
  • 总的来说,RS232标准定义了计算机和其他数据通信设备之间的通信方式和接口标准,是计算机和外部设备之间通信的基础,虽然它已经有些过时,但在一些特定的应用场合,仍然被广泛使用。
RS232和TTL电平
  • 芯片发出电平大多是TTL电平

  • RS232和TTL电平是两种不同的电信号标准,通常用于串口通信。

  • RS232标准是一种使用正电平、负电平和零电平来表示数据位、停止位和校验位的电信号标准。RS232标准的信号电平范围是-15V到+15V之间,信号电平越高表示的数据位为1,信号电平越低表示的数据位为0。RS232标准的信号电平较高,可以实现较远距离的传输,但需要使用较高的电压,并且需要进行电平转换和线路隔离等处理。

  • TTL电平是一种使用低电平和高电平来表示数据位和控制信号的电信号标准。TTL电平标准的信号电平范围是0V到5V之间,一般电压越高表示的数据位为1,电压越低表示的数据位为0。TTL电平标准的信号电平较低,可以使用较低的电压进行传输,但传输距离较短,需要考虑信号衰减和噪声等问题。

  • 在串口通信中,RS232和TTL电平通常需要进行转换。例如,如果计算机串口使用RS232电平,而外部设备使用TTL电平,需要使用电平转换芯片或电平转换电路进行转换。另外,需要注意的是,RS232和TTL电平的信号电平范围不同,不可以直接连接使用,需要进行电平转换和隔离处理。

在这里插入图片描述

在这里插入图片描述

DB9信号线

在最初的应用中, RS-232 串口标准常用于计算机、路由与调制调解器 (MODEN,俗称“猫” ) 之间的通讯,在这种通讯系统中,设备被分为数据终端设备 DTE(计算机、路由) 和数据通讯设备DCE(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。
在旧式的台式计算机中一般会有 RS-232 标准的 COM 口 (也称 DB9 接口),见图电脑主板上的COM 口及串口线 。

在这里插入图片描述

其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的 RS-232 标准调制的。在这种应用场合下, DB9 接口中的公头及母头的各个引脚的标准信号线接法见图 DB9 标准的公头及母头接法 及表 DB9 信号线说明

在这里插入图片描述

USB转串口
  • USB转串口是一种将USB接口转换为串口接口的设备或模块。由于现代计算机通常不再提供传统的RS232串口接口,而USB接口成为了主流接口之一,因此USB转串口设备可以方便地将计算机的USB接口转换为串口接口,实现串口通信功能。

  • USB转串口设备通常包括USB接口、串口接口、芯片及驱动程序等部分。其中,芯片通常采用CH340、CP2102等芯片,CH340是一种USB转串口芯片,可以将USB接口转换为TTL电平的串口信号,这些芯片可以将USB接口的数据转换为串口接口的数据,并实现数据的收发和控制。驱动程序则用于实现操作系统与USB转串口设备之间的通信,以实现串口通信的功能。

  • USB转串口设备的优点在于,它可以方便地连接到计算机的USB接口上,无需额外的电源和数据线,并且可以支持多个串口接口的功能。因此,在实际应用中,USB转串口设备通常被用于工业自动化、控制系统、医疗设备、通讯设备等领域,以实现串口通信功能。

原生的串口与串口通信

在这里插入图片描述

1、原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信

2、GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块

3.3 串口通信的协议层

串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见图串口数据包的基本组成。

在这里插入图片描述

  • 波特率:异步通讯中由于没有时钟信号 (如前面讲解的 DB9 接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,图串口数据包的基本组成 中用虚线分开的每一格就是代表一个码元。常见的波特率为 4800、 9600、 115200 等
  • 通讯的起始和停止信号:串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可
  • 有效数据:在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为 5、 6、 7 或 8 位长。
  • 数据校验:在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、 0 校验 (space)、 1 校验 (mark) 以及无校验(noparity)。
    • 奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个 8 位长的有效数据为: 01101001,此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位。
    • 偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧: 11001010,此时数据帧“1”的个数为 4 个,所以偶校验位为“0”。
    • 0 校验是不管有效数据中的内容是什么,校验位总为“0”, 1 校验是校验位总为“1”。

3.4 USART功能框图

USART 的功能框图包含了 USART 最核心内容,掌握了功能框图,对 USART 就有一个整体的把握,在编程时就思路就非常清晰。 USART 功能框图见如下
在这里插入图片描述

1. 功能引脚
  • TX:发送数据输出引脚。
  • RX:接收数据输入引脚
  • SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚
  • nRTS:请求以发送 (Request To Send), n 表示低电平有效。如果使能 RTS 流控制,当 USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时, nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
  • nCTS:清除以发送 (Clear To Send), n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制
  • SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

USART 引脚在 STM32F103ZET6 芯片具体分布见表 STM32F103VET6 芯片的 USART 引脚 。

STM32F103VET6 系统控制器有三个 USART 和两个 UART,其中 USART1 和时钟来源于 APB2 总线时钟,其最大频率为 72MHz,其他四个的时钟来源于 APB1 总线时钟,其最大频率为 36MHz。UART 只是异步传输功能,所以没有 SCLK、 nCTS 和 nRTS 功能引脚。

在这里插入图片描述

2. 数据寄存器
  • USART 数据寄存器 (USART_DR) 只有低 9 位有效,并且第 9 位数据是否有效要取决于 USART控制寄存器 1(USART_CR1) 的 M 位设置,当 M 位为 0 时表示 8 位数据字长,当 M 位为 1 表示 9位数据字长,我们一般使用 8 位数据字长。
  • USART_DR 包含了已发送的数据或者接收到的数据。 USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR 读取数据会自动提取 RDR数据
  • TDR 和 RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。
  • USART 支持 DMA 传输,可以实现高速数据传输,具体 DMA 使用将在 DMA 章节讲解。
3. 控制器

USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART, UE 位用来开启供给给串口的时钟。发送或者接收数据字长可选 8 位或 9 位,由 USART_CR1 的 M 位控制。

4. 发送器

当 USART_CR1 寄存器的发送使能位 TE 置 1 时,启动数据发送,发送移位寄存器的数据会在 TX引脚输出,低位在前,高位在后。如果是同步模式 SCLK 也输出时钟信号。

  • 一个字符帧发送需要三个部分:起始位 + 数据帧 + 停止位。起始位是一个位周期的低电平,位周
    期就是每一位占用的时间;数据帧就是我们要发送的 8 位或 9 位数据,数据是从最低位开始传输
    的;停止位是一定时间周期的高电平。

  • 停止位时间长短是可以通过 USART 控制寄存器 2(USART_CR2) 的 STOP[1:0] 位控制,可选 0.5
    个、 1 个、 1.5 个和 2 个停止位。默认使用 1 个停止位。 2 个停止位适用于正常 USART 模式、单
    线模式和调制解调器模式。 0.5 个和 1.5 个停止位用于智能卡模式。

  • 当发送使能位 TE 置 1 之后,发送器开始会先发送一个空闲帧 (一个数据帧长度的高电平),接下来就可以往 USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需要等待 USART 状态寄存器 (USART_SR) 的 TC 位为 1,表示数据传输完成,如果 USART_CR1 寄存器的 TCIE 位置1,将产生中断

在发送数据时,编程的时候有几个比较重要的标志位我们来总结下

在这里插入图片描述

5. 接收器

如果将 USART_CR1 寄存器的 RE 位置 1,使能 USART 接收,使得接收器在 RX 线开始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到 RDR 内,并把 USART_SR 寄存器的 RXNE 位置 1,同时如果USART_CR2 寄存器的 RXNEIE 置 1 的话可以产生中断。

在接收数据时,编程的时候有几个比较重要的标志位我们来总结下

在这里插入图片描述

6. 波特率

波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位 bit/s(bps)。对于 USART 波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。
USART 的发送器和接收器使用相同的波特率。计算公式如下

在这里插入图片描述

其中, fPLCK 为 USART 时钟, USARTDIV 是一个存放在波特率寄存器 (USART_BRR) 的一个无符号定点数。其中 DIV_Mantissa[11:0] 位定义 USARTDIV 的整数部分, DIV_Fraction[3:0] 位定义USARTDIV 的小数部分。

在这里插入图片描述

3.5 USART中断请求

USART 有多个中断请求事件,具体见表 USART 中断请求 。

在这里插入图片描述

3.6 USART编程结构体初始化

typedef struct {
    uint32_t USART_BaudRate; // 波特率
    uint16_t USART_WordLength; // 字长
    uint16_t USART_StopBits; // 停止位
    uint16_t USART_Parity; // 校验位
    uint16_t USART_Mode; // USART 模式
    uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
  • USART_BaudRate:波特率设置。一般设置为 2400、 9600、 19200、 115200。标准库函数会根据
    设定值计算得到 USARTDIV 值,从而设置 USART_BRR 寄存器值。

  • USART_WordLength:数据帧字长,可选 8 位或 9 位。它设定 USART_CR1 寄存器的 M 位的值。
    如果没有使能奇偶校验控制,一般使用 8 数据位;如果使能了奇偶校验则一般设置为 9 数据位。

  • USART_StopBits:停止位设置,可选 0.5 个、 1 个、 1.5 个和 2 个停止位,它设定 USART_CR2
    寄存器的 STOP[1:0] 位的值,一般我们选择 1 个停止位。

  • USART_Parity:奇偶校验控制选择,可选 USART_Parity_No(无校验)、 USART_Parity_Even(偶
    校验) 以及 USART_Parity_Odd(奇校验),它设定 USART_CR1 寄存器的 PCE 位和 PS 位的值。

  • USART_Mode: USART 模式选择,有 USART_Mode_Rx 和 USART_Mode_Tx,允许使用逻辑或
    运算选择两个,它设定 USART_CR1 寄存器的 RE 位和 TE 位。

  • USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,可选有 使
    能 RTS、 使能 CTS、 同时使能 RTS 和 CTS、 不使能硬件流。

当使用同步模式时需要配置 SCLK 引脚输出脉冲的属性,标准库使用一个时钟初始化结构体USART_ClockInitTypeDef 来设置,该结构体内容也只有在同步模式才需要设置。

USART 时钟初始化结构体
typedef struct {
    uint16_t USART_Clock; // 时钟使能控制
    uint16_t USART_CPOL; // 时钟极性
    uint16_t USART_CPHA; // 时钟相位
    uint16_t USART_LastBit; // 最尾位时钟脉冲
} USART_ClockInitTypeDef;
  1. USART_Clock:同步模式下 SCLK 引脚上时钟输出使能控制,可选禁止时钟输出 (USART_Clock_Disable) 或开启时钟输出 (USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定 USART_CR2 寄存器的 CLKEN 位的值。
  2. USART_CPOL:同步模式下 SCLK 引脚上输出时钟极性设置,可设置在空闲时 SCLK 引脚为低
    电平 (USART_CPOL_Low) 或高电平 (USART_CPOL_High)。它设定 USART_CR2 寄存器的 CPOL
    位的值。
  3. USART_CPHA:同步模式下 SCLK 引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕
    获数据 (USART_CPHA_1Edge) 或在时钟第二个变化沿捕获数据。它设定 USART_CR2 寄存器的
    CPHA 位的值。 USART_CPHA 与 USART_CPOL 配合使用可以获得多种模式时钟关系。
  4. USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在 SCLK 引脚输出,可以是
    不输出脉冲 (USART_LastBit_Disable)、输出脉冲 (USART_LastBit_Enable)。它设定 USART_CR2 寄
    存器的 LBCL 位的值

3.7 USART和UART有什么区别

  • USART是指单片机的一个端口模块,可以根据需要配置成同步模式(SPI,I2C),也可以将其配置为异步模式,后者就是UART。所以说UART可以称之为一个与SPI,I2C对等的“协议”,而USART则不是一个协议,而是更应该理解为一个实体。
  • USART可以在具有时钟信号的较快同步模式下运行,也可以在较慢的异步模式下运行,即UART。使用外部时钟使USART的数据速率远高于标准UART的数据速率。
  • UART很简单,仅提供其基本格式的几个选项,例如停止位的数量以及偶数或奇数奇偶校验。USART更复杂,可以生成与许多不同通信协议兼容的数据帧。

4. IIC通信

I2C 通讯协议 (Inter - Integrated Circuit) 是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、 CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路 (IC) 间的通讯。

4.1 IIC物理层

I2C 通讯设备之间的常用连接方式见图常见的 I2C 通讯系统

在这里插入图片描述

它的物理层有如下特点:
(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线 (SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
(4) 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
(6) 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
(7) 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制

4.2 协议层

I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节

4.2.1 读写流程

先看看 I2C 通讯过程的基本结构,它的通讯过程见图主机写数据到从机 、图主机由从机中读数据及图I2C通讯复合格式 。


在这里插入图片描述
在这里插入图片描述
这些图表示的是主机和从机通讯时, SDA 线的数据包序列。

  1. 其中 S 表示由主机的 I2C 接口产生的传输起始信号 (S),这时连接到 I2C 总线上的所有从机都会接收到这个信号
  2. 起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号 (SLAVE_ADDRESS)。在 I2C 总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据 I2C 协议,这个从机地址可以是7 位或 10 位。
  3. 在地址位之后,是传输方向的选择位,该位为 0 时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1 时,则相反,即主机由从机读数据
  4. 从机接收到匹配的地址后,主机或从机会返回一个应答 (ACK) 或非应答 (NACK) 信号,只有接收到应答信号后,主机才能继续发送或接收数据。

写数据

  1. 若配置的方向传输位为“写数据”方向,即第一幅图的情况,广播完地址,接收到应答信号后,主机开始正式向从机传输数据 (DATA),数据包的大小为 8 位,主机每发送完一个字节数据,都要等待从机的应答信号 (ACK),重复这个过程,可以向从机传输 N 个数据,这个 N 没有大小限制。当数据传输结束时,主机向从机发送一个停止传输信号 §,表示不再传输数据。

读数据

若配置的方向传输位为“读数据”方向,即第二幅图的情况,广播完地址,接收到应答信号后,从机开始向主机返回数据 (DATA),数据包大小也为 8 位,从机每发送完一个数据,都会等待主机的应答信号 (ACK),重复这个过程,可以返回 N 个数据,这个 N 也没有大小限制。当主机希望停止接收数据时,就向从机返回一个非应答信号 (NACK),则从机自动停止数据传输。

读写数据

除了基本的读写, I2C 通讯更常用的是复合格式,即第三幅图的情况,该传输过程有两次起始信号 (S)。一般在第一次传输中,主机通过 SLAVE_ADDRESS 寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址 (注意区分它与 SLAVE_ADDRESS 的区别);在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。

4.2.2 通讯的起始和停止信息

前文中提到的起始 (S) 和停止 § 信号是两种特殊的状态,见图起始和停止信号 。当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。起始和停止信号一般由主机产生。

在这里插入图片描述

4.2.3 数据有效性

I2C 使用 SDA 信号线来传输数据,使用 SCL 信号线进行数据同步。见图数据有效性 。 SDA 数据线在 SCL 的每个时钟周期传输一位数据。传输时, SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL 为低电平时, SDA的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备

在这里插入图片描述

每次数据传输都以字节为单位,每次传输的字节数不受限制。

4.2.4 地址及数据方向

I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址(SLAVE_ADDRESS) 来查找从机。 I2C 协议规定设备地址可以是 7 位或 10 位,实际中 7 位的地址应用比较广泛。紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位 (R/),第 8位或第 11 位。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。见图设备地址及数据传输方向

在这里插入图片描述

读数据方向时,主机会释放对 SDA 信号线的控制,由从机控制 SDA 信号线,主机接收信号,写数据方向时, SDA 由主机控制,从机接收信号。

4.2.5 响应

I2C 的数据和地址传输都带响应。响应包括“应答 (ACK)”和“非应答 (NACK)”两种信号。作为数据接收端时,当设备 (无论主从机) 接收到 I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答 (ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答 (NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。见图响应与非响应信号 。

在这里插入图片描述

传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制SDA,若 SDA 为高电平,表示非应答信号 (NACK),低电平表示应答信号 (ACK)。

4.3 什么是硬件IIC和软件IIC

  • 如果我们直接控制 STM32 的两个 GPIO 引脚,分别用作 SCL 及 SDA,按照上述信号的时序要求,直接像控制 LED 灯那样控制引脚的输出 (若是接收数据时则读取 SDA 电平),就可以实现 I2C 通讯。同样,假如我们按照 USART 的要求去控制引脚,也能实现 USART 通讯。所以只要遵守协议,就是标准的通讯,不管您如何实现它,不管是 ST 生产的控制器还是 ATMEL 生产的存储器,都能按通讯标准交互。
  • 由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式,也叫软件IIC
  • 相对地,还有“硬件协议”方式, STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来, CPU 只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C 协议的方式减轻了CPU 的工作,且使软件设计更加简单。也叫硬件IIC

5. SPI通信

SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等设备与 MCU 间,要求通讯速率较高的场合。

5.1 SPI物理层

在这里插入图片描述

SPI 通讯使用 3 条总线及片选线即需要用4根线, 3条总线分别为 SCK、 MOSI、 MISO,片选线为,它们的作用介绍如下:

(1) ( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、 CS,以下用 NSS 表示。当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、 MOSI 及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。 I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以 SPI 通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。

(2) SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备

(3) MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

(4) MISO(Master Input,, Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机

5.2 SPI协议层

与 I2C 的类似, SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。

5.2.1 通信流程

先看看 SPI 通讯的通讯时序,见图 SPI 通讯时序 。

在这里插入图片描述

这是一个主机的通讯时序。 NSS、 SCK、 MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。 MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

以上通讯流程中包含的各个信号分解如下

  • 通讯的起始和停止信号:在图 SPI 通讯时序 中的标号处,NSS 信号线由高变低,是 SPI 通讯的起始信号。 NSS 是每个从机
    各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号处, NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

  • 数据有效性 :SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。 MOSI 及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时, MSB先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用图 SPI 通讯时序 中的 MSB 先行模式。观察图中的标号处, MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在 SCK 的下降沿时被采样。即在 SCK 的下降沿时刻, MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效, MOSI 及 MISO 为下一次表示数据做准备。SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制

  • CPOL/CPHA 及通讯模式:上面讲述的图 SPI 通讯时序 中的时序只是 SPI 中的其中一种通讯模式, SPI 一共有四种通讯模式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性 CPOL”和“时钟相位 CPHA”的概念。时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时, SCK 信号线的电平信号 (即 SPI 通讯开始前、NSS 线为高电平时 SCK 的状态)。 CPOL=0 时, SCK 在空闲状态时为低电平, CPOL=1 时,则相反。时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时, MOSI 或 MISO 数据线上的信号将会在SCK 时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿”采样。见图
    CPHA = 0 时的 SPI 通讯模式 及图 CPHA = 1 时的 SPI 通讯模式 。

    由 CPOL 及 CPHA 的不同状态, SPI 分成了四种模式,见表 SPI 的四种模式 ,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”。

在这里插入图片描述

6.IIC UART SPI三种通信协议异同

IIC、UART 和 SPI 都是常见的串行通信协议,它们各有优点和适用场合,下面从同步异步、全双工半双工等角度进行分析:

同步异步:

  • IIC(Inter-Integrated Circuit):IIC是一种同步串行通信协议,其通信速率是通过时钟信号来控制的,通信双方需要共享同一个时钟线。在传输数据的过程中,数据线上的电平变化需要在时钟信号的上升沿或下降沿发生。
  • UART(Universal Asynchronous Receiver Transmitter):UART是一种异步串行通信协议,其通信速率不需要时钟信号来控制,可以根据需要进行调整。在传输数据的过程中,每个字节之间需要插入起始位、停止位和可能的校验位来同步数据。
  • SPI(Serial Peripheral Interface):SPI是一种同步串行通信协议,其通信速率是通过时钟信号来控制的,通信双方需要共享同一个时钟线。但是,SPI通信中每个设备都有一个专用的片选信号,用于选择与其通信的设备,因此它的同步性不如IIC协议那么强。

全双工半双工:

  • IIC:IIC协议支持全双工和半双工通信。在全双工通信中,通信双方可以同时进行发送和接收数据;而在半双工通信中,通信双方只能交替进行发送和接收数据。
  • UART:UART协议支持全双工通信,通信双方可以同时进行发送和接收数据。
  • SPI:SPI协议通常使用全双工通信,通信双方可以同时进行发送和接收数据。但是,SPI协议也可以使用半双工通信,这样可以减少通信线路的数量。

硬件复杂度

  • IIC:IIC协议的硬件复杂度相对较低,只需要两条信号线(时钟线和数据线),因此在硬件设计上比较容易实现。
  • UART:UART协议需要使用至少两条信号线(接收线和发送线),并且还需要考虑同步信号的问题,因此硬件复杂度相对较高。
  • SPI:SPI协议需要至少4条信号线(时钟线、MOSI线、MISO线和片选线),因此相对于IIC协议和UART协议,硬件复杂度更高。

可靠性:

  • IIC:IIC协议采用的是基于地址的通信方式,可以有效避免数据冲突的问题,因此具有很高的可靠性。
  • UART:UART协议在通信过程中容易出现数据冲突的问题,特别是在高速通信时,因此需要考虑数据校验的问题,以提高数据的可靠性。
  • SPI:SPI协议在通信过程中也容易出现数据冲突的问题,特别是在多个设备共享同一个时钟线时,因此也需要考虑数据校验的问题。

主从设备:

  • IIC:IIC协议支持多主设备和多从设备的通信方式,具有较高的灵活性。
  • UART:UART协议通常只支持一主一从的通信方式,不支持多主设备的通信方式。
  • SPI:SPI协议通常只支持一主多从的通信方式,不支持多主设备的通信方式。

传输速率

  • IIC:IIC协议的传输速率相对较慢,最高可达到400kbps。
  • UART:UART协议的传输速率可以比较灵活地调整,最高可达到115200bps,甚至更高。
  • SPI:SPI协议的传输速率相对较快,最高可达到几Mbps甚至几十Mbps。

总的来说,三种协议各有优点和适用场合。IIC协议适用于连接多个设备,如传感器、存储器等,因为它只需要两根线就可以实现通信。UART协议适用于远距离通信,因为它可以使用较低的通信速率进行通信。SPI协议适用于高速数据传输,因为它的通信速率可以高达几百兆赫兹。

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SPI接口简介    SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。SPI接口   SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。   SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。   SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件, [编辑本段] 接口包括以下四种信号:   (1)MOSI – 主器件数据输出,从器件数据输入   (2)MISO – 主器件数据输入,从器件数据输出   (3)SCLK – 时钟信号,由主器件产生   (4)/SS – 从器件使能信号,由主器件控制   在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。 多个从器件硬件连接示意图   在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。   SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数   据改变,同时一位数据被存入移位寄存器。    通讯时序图 [编辑本段] SPI接口内部硬件图示:   最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。   

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值