常用通讯总线介绍

1 SPI总线协议

 

一、技术性能

SPI总线首次推出是在1979年,Motorola公司将SPI总线集成在他们第一支改自68000微处理器的微控制器芯片上。SPI总线是微控制器四线的外部总线(相对于内部总线)。与IIC不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheetsapplication notes沟通实现上的细节。SPI接口采用主从模式(MasterSlave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSBfirst);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。总线结构如下图所示。

 

 

二、接口定义

SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。

 

 

(1)MOSI:主器件数据输出,从器件数据输入

(2)MISO:主器件数据输入,从器件数据输出

(3)SCLK:时钟信号,由主器件产生

(4)/SS:从器件使能信号,由主器件控制

三、内部结构

 

 

四、 时钟极性和时钟相位

SPI操作中,最重要的两项设置就是时钟极性(CPOLUCCKPL)和时钟相位(CPHAUCCKPH)。时钟极性设置时钟空闲时的电平,时钟相位设置读取数据和发送数据的时钟沿。

主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。

SPI接口时钟配置心得:在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。

五、传输时序

SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。 

六、数据传输

在一个SPI时钟周期内,会完成如下操作:

1)主机通过MOSI线发送1位数据,从机通过该线读取这1位数据;

2)从机通过MISO线发送1位数据,主机通过该线读取这1位数据。

这是通过移位寄存器来实现的。如下图所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。

 

2 I2C串行总线

2.1 I2C总线简介

IIC 开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互联方式。电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互联微控制器和外围设备的。要实现内存映射,设备必须并联入微控制器的数据线和地址线,这种方式在连接多个外设时需大量线路和额外地址解码芯片,很不方便并且成本高。

为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室开发了 ‘Inter-Integrated Circuit’IIC IIC ,一种只使用二根线接连所有外围芯片的总线协议。最初的标准定义总线速度为100kbps。经历几次修订,主要是1995年的400kbps19983.4Mbps

I2C结合了SPIUART的优点。使用I2C,您可以将多个从设备连接到单个主设备上(SPI),并且可以让多个主器件控制单个或多个从器件。当您希望有多个微控制器记录数据到单个存储卡或将文本显示到单个LCD时,这非常有用。

UART通信一样,I2C仅使用两条线在设备之间传输数据:

 

 

SDA(串行数据) - 主站和从站发送和接收数据的线路。

SCL(串行时钟) - 承载时钟信号的线路。

I2C是一种串行通信协议,因此数据沿着单线(SDA线)逐位传输。

SPI一样,I2C是同步的,因此位输出通过主机和从机之间共享的时钟信号与位采样同步。时钟信号始终由主机控制。

Wires Used

2(SDASCL)

Maximum Speed

Standard mode = 100kbps

Fast mode = 400kbps

High speed mode = 3.4Mbps

Ultra fast mode = 5Mbps

Synchronous or Asynchronous

Synchronous

Serial or Parallel

Serial

Maximum of Masters

Unlimited

Maximum of Slaves

1008

 

2.2 I2C如何工作

使用I2C时,数据被转换成messagesmessages则被分解为数据帧。每条messages都有一个地址帧,其中包含从站的二进制地址,以及一个或多个包含正在传输的数据的数据帧。该消息还包括每个数据帧之间的启动和停止条件,读/写位和ACK / NACK位:

 

 

启动条件:在SCL线路从高电平切换到低电平之前,SDA线路从高电平切换到低电平。

停止条件:SCL线路从低电平切换到高电平后,SDA线路从低电平切换到高电平。

地址帧:每个从站唯一的710位序列,用于在主站想与之通信时识别从站。

/写位:单个位,指定主器件是向从器件发送数据(低电压电平)还是从器件请求数据(高电压电平)

ACK / NACK位:消息中的每个帧后跟一个应答/不应答位。如果成功接收到地址帧或数据帧,则从接收设备向发送方返回ACK位。

地址

I2C没有像SPI这样的从选择线,因此它需要另一种方法让从器件知道数据正在发送给它,而不是另一个从器件。它通过地址来做到这一点。地址帧始终是新消息中起始位之后的第一帧。

主设备将与其通信的从设备的地址发送给与其连接的每个从设备。然后,每个从设备将从主设备发送的地址与其自己的地址进行比较。如果地址匹配,则将低电压ACK位发送回主机。如果地址不匹配,则从器件不执行任何操作,SDA线保持高电平。

/写位

地址帧在末尾包括一个位,用于通知从设备,主设备是想要向其写入数据还是从主设备接收数据。如果主设备想要向从设备发送数据,则读/写位是低电平。如果主设备向从设备请求数据,则该位是高电平。

数据框架

在主设备检测到来自从设备的ACK位之后,准备好发送第一个数据帧。

数据帧始终为8位长,并以最高有效位先发送。紧接着每个数据帧的ACK / NACK位以验证帧已被成功接收。在发送下一个数据帧之前,主机或从机必须接收ACK(取决于发送数据的人)

在发送了所有数据帧之后,主设备可以向从设备发送停止条件以停止传输。停止条件是SCL线上从低电平到高电平转换后,SDA线上从低电平变为高电平,SCL线保持高电平。

I2C数据传输步骤

1.主机向每一个连接的从设备发送数据,然后将SDA信号从高切换到低,之后在将SCL从高切换到低电平。

 

 

2.主设备向每个从设备发送它想要与之通信的从设备的710位地址,以及读/写位:

 

 

3.每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从器件通过将SDA线拉低一位来返回ACK位。如果主设备的地址与从设备的地址不匹配,则从设备将SDA线保持为高电平。

 

 

4.主设备发送或接收数据帧:

 

 

5.在传输了每个数据帧之后,接收设备将另一个ACK位返回给发送方以确认成功接收到该帧:

 

 

6.要停止数据传输,主机通过在将SDA切换为高电平之前切换SCL为高电平来向从机发送停止条件:

 

 

有多个从设备的单一主设备

由于I2C使用寻址,因此可以从单个主设备控制多个从设备。使用7位地址,可以使用128(27)个唯一地址。使用10位地址并不常见,但提供1,024(210)个唯一地址。要将多个从器件连接到单个主器件,请像这样连接它们,使用4.7K欧姆上拉电阻将SDASCL线连接到Vcc

 

 

有多个从设备及多个主设备

多个主设备可以连接到单个从设备或多个从设备。当两个主设备尝试通过SDA线同时发送或接收数据时,同一系统中出现多个主设备的问题。为了解决这个问题,每个主设备需要在发送消息之前检测SDA线路是低还是高。如果SDA线为低电平,则表示另一个主控制器已控制总线,主控制器应等待发送消息。如果SDA线路很高,那么传输信息是安全的。要将多个主设备连接到多个从设备,请使用下图,使用4.7K欧姆上拉电阻将SDASCL线路连接到Vcc

 

 

I2C的优点和缺点

与其他协议相比,I2C听起来很复杂,不容易在程序中实现而导致数据丢失、无应答、死等等问题。但却有很多优点:

优点

只使用两根电线

支持多个主服务器和多个从服务器

ACK / NACK位确认每个帧都已成功传输

硬件没有UART那么复杂

众所周知且广泛使用的协议

缺点

数据传输速率比SPI

数据帧的大小限制为8

实现比SPI更复杂的硬件

 

原创文章 2 获赞 1 访问量 250

猜你喜欢

转载自blog.csdn.net/liuyi1591537136/article/details/106143867
今日推荐