文章目录[隐藏]
前言
IIC、SPI、UART都是常见的低速板级通信协议,目前主流的SoC都内置了这些通讯协议的控制器,同样,各种传感器、Touch控制器、指纹模块、蓝牙模块、WIFI模块也都兼容这三种通信方式的一种或几种。
异同点:首先,IIC和SPI都是同步协议,都有时钟信号,在一条总线上也都可以挂多个从机,但是IIC的从机是通过器件地址来区分的,SPI的从机是通过片选线来区分的,所以SPI总线上,每多挂一个从机,就要多用一个线作为片选线,而IIC则不用,只要器件地址不冲突,可以随便挂器件。但是,IIC总线速度一般普遍慢于SPI,IIC一般的速度是100kbs、400kbps和1Mbps,而SPI的速度可以在几Mbps,也可以10+Mbps。UART和SPI、IIC不同,它是异步传输的,一般来说传输速度比较慢,传统的传输速度一般在115200bps或以下,不过现在大部分UART控制器也能支持到4Mbps或者8Mbps了。
使用场景:低速可以选用IIC,如果想速度快点,则一般都要选用SPI。另外,IIC总线的管脚都是开漏输出,必须外接上拉电阻,阻值(一般在4.7k~10k之间)可以根据总线速度来推算。
UART、SPI、IIC协议对比:
对比项 | UART | SPI | IIC |
---|---|---|---|
信号线数目 | 3根(RX、TX、GND) | 4根(MISO、MOSI、SCLK、CS) | 2根(SDA、SCLK) |
设备从属关系 | —— | 主从架构。SPI用片选信号CS选择从机。 | 多主从架构。IIC用地址选择从机。 |
通信方式 | 全双工通信 | 全双工通信 | 半双工通信 |
通信速率 | 速度慢 | 比IIC总线要快,速度可达到几Mbps | IIC的速度比SPI慢。具体见本文IIC模式 |
应用领域 | ①UART常用于控制计算机与串行设备的芯片。②像常说的串口,基本都用于调试。 | 主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 | IIC一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块。 |
传输距离 | —— | —— | IIC需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信 |
通信特征 | 异步串行,一帧可以传5/6/7/8位。一般从最低位开始传。 | 同步串行,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传。 | 同步串行,电平信号,一次连续8bit。从最高位开始传。 |
协议复杂度 | 结构比较复杂 | SPI实现要比UART简单,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 | 协议比SPI复杂,但是连线比标准的SPI要少。 |
对比 | —— | 在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比IIC系统要稍微复杂一些。 | —— |
一、UART
1、概述
UART(通用异步收发传输器)是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。在UART上追加同步方式的序列信号变换电路的产品,被称为USART。
UART由波特率产生器、UART接收器、UART发送器组成。UART的框架图如下所示:UART
因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。为了解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步;双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。即设备间要使用UART串口通信就必须先约定好传输速率(波特率)和一些数据位。
2、电路连接图
在UART通信中,两个UART通过两条线RX/TX相连可直接通信,连接如下图所示:
UART可将要传输的资料在串行通信与并行通信之间加以转换,即发送端的UART将来自控制设备(如CPU)的并行数据转换为串行数据,以串行方式将其发送到接收端的UART,然后由接收端的UART将串行数据转换为并行数据以用于接收设备的正常处理。UART通常被集成于其他通讯接口的连接上。UART即我们通常说的“串口”。
3、通信协议
UART工作原理是以字符为传输单位(一般是ASCII),将数据的二进制位一位一位的按顺序进行传输,传输方向可以选择MSB或LSB。通信中两个字符间的时间间隔是不固定的 ,然而同一个字符内两个相邻位之间的时间间隔是固定的。
帧间隔:即传送数据的帧与帧之间的间隔大小,可以用位或者时间为计量。
起始位:开始进行数据传输时,发送方先发一个逻辑0,表示传输字符的开始;依靠检测起始位来实现发送与接收方的时间自同步的。
数据位:即要传输的数据,可以是4、5、6、7、8位逻辑0或者1,构成一个字符,通常采用ASCII码。在大多数情况下,数据首先以低有效位(LSB)发送。如ASCII码8位数据位,从最低位开始传送,靠时钟定位。
校验位:若为奇偶校验,则数据位加上这一位后,使得“1”的位数为偶数(偶校验)或奇数(奇校验)以此来校验数据传送的正确性。若为高校验和低校验,则要知道高位和低位不是真正的检查数据,而是强行将校验位设置为逻辑高或者逻辑低。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
停止位:是一个字符数据的结束标志,可以是1位、1.5位、2位的高电平。适用于停止位的位数越多,不同时钟同步的容忍程度越大,数据传输率同时也越低。
空闲位:UART协议规定,当总线处于空闲状态时信号线的状态为逻辑‘1’即高电平,表示当前线路上没有数据传送。
4、波特率
数据的传送速率用波特率来表示(单位bps),即每秒钟传送的二进制位数,常见的波特率9600bps,115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。
例子:如果串口波特率设置为9600bps,那么传输1bit需要的时间是:(1/9600)s*10^6≈104.2us。
5、传输方向
传输方向:决定数据传输时,数据位从最高有效位(MSB)开始传输还是从最低有效位(LSB)开始传输。
UART一般为LSB方向。
例子:要传输字母’A’,其ASCII值为65,对应二进制值是01000001,如果MSB就是01000001;如果LSB就是10000010。
6、数据传输
数据传输过程:
①发送端UART从数据总线转换并行数据;
②发送端UART将起始位,奇偶校验位和停止位添加到数据包中;
③整个数据包从发送端UART串行发送到接收端UART;接收端UART按照预先配置好的波特率对数据线进行采样;
④接收端UART解析接收的数据,丢弃数据包中的起始位,奇偶校验位和停止位;
⑤接收端UART将串行数据转换回并行数据,并将其传输到接收端的数据总线。
7、UART / RS232 / RS485
UART是异步串行通信口的总称。 而RS232、RS449、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。在串口通信中,它们的主要区别在于其各自的电平范围不相同。嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。
串口:在嵌入式里指的是UART口,常用TTL电平即3.3V或者5.0V。
COM口:在台式机上常用的口,接口协议只有两种RS232(如DB9接口)和RS485。
UART口、COM口指的是物理接口形式。
TTL、RS232和RS485指的是电平逻辑标准。
TTL电平和RS232电平转换专用芯片有MAX232;TTL电平转USB芯片有CP2102、PL2303、FT230等用USB来扩展串口数量。
(1)TTL
TTL全名是晶体管-晶体管逻辑集成电路。
- 输入高电平最小2V,输出高电平最小2.4V,典型值3.4V;
- 输入低电平最大0.8V,输出低电平最大0.4V,典型值0.2V。
(2)RS232
RS232 逻辑1电平(MARK)=-5V~-12V,逻辑0电平(SPACE)=+5~+12V;
对于传输数据0x55,即二进制的01010101,RS232和TTL的区别如下:
(3)RS485
RS485是差分信号进行串行传输;
- 逻辑1以两线间的电压差为+(2~6)V表示;
- 逻辑"0"以两线间的电压差为-(2~6)V表示;
在工业通信中,使用RS485比较多,因为RS485是差分信号,可以抑制共模干扰,因此在恶劣的环境中拥有很好的抗干扰性,比较稳定。
8、CTS/RTS流控
参考:
1、RTS与CTS的含义
如果UART只有RX、TX两个信号,要流控的话只能是软流控;如果有RX,TX,CTS ,RTS四个信号,则多半是支持硬流控的UART;如果有 RX,TX,CTS ,RTS ,DTR,DSR 六个信号的话,RS232标准的可能性比较大。
如果收发是有关联关系的,很多情况下需要关注流控。UART的CTS/RTS用于硬流控,协调双方收发,保证数据不丢失。一般接线如下:
设备A | 接线 | 设备B |
---|---|---|
TX | → | RX |
RX | ← | TX |
RTS | → | CTS |
CTS | ← | RTS |
设备A通过UART发送数据,当设备B拉高RTS时,A就会暂停发送;当芯片B拉低RTS时,A又会继续发送。比如 WIFI模组与AP的串口连接:
9、例子
以9600 8 N 1(9600波特率,8个数据位,没有校验位,1位停止位)为例,这是目前最常用的串口配置,现在我们传输’O’ 'K’两个字母。'O’的ASCII值为79,对应的二进制值为01001111 ;'K’的ASCII值为75,对应的二进制值为01001011 。传输方向为LSB。传输的格式数据如下图所示:
串口波特率为9600,1bit传输时间大约为104us,传送一个数据实际是10个比特(开始位,8个数据位,停止位),一个bytes传输速率实际为9600*8/10=7680bps。
10、优缺点
(1)优点
①通信只需要两条数据线。
②无需时钟信号。
③有奇偶校验位,方便通信的差错检查。
④只需要接收端和发送端设置好数据包结构,即可稳定通信。
(2)缺点:
①数据帧最大支持9位数据。
②不支持多主机或多从机的主从系统。
二、SPI
1、概述
SPI(串行外设接口)是一种高速的,全双工,同步串行的通信总线,是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。
SPI没有统一的协议规范,但是基于其广泛的使用,根据实际使用中大家通用的习惯形成了一个类似行规的标准,即其已成为一种事实标准。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主机(且只能是一个)和一个或多个从机,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。因为一个主机可以挂多个从机,则通过片选引脚对从机进行选择。从机的工作时钟则是来自于主设备的SCK线。
①MISO(也称DOUT、DO、SDO、SO):主机数据输入,从机数据输出;
②MOSI(也称DIN,DI,SDI、SI):主机数据输出,从机数据输入;
③SCLK(也称SCK、CLK):时钟信号,由主机产生;时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。
④CS(也称nCS、SS、nSS、CE、SSEL、CSB、CSN、EN、STE、SYNC):从机使能信号,由主机控制,低电平有效。
(1)SPI总线可以实现多SPI设备互相连接。提供时钟的SPI设备为主机(Master),其他设备为从机(Slave)。SCLK信号线只由主机控制,从机不能控制信号线。
(2)在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,而SPI接口的读写操作都是由主机发起,主机通过片选线来确定要通信的从机(如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据)。这就要求从机的MISO接口具有三态特性(高电平、低电平、高阻),使得当CS无效时(即该设备未被选中),它们的MISO信号输出高阻态(啥都没接的状态)。若从机的MISO接口不支持高阻输出,则无法应用于多从机的SPI系统。
(3)主从机间可以实现全双工通信,收发独立,操作简单,数据传输速率较高,但需要占用主机较多的口线(每个从机都需要一根片选线),而且只支持单个主机,没有指定的流控制,没有规定最大传输速率,没有地址方案,没有应答机制确认是否接收到数据。
(4)数据输出通过MOSI线,数据在时钟上沿或下沿时改变(即发送),在紧接着的下沿或上沿被读取,从而完成一位数据传输。数据输入也使用同样原理。因此,8位数据的传输,至少需要8次时钟信号的改变(上沿和下沿为一次)。
(5)普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主机控制,当没有时钟跳变时,从机不采集或传送数据。也就是说,主机通过对SCLK时钟线的控制可以完成对通讯的控制。
(6)SPI接口在CPU和外围低速器件之间进行同步串行数据传输,在主机的移位脉冲下,数据按位传输,高位在前(MSB),低位在后,为全双工通信。
2、电路连接图
若芯片产品上,对SPI两条数据线的命名为MISO/MOSI,则连接时将主机与从机上名字相同的4对接口两两互联,即可完成了接口的互联。
若芯片产品上,对SPI两条数据线的命名为SDO/SDI,此时需要将主机的SDO连接到从机的SDI,将主机的SDI连接到从机的SDO。
(1)当只有一个主机、一个从机时,连接如下:
(2)当存在一个主机、多个从机时(注意,当主机上有n个CS时,对应可以连接n个从机),连接如下:
①SCLK/MOSI/MISO三个接口采取复用模式连接,不同CS单独连接对应的从机,CS信号绝不可复用。
缺点:随着从机数量的增加,来自主机的片选线的数量也增加。这会快速增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。
解决方法:可以使用其他技术来增加常规模式下的从机数量,例如使用多路复用器产生片选信号(参考:文中的“ADI公司支持SPI的模拟开关与多路转换器”部分)。
②菊花链模式连接
- 并非所有SPI器件都支持菊花链模式。请参阅产品数据手册以确认菊花链是否可用。
在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。
使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需的时钟周期数与菊花链中的从机位置成比例。例如在8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下只需8个时钟脉冲。
时钟周期和通过菊花链的数据传输如下图所示(SCK为时钟信号,8clks表示8个边沿信号;其中D为数据,X为无效数据):
补充:
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。SPI在硬件设计上采用的双数据线制,在SPI通信过程中,主从机(模式要相同)之间会形成一个数据环形链路,也就是说,要发一个数据必然会收到一个数据;要收一个数据必须也要先发一个数据。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
如上图所示,SPI中的核心组件为SSPSR移位寄存器,SSPBUF为数据缓冲区,控制器输出(接收)同步时钟信号和片选信号。
3、通信协议
3.1、时钟极性(CPOL)和时钟相位(CPHA)
SPI接口允许用户通过CPOL和CPHA来灵活选择时钟的上升沿或下降沿来采样或移位(即发送)数据。
CPOL:时钟极性, 表示 SPI 在空闲时, 时钟信号是高电平还是低电平。
- 等于1时,表示时钟空闲时为高,时钟低电平有效
- 等于0时,表示时钟空闲时为低,时钟高电平有效
说明:
- 空闲状态是指传输开始时CS为高电平且在向低电平转变的期间,以及传输结束时CS为低电平且在向高电平转变的期间。
CPHA:时钟相位, 决定数据传输采样和移位方式,即表示 SPI 设备是在SCK管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样。
- 等于1时,表示数据采样发生在时钟偶数(2,4,6,…,16)边沿(包括上下边沿)
- 等于0时,表示数据采样发生在时钟奇数(1,3,5,…,15)边沿(包括上下边沿)
在SPI通信中,主机根据选择CPOL和CPHA可将SPI数据传输分为四种模式:
SPI模式 | CPOL | CPHA | 空闲状态下的时钟极性 | 采样/移位数据的时钟相位 |
---|---|---|---|---|
0 | 0 | 0 | 低电平 | 数据在上升沿采样,在下降沿移位 |
1 | 0 | 1 | 低电平 | 数据在上升沿移位,在下降沿采样 |
2 | 1 | 0 | 高电平 | 数据在上升沿移位,在下降沿采样 |
3 | 1 | 1 | 高电平 | 数据在上升沿采样,在下降沿移位 |
3.2、时序
在下面示例中,数据显示在MOSI和MISO线上。传输的开始和结束用绿色虚线表示,采样边沿用橙色虚线表示,移位边沿用蓝色虚线表示。请注意,这些图形仅供参考。要成功进行SPI通信,用户须参阅产品数据手册并确保满足器件的时序规格。
模式0:
模式1:
模式2:
模式3:
- 主从机必须使用相同的工作模式(主机必须根据从机的要求选择)——SCLK、CPOL 和 CPHA,才能正常工作。
- 如果有多个从机,并且它们使用了不同的工作模式,那么主机必须在读写不同从机时需重新修改对应从机的模式。
4、数据传输
SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。CS通常是低电平有效信号。因此,主机必须在CS片选信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线MISO/SDI上的数据)同时进行,通常都是MSB位先传输。欲确定使用SPI接口传输的数据位数,请参阅器件数据手册。
具体步骤如下:
①主机先将对应的CS片选信号线拉低,表示与该设备进行通信;
②主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据;
③主机发送到从机时:主机将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
④主机接收从机数据:从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
例如,选择模式3的数据传输过程如下图所示:
注意:SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。
补充:
- SPI只要四根信号线连接正确,SPI模式相同,将CS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作。
- SPI接口是一种典型的全双工接口,通过同步时钟SCLK的脉冲将数据一位位地传送。所以在开始通讯前,主机首先要配置接口时钟(确定其通讯频率是从机可以支持的,通常为数兆赫兹)。当主机片选一个从机时,每向从机发送一个周期的SCLK信号,都会有1bit的数据从MOSI发送至从机,与此同时,从机每收到一个周期的SCLK信号,都会从MISO向主机发送1bit的数据。这种全双工通讯,是由硬件保证的(主机与HOST中各有一个移位寄存器作为收发数据的缓存)。
- SPI是一个很开放的接口,指令解析、帧大小、LSB/MSB、传输速率等规则并没有一个完善的定义,不同的SPI设备在这些方面的定义会有不同,即具有SPI接口的主机与从机之间的命令、数据解析都可以自定义,只要保证主机与从机之间采用相同的规则就好。不同SPI芯片,每次连续传输的数据量的大小(取决于主机、从机中缓存最小的那个)常常不同。当一次连续通讯的的数据量超过帧的大小时,会出现数据丢失的现象。所以,每完成1帧的传输后,主机会停止接口时钟输出,主机和从机读取、处理收到的数据,然后进行下一帧的传输。
- 在SPI接口协议中,并没有中断的定义,但是实际应用中,我们可以使用接口中断提高接口通讯速度。比如从机是负责数据数据加解密的,主机下发一组明文给从机加密,如果此时有个从机输出到主机的中断信号,那么主机可以清楚的知道何时从机完成了数据处理并读出处理结果,不必通过查询一遍遍的等待结束。
5、SPI接口的变形
一般SPI的一个时钟周期可以进行全双工的1bit数据通讯。而实际应用中,如果对于全双工的需求不高,而且期望提高通讯速度的话,可以选用SPI中两种常见变形,这将会很大程度的提高单方向上数据传输的速度,但是也会增加接口资源的开销。
(1)两线模式的SPI
SCLK与CS信号保持不变,MOSI与MISO则变形为DATA_0与DATA_1。
DATA_0与DATA_1是输入输出状态由Master配置的数据管脚:当主机打算向从机中写数据时,处于输出状态;当主机打算由从机读数据时,处于输入状态。
(2) 四线模式的SPI
SCLK与CS信号保持不变,MOSI与MISO删除,新增四条数据线DATA_0~3。
DATA_0~3是输入输出状态由主机配置的数据管脚:当主机打算向从机中写数据时,处于输出状态;当主机打算由从机读数据时,处于输入状态。
6、例子
例子:假定主机和从机初始化就绪,并且主机的寄存器sbuff=0xaa=0b1010 1010,从机的寄存器sbuff=0x55=0b0101 0101。规定上升沿发送、下降沿接收、高位先发送(MSB)。
下面将分步对SPI的8个时钟周期的数据情况演示一遍,如下表所示:
上表示上升沿、下表示下降沿,SDI、SDO相对于主机而言的(所谓的进出,是针对信号进出主机而言)。
由上表可知:
①一个时钟周期完成1bit数据的发送与接收。
②因为主机与从机的数据传输方向都是MSB,所以当上升沿到来时,SDO对应主寄存器的最高位,SDI对应从寄存器的最高位,而主从寄存器最右边都是未知的,所以用x代表。
③当下降沿到来时,SDI上的电平将存到主机的寄存器中的最低位(最右边),SDO上的电平将存到从机的寄存器的最低位(最右边),则此例中主机寄存器=0101010SDI(SDI表示1bit),从机寄存器=1010101SDO,即将接收到的数据填充到最右边。
④8个时钟周期完成了一次数据交换,即两个寄存器的内容互相交换一次,也就是完成里一个spi时序。
⑤根据以上分析,一个完整的传送周期是16位。因为主机首先要发送命令过去,然后从机准备数据,主机在下一个8位时钟周期才把数据读回来。
7、优缺点
(1)优点
①全双工串行通信。
②高速数据传输速率。
③简单的软件配置。
④极其灵活的数据传输,不限于8位,它可以是任意大小的字。
⑤非常简单的硬件结构。从机不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
(2)缺点
①没有硬件从机应答信号(主机可能在不知情的情况下无处发送)。
②通常仅支持一个主设备。
③需要更多的引脚(与I2C不同)。
④没有定义硬件级别的错误检查协议。
⑤与RS-232和CAN总线相比,只能支持非常短的距离。
三、IIC
参考:IIC协议代码例子可参考此文
1、概述
IIC(集成电路总线)是一种串行通信总线,使用多主从架构,即允许有多个主机(Master)并且每个主机都可以与所有的从机(Slaves)通信(主机之间不可通过IIC通信,并且每个主机只能轮流使用IIC总线)。主机(通常是微处理器)是指启动数据传输并在总线上生成时钟信号以驱动该传输的设备,而被寻址的设备都作为从机 。
IIC一般有两根信号线,一根是双向的数据线SDA,另一根是双向的时钟线SCL。数据线用来传输数据,时钟线用于数据收发同步。
①SCL(serial clock):时钟线,传输时钟信号,一般是IIC主机向从机提供时钟的通道。
②SDA(serial data):数据线,通信数据(命令、地址、数据)都通过SDA线传输。
串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。
串行时钟线SCL也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。
2、电路连接图
SDA和SCL总线通过上拉电阻(一般在4.7k~10k之间)与电源相连接。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
IIC器件内部结构如下图:
(1)由1,2箭头指示可知 IIC器件内部采用了开漏的方法,总线被上拉,即总线状态只能是被下拉为0(当MOS管输入0的时候) 。只要有一方下拉了总线,总线状态必定为0。也就是说,总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。
(2)任何一个器件都能像主控器一样工作,并控制总线,但同一时刻只能有一个主控器件。而且同一时刻,只能有一个从器件和主器件通信,其他从器件处于“冬眠”状态。
(3)每个接到I2C总线上的器件都有唯一的地址addr(系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份(可编程部分决定了某类器件可接入总线的最大数目,),细节视芯片而定,看datasheet),共7个bit,广播地址全0。根据器件的能力,作为发送器或接收器工作。
(4)在协议体系中,传输数据时都会带上目的器件的设备地址,因此可以实现设备组网。
3、IIC模式
IIC模式 | 速度 |
---|---|
Standard-mode (Sm)普通模式 | 100 kbit/s |
Fast-mode (Fm)快速模式 | 400 kbit/s |
High-speed mode (Hs-mode)高速模式 | 3.4 Mbit/s |
Fast-mode Plus (Fm+)快速+模式 | 1 Mbit/s |
Low-speed mode(Ls-mode)低速模式 | 10kb/s |
4、通信协议
IIC协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号都是由主机产生。
总线在空闲状态时,SCL和SDA都保持着高电平。
(1)从地址位:共7bit(新标准10bit),是器件的唯一地址,主从机之间的数据传输是建立在地址的基础上,也就是说,主机在传输有效数据之前要先指定从机的地址。
(2)读/写位:1bit,决定数据传输方向,若为“0”表示主机向从机写数据;若为“1”表示主机由从机读数据。
(3)应答位:1bit。若为“0”表示应答(ACK);若为“1”表示非应答(NACK)。
(4)数据位:8bit,传输的具体数据。
IIC通信时序可分为起始信号、终止信号、应答0、非应答1。
注:主机做的都是编程控制,从机做的都是自主控制,也可以说是硬件控制,如主机给应答信号是编程控制,但是从机给应答信号是硬件控制,我们只需要检查在SDA为高期间,SCL保持低电平一些时间,即可判定从机给了主机应答信号。
4.1、应答信号
IIC总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果从机忙, 它可以使 SCL保持在低电平,这会强制使主机进入等待状态。当从机空闲后,并且释放时钟线,原来的数据传输才会继续。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。
4.2、一个字节数据的传输过程
(1)当没有数据传输的时候(空闲状态),SDA和SCL同时为高电平。数据传输开始时,需要发送一个起始信号;数据传输结束后,需要发送一个终止信号;每8bit数据传输结束,都需要一个ACK。起始和终止信号都由主机发出,而ACK则可能由主机或者从机来发出。
①开始信号:SCL为高电平,SDA的电平由高跳到低表示开始信号。
②终止信号:SCL为高电平,SDA的电平由低跳到高表示终止信号。
(2)在数据的传输过程中,SCL为高电平时,外设模块开始采集SDA数据线上的数据,此时要求SDA数据线上的电平状态必须稳定(不然无法知道这一位数据是0还是1)。而SCL为低电平时,SDA线才能改变传输的数据bit状态,即当SCL为低电平时才允许SDA线上的数据跳变成另外一种状态。
(3)在SDA传输完一个字节之后,主机会释放SDA线(即SDA=1),这时SDA处于高电平的状态,从机就可以控制SDA线了。若从机下拉了SDA线(使SDA线上为稳定的低电平)并且主机在SDA读到了一个低电平,则表示从机发送了一个确认信号(0)即进行了应答(ACK)。若从机不对SDA线下拉,则主机读到SDA依然为高电平,故表示一个非应答信号(1,NACK)。
补充:
- SDA传输数据是大端传输(MSB),是以字节为单位的,即发送到SDA线上的每个字节必须是8位。每次传输可以发送的字节数量不受限制,但每个被传输的字节后面都必须跟着一位应答位(即一帧共有9位)。
- 如果从机要完成一些其他功能后(如一个内部中断服务程序)才能接收或发送下一个完整的字节,可以使时钟线SCL保持低电平迫使主机进入等待(wait)状态。当从机准备好新的字节数据传输时,释放时钟线SCL,数据传输便继续进行。
- 设备地址数的问题:理论上7位由128位地址,然而除去保留几个保留地址如广播地址0x00等,数量少于128个,且标准协议里遇见了地址的局限性,扩充了10位地址的概念。
- 对于IIC可以挂多少个设备的问题:对于同一个地址的设备来说,在不进行地址扩充(片选)的情况下只能挂一个,对于不同的设备来说,标准协议里面没由限制具体的个数的多少,这个由线路布线情况,软件情况以及工作模式确定。对于标准模式,只要总线上的负载电容不超过400pf,不超过芯片的负载能力既可以。
5、数据传输
5.1、重复开始条件
有时主机需要在一次通信中进行多次消息交换(例如与不同的从机传输消息,或切换读写操作),并且期间不希望被其他主机干扰,这时可以使用“重复开始条件” —— 在一次通信中,主机可以产生多次起始信号,来完成多次消息交换,最后再产生一个终止中结束整个通信过程。由于期间没有终止信号,因此主机一直占用总线,其他主机无法切入。
为了产生一个重复的开始条件,SDA在SCL低电平时拉高,然后SCL拉高。接着主机就可以产生一个起始信号继续新的消息传输(按照正常的7-bit/10-bit地址传输时序)。重复开始条件的传输时序如下图所示:
5.2、IIC读/写流程
读写指的是主机对总线的操作。比如写,主机写数据到总线,那么从机是读的;比如读,主机读总线的数据,那么从机是写的。
图说明:
S表示起始信号;P表示终止信号;AD表示器件地址(需查阅对应器件的使用手册);R/W表示读/写,1为读,0为写;ACK表示应答;NACK表示非应答;RA表示寄存器地址;DATA表示数据(一个字节)。
(1)IIC写流程
1)主机向从机发送数据,数据传送方向在整个传递过程中不变
写寄存器的标准流程:
①Master发起START ;
②Master发送I2C addr(7bit)和w操作0(1bit),等待ACK;
③Slave发送ACK ;
④Master发送reg addr(8bit),等待ACK ;
⑤Slave发送ACK;
⑥Master发送data(8bit),即要写入寄存器中的数据,等待ACK ;
⑦Slave发送ACK;
⑧第6步和第7步可以重复多次,即顺序写多个寄存器 ;
⑨Master发起STOP。
2)主机向从机发送数据,数据传送方向在传递过程中发生改变(R→W)
在传送过程中,当需要改变传递方向时,起始信号和从机地址都被重复一次产生一次,但两次读/写方向位正好相反
(2)IIC读流程
1)主机由从机读取数据,数据传送方向在整个传递过程中不变
2)主机由从机读取数据,数据传送方向在传递过程中发生改变(W→R)
读寄存器的标准流程:
①Master发起START ;
②Master发送I2C addr(7bit)和 W操作0(1bit),等待ACK ;
③Slave发送ACK;
④Master发送reg addr(8bit),等待ACK ;
⑤Slave发送ACK ;
⑥Master发起START ;
⑦Master发送I2C addr(7bit)和 R操作1(1bit),等待ACK ;
⑧Slave发送ACK ;
⑨Slave发送data(8bit),即寄存器里的值;
⑩Master发送ACK ;
⑪第9步和第10步可以重复多次,即顺序读多个寄存器;
⑫Master发起STOP。
6、时钟同步和仲裁
在单一主机的系统上无需实现时钟同步和仲裁。而如果两个或以上主机都想在同一条空闲总线上传输,此时必须能够使用某种机制来选择将总线控制权交给哪个主机,这是通过时钟同步和仲裁来完成的,而被迫让出控制权的主机则需要等待总线空闲后再继续传输。
(1)时钟同步
时钟同步是通过IIC接口和SCL之间的线“与”(wired-AND)来完成的,即如果有多个主机同时产生时钟,那么只有所有主机都发送高电平时,SCL上才表现为高电平,否则SCL都表现为低电平。
(2)总线仲裁
总线仲裁和时钟同步类似,当所有主机在SDA上都写1时,SDA的数据才是1,只要有一个主机写0,那此时SDA上的数据就是0。一个主机每发送一个bit数据,在SCL处于高电平时,就检查看SDA的电平是否和发送的数据一致,如果不一致,这个主机便知道自己输掉仲裁,然后停止向SDA写数据。也就是说,如果主机一直检查到总线上数据和自己发送的数据一致,则继续传输,这样在仲裁过程中就保证了赢得仲裁的主机不会丢失数据。输掉仲裁的主机在检测到自己输了之后也不再产生时钟脉冲,并且要在总线空闲时才能重新传输。仲裁的过程可能要经过多个bit的发送和检查,实际上两个主机如果发送的时序和数据完全一样,则两个主机都能正常完成整个的数据传输。
7、例子
参考:
1、IIC一例子
2、单片机IIC通讯实例讲解
8、优缺点
(1)优点
①只使用两根电线。
②支持多个主服务器和多个从服务器。
③ACK / NACK位确认每个帧都已成功传输。
④硬件没有UART那么复杂。
⑤众所周知且广泛使用的协议。
(2)缺点
①数据传输速率比SPI慢。
②数据帧的大小限制为8位。
③实现比SPI更复杂的硬件。
版权声明:本文为CSDN博主「念芯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45616775/article/details/122879705
前言
IIC、SPI、UART都是常见的低速板级通信协议,目前主流的SoC都内置了这些通讯协议的控制器,同样,各种传感器、Touch控制器、指纹模块、蓝牙模块、WIFI模块也都兼容这三种通信方式的一种或几种。
异同点:首先,IIC和SPI都是同步协议,都有时钟信号,在一条总线上也都可以挂多个从机,但是IIC的从机是通过器件地址来区分的,SPI的从机是通过片选线来区分的,所以SPI总线上,每多挂一个从机,就要多用一个线作为片选线,而IIC则不用,只要器件地址不冲突,可以随便挂器件。但是,IIC总线速度一般普遍慢于SPI,IIC一般的速度是100kbs、400kbps和1Mbps,而SPI的速度可以在几Mbps,也可以10+Mbps。UART和SPI、IIC不同,它是异步传输的,一般来说传输速度比较慢,传统的传输速度一般在115200bps或以下,不过现在大部分UART控制器也能支持到4Mbps或者8Mbps了。
使用场景:低速可以选用IIC,如果想速度快点,则一般都要选用SPI。另外,IIC总线的管脚都是开漏输出,必须外接上拉电阻,阻值(一般在4.7k~10k之间)可以根据总线速度来推算。
UART、SPI、IIC协议对比:
对比项 | UART | SPI | IIC |
---|---|---|---|
信号线数目 | 3根(RX、TX、GND) | 4根(MISO、MOSI、SCLK、CS) | 2根(SDA、SCLK) |
设备从属关系 | —— | 主从架构。SPI用片选信号CS选择从机。 | 多主从架构。IIC用地址选择从机。 |
通信方式 | 全双工通信 | 全双工通信 | 半双工通信 |
通信速率 | 速度慢 | 比IIC总线要快,速度可达到几Mbps | IIC的速度比SPI慢。具体见本文IIC模式 |
应用领域 | ①UART常用于控制计算机与串行设备的芯片。②像常说的串口,基本都用于调试。 | 主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 | IIC一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块。 |
传输距离 | —— | —— | IIC需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信 |
通信特征 | 异步串行,一帧可以传5/6/7/8位。一般从最低位开始传。 | 同步串行,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传。 | 同步串行,电平信号,一次连续8bit。从最高位开始传。 |
协议复杂度 | 结构比较复杂 | SPI实现要比UART简单,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 | 协议比SPI复杂,但是连线比标准的SPI要少。 |
对比 | —— | 在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比IIC系统要稍微复杂一些。 | —— |
一、UART
1、概述
UART(通用异步收发传输器)是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。在UART上追加同步方式的序列信号变换电路的产品,被称为USART。
UART由波特率产生器、UART接收器、UART发送器组成。UART的框架图如下所示:UART
因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。为了解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步;双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。即设备间要使用UART串口通信就必须先约定好传输速率(波特率)和一些数据位。
2、电路连接图
在UART通信中,两个UART通过两条线RX/TX相连可直接通信,连接如下图所示:
UART可将要传输的资料在串行通信与并行通信之间加以转换,即发送端的UART将来自控制设备(如CPU)的并行数据转换为串行数据,以串行方式将其发送到接收端的UART,然后由接收端的UART将串行数据转换为并行数据以用于接收设备的正常处理。UART通常被集成于其他通讯接口的连接上。UART即我们通常说的“串口”。
3、通信协议
UART工作原理是以字符为传输单位(一般是ASCII),将数据的二进制位一位一位的按顺序进行传输,传输方向可以选择MSB或LSB。通信中两个字符间的时间间隔是不固定的 ,然而同一个字符内两个相邻位之间的时间间隔是固定的。
帧间隔:即传送数据的帧与帧之间的间隔大小,可以用位或者时间为计量。
起始位:开始进行数据传输时,发送方先发一个逻辑0,表示传输字符的开始;依靠检测起始位来实现发送与接收方的时间自同步的。
数据位:即要传输的数据,可以是4、5、6、7、8位逻辑0或者1,构成一个字符,通常采用ASCII码。在大多数情况下,数据首先以低有效位(LSB)发送。如ASCII码8位数据位,从最低位开始传送,靠时钟定位。
校验位:若为奇偶校验,则数据位加上这一位后,使得“1”的位数为偶数(偶校验)或奇数(奇校验)以此来校验数据传送的正确性。若为高校验和低校验,则要知道高位和低位不是真正的检查数据,而是强行将校验位设置为逻辑高或者逻辑低。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
停止位:是一个字符数据的结束标志,可以是1位、1.5位、2位的高电平。适用于停止位的位数越多,不同时钟同步的容忍程度越大,数据传输率同时也越低。
空闲位:UART协议规定,当总线处于空闲状态时信号线的状态为逻辑‘1’即高电平,表示当前线路上没有数据传送。
4、波特率
数据的传送速率用波特率来表示(单位bps),即每秒钟传送的二进制位数,常见的波特率9600bps,115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。
例子:如果串口波特率设置为9600bps,那么传输1bit需要的时间是:(1/9600)s*10^6≈104.2us。
5、传输方向
传输方向:决定数据传输时,数据位从最高有效位(MSB)开始传输还是从最低有效位(LSB)开始传输。
UART一般为LSB方向。
例子:要传输字母’A’,其ASCII值为65,对应二进制值是01000001,如果MSB就是01000001;如果LSB就是10000010。
6、数据传输
数据传输过程:
①发送端UART从数据总线转换并行数据;
②发送端UART将起始位,奇偶校验位和停止位添加到数据包中;
③整个数据包从发送端UART串行发送到接收端UART;接收端UART按照预先配置好的波特率对数据线进行采样;
④接收端UART解析接收的数据,丢弃数据包中的起始位,奇偶校验位和停止位;
⑤接收端UART将串行数据转换回并行数据,并将其传输到接收端的数据总线。
7、UART / RS232 / RS485
UART是异步串行通信口的总称。 而RS232、RS449、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。在串口通信中,它们的主要区别在于其各自的电平范围不相同。嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。
串口:在嵌入式里指的是UART口,常用TTL电平即3.3V或者5.0V。
COM口:在台式机上常用的口,接口协议只有两种RS232(如DB9接口)和RS485。
UART口、COM口指的是物理接口形式。
TTL、RS232和RS485指的是电平逻辑标准。
TTL电平和RS232电平转换专用芯片有MAX232;TTL电平转USB芯片有CP2102、PL2303、FT230等用USB来扩展串口数量。
(1)TTL
TTL全名是晶体管-晶体管逻辑集成电路。
- 输入高电平最小2V,输出高电平最小2.4V,典型值3.4V;
- 输入低电平最大0.8V,输出低电平最大0.4V,典型值0.2V。
(2)RS232
RS232 逻辑1电平(MARK)=-5V~-12V,逻辑0电平(SPACE)=+5~+12V;
对于传输数据0x55,即二进制的01010101,RS232和TTL的区别如下:
(3)RS485
RS485是差分信号进行串行传输;
- 逻辑1以两线间的电压差为+(2~6)V表示;
- 逻辑"0"以两线间的电压差为-(2~6)V表示;
在工业通信中,使用RS485比较多,因为RS485是差分信号,可以抑制共模干扰,因此在恶劣的环境中拥有很好的抗干扰性,比较稳定。
8、CTS/RTS流控
参考:
1、RTS与CTS的含义
如果UART只有RX、TX两个信号,要流控的话只能是软流控;如果有RX,TX,CTS ,RTS四个信号,则多半是支持硬流控的UART;如果有 RX,TX,CTS ,RTS ,DTR,DSR 六个信号的话,RS232标准的可能性比较大。
如果收发是有关联关系的,很多情况下需要关注流控。UART的CTS/RTS用于硬流控,协调双方收发,保证数据不丢失。一般接线如下:
设备A | 接线 | 设备B |
---|---|---|
TX | → | RX |
RX | ← | TX |
RTS | → | CTS |
CTS | ← | RTS |
设备A通过UART发送数据,当设备B拉高RTS时,A就会暂停发送;当芯片B拉低RTS时,A又会继续发送。比如 WIFI模组与AP的串口连接:
9、例子
以9600 8 N 1(9600波特率,8个数据位,没有校验位,1位停止位)为例,这是目前最常用的串口配置,现在我们传输’O’ 'K’两个字母。'O’的ASCII值为79,对应的二进制值为01001111 ;'K’的ASCII值为75,对应的二进制值为01001011 。传输方向为LSB。传输的格式数据如下图所示:
串口波特率为9600,1bit传输时间大约为104us,传送一个数据实际是10个比特(开始位,8个数据位,停止位),一个bytes传输速率实际为9600*8/10=7680bps。
10、优缺点
(1)优点
①通信只需要两条数据线。
②无需时钟信号。
③有奇偶校验位,方便通信的差错检查。
④只需要接收端和发送端设置好数据包结构,即可稳定通信。
(2)缺点:
①数据帧最大支持9位数据。
②不支持多主机或多从机的主从系统。
二、SPI
1、概述
SPI(串行外设接口)是一种高速的,全双工,同步串行的通信总线,是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。
SPI没有统一的协议规范,但是基于其广泛的使用,根据实际使用中大家通用的习惯形成了一个类似行规的标准,即其已成为一种事实标准。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主机(且只能是一个)和一个或多个从机,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。因为一个主机可以挂多个从机,则通过片选引脚对从机进行选择。从机的工作时钟则是来自于主设备的SCK线。
①MISO(也称DOUT、DO、SDO、SO):主机数据输入,从机数据输出;
②MOSI(也称DIN,DI,SDI、SI):主机数据输出,从机数据输入;
③SCLK(也称SCK、CLK):时钟信号,由主机产生;时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。
④CS(也称nCS、SS、nSS、CE、SSEL、CSB、CSN、EN、STE、SYNC):从机使能信号,由主机控制,低电平有效。
(1)SPI总线可以实现多SPI设备互相连接。提供时钟的SPI设备为主机(Master),其他设备为从机(Slave)。SCLK信号线只由主机控制,从机不能控制信号线。
(2)在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,而SPI接口的读写操作都是由主机发起,主机通过片选线来确定要通信的从机(如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据)。这就要求从机的MISO接口具有三态特性(高电平、低电平、高阻),使得当CS无效时(即该设备未被选中),它们的MISO信号输出高阻态(啥都没接的状态)。若从机的MISO接口不支持高阻输出,则无法应用于多从机的SPI系统。
(3)主从机间可以实现全双工通信,收发独立,操作简单,数据传输速率较高,但需要占用主机较多的口线(每个从机都需要一根片选线),而且只支持单个主机,没有指定的流控制,没有规定最大传输速率,没有地址方案,没有应答机制确认是否接收到数据。
(4)数据输出通过MOSI线,数据在时钟上沿或下沿时改变(即发送),在紧接着的下沿或上沿被读取,从而完成一位数据传输。数据输入也使用同样原理。因此,8位数据的传输,至少需要8次时钟信号的改变(上沿和下沿为一次)。
(5)普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主机控制,当没有时钟跳变时,从机不采集或传送数据。也就是说,主机通过对SCLK时钟线的控制可以完成对通讯的控制。
(6)SPI接口在CPU和外围低速器件之间进行同步串行数据传输,在主机的移位脉冲下,数据按位传输,高位在前(MSB),低位在后,为全双工通信。
2、电路连接图
若芯片产品上,对SPI两条数据线的命名为MISO/MOSI,则连接时将主机与从机上名字相同的4对接口两两互联,即可完成了接口的互联。
若芯片产品上,对SPI两条数据线的命名为SDO/SDI,此时需要将主机的SDO连接到从机的SDI,将主机的SDI连接到从机的SDO。
(1)当只有一个主机、一个从机时,连接如下:
(2)当存在一个主机、多个从机时(注意,当主机上有n个CS时,对应可以连接n个从机),连接如下:
①SCLK/MOSI/MISO三个接口采取复用模式连接,不同CS单独连接对应的从机,CS信号绝不可复用。
缺点:随着从机数量的增加,来自主机的片选线的数量也增加。这会快速增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。
解决方法:可以使用其他技术来增加常规模式下的从机数量,例如使用多路复用器产生片选信号(参考:文中的“ADI公司支持SPI的模拟开关与多路转换器”部分)。
②菊花链模式连接
- 并非所有SPI器件都支持菊花链模式。请参阅产品数据手册以确认菊花链是否可用。
在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。
使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需的时钟周期数与菊花链中的从机位置成比例。例如在8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下只需8个时钟脉冲。
时钟周期和通过菊花链的数据传输如下图所示(SCK为时钟信号,8clks表示8个边沿信号;其中D为数据,X为无效数据):
补充:
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。SPI在硬件设计上采用的双数据线制,在SPI通信过程中,主从机(模式要相同)之间会形成一个数据环形链路,也就是说,要发一个数据必然会收到一个数据;要收一个数据必须也要先发一个数据。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
如上图所示,SPI中的核心组件为SSPSR移位寄存器,SSPBUF为数据缓冲区,控制器输出(接收)同步时钟信号和片选信号。
3、通信协议
3.1、时钟极性(CPOL)和时钟相位(CPHA)
SPI接口允许用户通过CPOL和CPHA来灵活选择时钟的上升沿或下降沿来采样或移位(即发送)数据。
CPOL:时钟极性, 表示 SPI 在空闲时, 时钟信号是高电平还是低电平。
- 等于1时,表示时钟空闲时为高,时钟低电平有效
- 等于0时,表示时钟空闲时为低,时钟高电平有效
说明:
- 空闲状态是指传输开始时CS为高电平且在向低电平转变的期间,以及传输结束时CS为低电平且在向高电平转变的期间。
CPHA:时钟相位, 决定数据传输采样和移位方式,即表示 SPI 设备是在SCK管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样。
- 等于1时,表示数据采样发生在时钟偶数(2,4,6,…,16)边沿(包括上下边沿)
- 等于0时,表示数据采样发生在时钟奇数(1,3,5,…,15)边沿(包括上下边沿)
在SPI通信中,主机根据选择CPOL和CPHA可将SPI数据传输分为四种模式:
SPI模式 | CPOL | CPHA | 空闲状态下的时钟极性 | 采样/移位数据的时钟相位 |
---|---|---|---|---|
0 | 0 | 0 | 低电平 | 数据在上升沿采样,在下降沿移位 |
1 | 0 | 1 | 低电平 | 数据在上升沿移位,在下降沿采样 |
2 | 1 | 0 | 高电平 | 数据在上升沿移位,在下降沿采样 |
3 | 1 | 1 | 高电平 | 数据在上升沿采样,在下降沿移位 |
3.2、时序
在下面示例中,数据显示在MOSI和MISO线上。传输的开始和结束用绿色虚线表示,采样边沿用橙色虚线表示,移位边沿用蓝色虚线表示。请注意,这些图形仅供参考。要成功进行SPI通信,用户须参阅产品数据手册并确保满足器件的时序规格。
模式0:
模式1:
模式2:
模式3:
- 主从机必须使用相同的工作模式(主机必须根据从机的要求选择)——SCLK、CPOL 和 CPHA,才能正常工作。
- 如果有多个从机,并且它们使用了不同的工作模式,那么主机必须在读写不同从机时需重新修改对应从机的模式。
4、数据传输
SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。CS通常是低电平有效信号。因此,主机必须在CS片选信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线MISO/SDI上的数据)同时进行,通常都是MSB位先传输。欲确定使用SPI接口传输的数据位数,请参阅器件数据手册。
具体步骤如下:
①主机先将对应的CS片选信号线拉低,表示与该设备进行通信;
②主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据;
③主机发送到从机时:主机将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
④主机接收从机数据:从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
例如,选择模式3的数据传输过程如下图所示:
注意:SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。
补充:
- SPI只要四根信号线连接正确,SPI模式相同,将CS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作。
- SPI接口是一种典型的全双工接口,通过同步时钟SCLK的脉冲将数据一位位地传送。所以在开始通讯前,主机首先要配置接口时钟(确定其通讯频率是从机可以支持的,通常为数兆赫兹)。当主机片选一个从机时,每向从机发送一个周期的SCLK信号,都会有1bit的数据从MOSI发送至从机,与此同时,从机每收到一个周期的SCLK信号,都会从MISO向主机发送1bit的数据。这种全双工通讯,是由硬件保证的(主机与HOST中各有一个移位寄存器作为收发数据的缓存)。
- SPI是一个很开放的接口,指令解析、帧大小、LSB/MSB、传输速率等规则并没有一个完善的定义,不同的SPI设备在这些方面的定义会有不同,即具有SPI接口的主机与从机之间的命令、数据解析都可以自定义,只要保证主机与从机之间采用相同的规则就好。不同SPI芯片,每次连续传输的数据量的大小(取决于主机、从机中缓存最小的那个)常常不同。当一次连续通讯的的数据量超过帧的大小时,会出现数据丢失的现象。所以,每完成1帧的传输后,主机会停止接口时钟输出,主机和从机读取、处理收到的数据,然后进行下一帧的传输。
- 在SPI接口协议中,并没有中断的定义,但是实际应用中,我们可以使用接口中断提高接口通讯速度。比如从机是负责数据数据加解密的,主机下发一组明文给从机加密,如果此时有个从机输出到主机的中断信号,那么主机可以清楚的知道何时从机完成了数据处理并读出处理结果,不必通过查询一遍遍的等待结束。
5、SPI接口的变形
一般SPI的一个时钟周期可以进行全双工的1bit数据通讯。而实际应用中,如果对于全双工的需求不高,而且期望提高通讯速度的话,可以选用SPI中两种常见变形,这将会很大程度的提高单方向上数据传输的速度,但是也会增加接口资源的开销。
(1)两线模式的SPI
SCLK与CS信号保持不变,MOSI与MISO则变形为DATA_0与DATA_1。
DATA_0与DATA_1是输入输出状态由Master配置的数据管脚:当主机打算向从机中写数据时,处于输出状态;当主机打算由从机读数据时,处于输入状态。
(2) 四线模式的SPI
SCLK与CS信号保持不变,MOSI与MISO删除,新增四条数据线DATA_0~3。
DATA_0~3是输入输出状态由主机配置的数据管脚:当主机打算向从机中写数据时,处于输出状态;当主机打算由从机读数据时,处于输入状态。
6、例子
例子:假定主机和从机初始化就绪,并且主机的寄存器sbuff=0xaa=0b1010 1010,从机的寄存器sbuff=0x55=0b0101 0101。规定上升沿发送、下降沿接收、高位先发送(MSB)。
下面将分步对SPI的8个时钟周期的数据情况演示一遍,如下表所示:
上表示上升沿、下表示下降沿,SDI、SDO相对于主机而言的(所谓的进出,是针对信号进出主机而言)。
由上表可知:
①一个时钟周期完成1bit数据的发送与接收。
②因为主机与从机的数据传输方向都是MSB,所以当上升沿到来时,SDO对应主寄存器的最高位,SDI对应从寄存器的最高位,而主从寄存器最右边都是未知的,所以用x代表。
③当下降沿到来时,SDI上的电平将存到主机的寄存器中的最低位(最右边),SDO上的电平将存到从机的寄存器的最低位(最右边),则此例中主机寄存器=0101010SDI(SDI表示1bit),从机寄存器=1010101SDO,即将接收到的数据填充到最右边。
④8个时钟周期完成了一次数据交换,即两个寄存器的内容互相交换一次,也就是完成里一个spi时序。
⑤根据以上分析,一个完整的传送周期是16位。因为主机首先要发送命令过去,然后从机准备数据,主机在下一个8位时钟周期才把数据读回来。
7、优缺点
(1)优点
①全双工串行通信。
②高速数据传输速率。
③简单的软件配置。
④极其灵活的数据传输,不限于8位,它可以是任意大小的字。
⑤非常简单的硬件结构。从机不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
(2)缺点
①没有硬件从机应答信号(主机可能在不知情的情况下无处发送)。
②通常仅支持一个主设备。
③需要更多的引脚(与I2C不同)。
④没有定义硬件级别的错误检查协议。
⑤与RS-232和CAN总线相比,只能支持非常短的距离。
三、IIC
参考:IIC协议代码例子可参考此文
1、概述
IIC(集成电路总线)是一种串行通信总线,使用多主从架构,即允许有多个主机(Master)并且每个主机都可以与所有的从机(Slaves)通信(主机之间不可通过IIC通信,并且每个主机只能轮流使用IIC总线)。主机(通常是微处理器)是指启动数据传输并在总线上生成时钟信号以驱动该传输的设备,而被寻址的设备都作为从机 。
IIC一般有两根信号线,一根是双向的数据线SDA,另一根是双向的时钟线SCL。数据线用来传输数据,时钟线用于数据收发同步。
①SCL(serial clock):时钟线,传输时钟信号,一般是IIC主机向从机提供时钟的通道。
②SDA(serial data):数据线,通信数据(命令、地址、数据)都通过SDA线传输。
串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。
串行时钟线SCL也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。
2、电路连接图
SDA和SCL总线通过上拉电阻(一般在4.7k~10k之间)与电源相连接。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
IIC器件内部结构如下图:
(1)由1,2箭头指示可知 IIC器件内部采用了开漏的方法,总线被上拉,即总线状态只能是被下拉为0(当MOS管输入0的时候) 。只要有一方下拉了总线,总线状态必定为0。也就是说,总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。
(2)任何一个器件都能像主控器一样工作,并控制总线,但同一时刻只能有一个主控器件。而且同一时刻,只能有一个从器件和主器件通信,其他从器件处于“冬眠”状态。
(3)每个接到I2C总线上的器件都有唯一的地址addr(系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份(可编程部分决定了某类器件可接入总线的最大数目,),细节视芯片而定,看datasheet),共7个bit,广播地址全0。根据器件的能力,作为发送器或接收器工作。
(4)在协议体系中,传输数据时都会带上目的器件的设备地址,因此可以实现设备组网。
3、IIC模式
IIC模式 | 速度 |
---|---|
Standard-mode (Sm)普通模式 | 100 kbit/s |
Fast-mode (Fm)快速模式 | 400 kbit/s |
High-speed mode (Hs-mode)高速模式 | 3.4 Mbit/s |
Fast-mode Plus (Fm+)快速+模式 | 1 Mbit/s |
Low-speed mode(Ls-mode)低速模式 | 10kb/s |
4、通信协议
IIC协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号都是由主机产生。
总线在空闲状态时,SCL和SDA都保持着高电平。
(1)从地址位:共7bit(新标准10bit),是器件的唯一地址,主从机之间的数据传输是建立在地址的基础上,也就是说,主机在传输有效数据之前要先指定从机的地址。
(2)读/写位:1bit,决定数据传输方向,若为“0”表示主机向从机写数据;若为“1”表示主机由从机读数据。
(3)应答位:1bit。若为“0”表示应答(ACK);若为“1”表示非应答(NACK)。
(4)数据位:8bit,传输的具体数据。
IIC通信时序可分为起始信号、终止信号、应答0、非应答1。
注:主机做的都是编程控制,从机做的都是自主控制,也可以说是硬件控制,如主机给应答信号是编程控制,但是从机给应答信号是硬件控制,我们只需要检查在SDA为高期间,SCL保持低电平一些时间,即可判定从机给了主机应答信号。
4.1、应答信号
IIC总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果从机忙, 它可以使 SCL保持在低电平,这会强制使主机进入等待状态。当从机空闲后,并且释放时钟线,原来的数据传输才会继续。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。
4.2、一个字节数据的传输过程
(1)当没有数据传输的时候(空闲状态),SDA和SCL同时为高电平。数据传输开始时,需要发送一个起始信号;数据传输结束后,需要发送一个终止信号;每8bit数据传输结束,都需要一个ACK。起始和终止信号都由主机发出,而ACK则可能由主机或者从机来发出。
①开始信号:SCL为高电平,SDA的电平由高跳到低表示开始信号。
②终止信号:SCL为高电平,SDA的电平由低跳到高表示终止信号。
(2)在数据的传输过程中,SCL为高电平时,外设模块开始采集SDA数据线上的数据,此时要求SDA数据线上的电平状态必须稳定(不然无法知道这一位数据是0还是1)。而SCL为低电平时,SDA线才能改变传输的数据bit状态,即当SCL为低电平时才允许SDA线上的数据跳变成另外一种状态。
(3)在SDA传输完一个字节之后,主机会释放SDA线(即SDA=1),这时SDA处于高电平的状态,从机就可以控制SDA线了。若从机下拉了SDA线(使SDA线上为稳定的低电平)并且主机在SDA读到了一个低电平,则表示从机发送了一个确认信号(0)即进行了应答(ACK)。若从机不对SDA线下拉,则主机读到SDA依然为高电平,故表示一个非应答信号(1,NACK)。
补充:
- SDA传输数据是大端传输(MSB),是以字节为单位的,即发送到SDA线上的每个字节必须是8位。每次传输可以发送的字节数量不受限制,但每个被传输的字节后面都必须跟着一位应答位(即一帧共有9位)。
- 如果从机要完成一些其他功能后(如一个内部中断服务程序)才能接收或发送下一个完整的字节,可以使时钟线SCL保持低电平迫使主机进入等待(wait)状态。当从机准备好新的字节数据传输时,释放时钟线SCL,数据传输便继续进行。
- 设备地址数的问题:理论上7位由128位地址,然而除去保留几个保留地址如广播地址0x00等,数量少于128个,且标准协议里遇见了地址的局限性,扩充了10位地址的概念。
- 对于IIC可以挂多少个设备的问题:对于同一个地址的设备来说,在不进行地址扩充(片选)的情况下只能挂一个,对于不同的设备来说,标准协议里面没由限制具体的个数的多少,这个由线路布线情况,软件情况以及工作模式确定。对于标准模式,只要总线上的负载电容不超过400pf,不超过芯片的负载能力既可以。
5、数据传输
5.1、重复开始条件
有时主机需要在一次通信中进行多次消息交换(例如与不同的从机传输消息,或切换读写操作),并且期间不希望被其他主机干扰,这时可以使用“重复开始条件” —— 在一次通信中,主机可以产生多次起始信号,来完成多次消息交换,最后再产生一个终止中结束整个通信过程。由于期间没有终止信号,因此主机一直占用总线,其他主机无法切入。
为了产生一个重复的开始条件,SDA在SCL低电平时拉高,然后SCL拉高。接着主机就可以产生一个起始信号继续新的消息传输(按照正常的7-bit/10-bit地址传输时序)。重复开始条件的传输时序如下图所示:
5.2、IIC读/写流程
读写指的是主机对总线的操作。比如写,主机写数据到总线,那么从机是读的;比如读,主机读总线的数据,那么从机是写的。
图说明:
S表示起始信号;P表示终止信号;AD表示器件地址(需查阅对应器件的使用手册);R/W表示读/写,1为读,0为写;ACK表示应答;NACK表示非应答;RA表示寄存器地址;DATA表示数据(一个字节)。
(1)IIC写流程
1)主机向从机发送数据,数据传送方向在整个传递过程中不变
写寄存器的标准流程:
①Master发起START ;
②Master发送I2C addr(7bit)和w操作0(1bit),等待ACK;
③Slave发送ACK ;
④Master发送reg addr(8bit),等待ACK ;
⑤Slave发送ACK;
⑥Master发送data(8bit),即要写入寄存器中的数据,等待ACK ;
⑦Slave发送ACK;
⑧第6步和第7步可以重复多次,即顺序写多个寄存器 ;
⑨Master发起STOP。
2)主机向从机发送数据,数据传送方向在传递过程中发生改变(R→W)
在传送过程中,当需要改变传递方向时,起始信号和从机地址都被重复一次产生一次,但两次读/写方向位正好相反
(2)IIC读流程
1)主机由从机读取数据,数据传送方向在整个传递过程中不变
2)主机由从机读取数据,数据传送方向在传递过程中发生改变(W→R)
读寄存器的标准流程:
①Master发起START ;
②Master发送I2C addr(7bit)和 W操作0(1bit),等待ACK ;
③Slave发送ACK;
④Master发送reg addr(8bit),等待ACK ;
⑤Slave发送ACK ;
⑥Master发起START ;
⑦Master发送I2C addr(7bit)和 R操作1(1bit),等待ACK ;
⑧Slave发送ACK ;
⑨Slave发送data(8bit),即寄存器里的值;
⑩Master发送ACK ;
⑪第9步和第10步可以重复多次,即顺序读多个寄存器;
⑫Master发起STOP。
6、时钟同步和仲裁
在单一主机的系统上无需实现时钟同步和仲裁。而如果两个或以上主机都想在同一条空闲总线上传输,此时必须能够使用某种机制来选择将总线控制权交给哪个主机,这是通过时钟同步和仲裁来完成的,而被迫让出控制权的主机则需要等待总线空闲后再继续传输。
(1)时钟同步
时钟同步是通过IIC接口和SCL之间的线“与”(wired-AND)来完成的,即如果有多个主机同时产生时钟,那么只有所有主机都发送高电平时,SCL上才表现为高电平,否则SCL都表现为低电平。
(2)总线仲裁
总线仲裁和时钟同步类似,当所有主机在SDA上都写1时,SDA的数据才是1,只要有一个主机写0,那此时SDA上的数据就是0。一个主机每发送一个bit数据,在SCL处于高电平时,就检查看SDA的电平是否和发送的数据一致,如果不一致,这个主机便知道自己输掉仲裁,然后停止向SDA写数据。也就是说,如果主机一直检查到总线上数据和自己发送的数据一致,则继续传输,这样在仲裁过程中就保证了赢得仲裁的主机不会丢失数据。输掉仲裁的主机在检测到自己输了之后也不再产生时钟脉冲,并且要在总线空闲时才能重新传输。仲裁的过程可能要经过多个bit的发送和检查,实际上两个主机如果发送的时序和数据完全一样,则两个主机都能正常完成整个的数据传输。
7、例子
参考:
1、IIC一例子
2、单片机IIC通讯实例讲解
8、优缺点
(1)优点
①只使用两根电线。
②支持多个主服务器和多个从服务器。
③ACK / NACK位确认每个帧都已成功传输。
④硬件没有UART那么复杂。
⑤众所周知且广泛使用的协议。
(2)缺点
①数据传输速率比SPI慢。
②数据帧的大小限制为8位。
③实现比SPI更复杂的硬件。
版权声明:本文为CSDN博主「念芯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45616775/article/details/122879705
暂无评论