Jialong's Blog

Do things I love, and seek happiness.

0%

串行通信协议详解:SPI、I2C、UART、JTAG

最近在画PCB研究几个MCU的时候遇到引脚连接方面的一些问题,对于MCU进行串行通信传输数据的过程不太了解,因此写一篇博客来学习一下这些通信协议。

串行通信协议详解:SPI、I2C、UART、JTAG

SPI、I2C、UART:串行通信协议

COM口:串行通信端口,是物理接口形式(硬件),一般有4针杜邦头和D型9针插头两种。可以有很多种协议

TTL、RS-232指的是电平标准

TTL电平:低电平为0,高电平为1

RS-232电平:正电平(+15V)为0,负电平(-15V)为1

一些概念

同步(Synchronous)和异步(Asynchronous)

同步就是整个处理过程顺序执行,当各个过程都执行完毕后,返回结果。这是一种线性执行的方式,执行的流程不能跨越。一般用于流程性比较强的程序。

异步:是只发送了调用的命令,调用者无需等待被调用的方法完全执行完毕,可以继续执行下面的流程,是一种并行处理的方式。比如页面数据架子啊的过程,不需要等待所有数据获取后再显示页面。

二者的区别就在于同步需要等待,异步不需要等待。

全双工和半双工

全双工是指可以同时进行双向信号传输。

半双工是指可以及进行双向信号传输但同一时刻只能向一个方向传输。

SPI协议

串行外设接口总线(Serial Peripheral Interface Bus,SPI)是一种用于芯片通信的同步串行通信接口规范,设备之间使用全双工模式通信,采用一对一或一对多的主从模式。一般用于短距离通信。

SPI物理层接口

SPI总线共规定了4个逻辑信号接口:

  • SCLK/SCK(Serial Clock):时钟信号线,由主机产生,决定了SPI的通信速率。
  • MOSI(Master Output, Slave Input):主机输出从机输入信号,数据由主机发出。
  • MISO(Master Input, Slave Output):从机输出主机输入信号,数据由从机发出。
  • nSS(Slave Select):片选信号:用于选取SPI从设备,每个从设备独立拥有该条nSS信号线,占据主机的一个引脚,从设备的其他总线是并联到主机的。从设备的nSS引脚被置拉低时表明该从设备被主机选中。

SPI_一对一

SPI_一对多

(图片来自维基百科序列周边接口

SPI协议层

SPI_photo_1

(图片来自SPI通讯协议介绍

如图为SPI的通信时序图,nSS、SCK、MOSI信号均由主机产生,MISO信号由从机产生。当nSS为低电平时信号有效。每个时钟周期MOSI和MISO传输一位数据。偶数边采样。

通信起始/结束信号

nSS信号由高电平变为低电平即为通信的起始,由低电平变为高电平即为通信的结束。

有效数据的采集

上图中SCK为偶数边沿时数据得到有效采样,此时MISO和MOSI的数据有效,高电平表示1,低电平表示0,其他时刻的数据无效。

数据传输时高位在先还是低位在先SPI协议并未规定,需要双方自行约定,一般采用高位在先(MSB)方式传输。

两个概念:

  • 时钟极性(CPOL):通信设备处于空闲状态(SPI开始通信前,即nSS无效)时,SCK的状态。
    • CPOL = 0:SCK在空闲时为低电平
    • CPOL = 1:SCK在空闲时为高电平
  • 时钟相位(CPHA):数据的采样时刻位于SCK的偶数边还是奇数边。
    • CPHA = 0:在SCK的奇数边沿采样
    • CPHA = 1:在SCK的偶数边沿采样

所以,数据的采样时刻并非由上升沿/下降沿所决定;在采样时刻,MOSI和MISO信号不能进行高低电平的变换。

所以,SPI有如下4种工作模式:

工作模式 CPOL CPHA 空闲时的SCK时钟 采样时钟 是否常用
0 0 0 奇数次边沿 Y
1 0 1 偶数次边沿 N
2 1 0 奇数次边沿 Y
3 1 1 偶数次边沿 N

$\mathrm{I}^2\mathrm{C}$协议

$\mathrm{I}^2\mathrm{C}$(Inter-Integrated Circuit)集成电路总线,是飞利浦设计的一种简单的双向两线同步串行总线,为了实现有效的IC之间的控制;是一种串行通信总线,为了让嵌入式设备连接低速设备。

I2C_trans

1024px-I2C.svg

$\mathrm{I}^2\mathrm{C}$只需要两个接口即可通信:

  • SDA(Serial Data):串行数据接口
  • SCL(Serial Clock):串行时钟

SDA和SCL都是双向线路,都通过一个电流源或上拉电阻接到正的电源电压,总线空闲时,这两条线路都是高电平。

$\mathrm{I}^2\mathrm{C}$总线支持任何IC生产过程。两线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别,而且都可以作为一个发送器或接收器。

$\mathrm{I}^2\mathrm{C}$总线是一个多主机的总线,即可以连接多于一个能控制总线的器件到总线。如果两个或多个主机同时尝试初始化传输数据,为了避免产生混乱,发展出了一个仲裁的过程。

$\mathrm{I}^2\mathrm{C}$的参考设计使用了一个7比特长度的地址空间,但是保留了16个地址,所以一组总线最多可以和112个节点通信。但连接到总线的接口数量其实是由总线电容是400pF的限制决定的(这里不深入了解)。

$\mathrm{I}^2\mathrm{C}$有几种常见的传输模式,标准模式(100kbps)、低速模式(10kbps),时钟频率可以被降为0,即可以暂停通信。

UART串口(PC上称为COM口,物理接口)

通用异步收发传输器(异步串行通信口)(Universal Asynchronous Receiver/Transmitter),其包括了RS232、RS449、RS423等接口标准规范和总线标准规范,这些标准规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容,实际上属于通信网网络的物理层概念(Physical Layer),与通信协议无直接关系。通信协议属于数据链路层的概念。

JTAG边界扫描

JTAG主要用于验证设计和测试印刷电路板。

电气特性

JTAG的接口是将4/5个接口连接到芯片上,电路板上的很多芯片可以将其JTAG接口通过Daisy Chain(菊花链)的方式连在一起,这样我们就可以访问一块印刷电路板上的所有芯片。

连接引脚为:

  • TDI(Test Data Input):测试数据输入
  • TDO(Test Data Output):测试数据输出
  • TCK(Test Clock Input):测试时钟
  • TMS(Test Model Selection):测试模式选择
  • TRST(测试复位)可选

Jtag_chain.svg

(图片来自维基百科JTAG

由于只有一条数据线,所以通信使用的协议应为串行传输;时钟从TCK引脚引入;配置通过TMS引脚采用状态机的方式一次操作一位来实现;TRST引脚是可选的相对待测逻辑低电平有效复位开关,通常为异步,有时也为同步。