8.9.2. 嵌入式系统常见总线

8.9.2.1. I2C总线

I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。 在总线空闲的状态下,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

I2C通信方式为半双工,只有一根SDA,同一时间只能单向通信。

8.9.2.1.1. I2C总线特征

I2C总线上的每一个设备都可以作为主设备或从设备,而且每一个设备都会对应一个唯一的地址(7位地址,最低位来表示读写).主从设备之间就通过这个地址来确定与哪个期间进行通信。

I2C总线上可挂接的设备数量受总线的最大电容400pf控制。

I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。

I2C总线上的主从设备之间以字节(8位)为单位进行双向数据传输。

8.9.2.1.2. I2C总线协议

I2C协议规定,总线上数据的传输必须一个起始信号为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生(意味着从设备不可以主动通信,只能主设备请求然后从设备应答)

起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,产生一个起始条件。当SCL为高而SDA由低到高产生一个跳变,则产生一个停止条件。

当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成

下面为I2C通信图示

../../_images/i2c_rw.png ../../_images/IIC_r_w.png

以下为I2C写寄存器的一个示例

../../_images/i2c_w.webp

8.9.2.2. SPI总线

SPI,是serial peripheral interface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速的、全双工的、同步的通信总线,采用四根线进行通信。

8.9.2.2.1. SPI总线特征

SPI规定了两个SPI设备之间通信必须由主设备(master)来控制次设备(slave),一个master设备可以通过提供clock一i及对slave设备片选(slave select)来控制多个slave设备。

Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的.

8.9.2.2.2. SPI总线协议

SPI有四种传输模式:上升沿、下降沿、前沿、后沿触发。

../../_images/spi_trans.jpg

上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个组件:

SSPBUF:泛指 SPI 设备里面的内部缓冲区,一般在物理上是以 FIFO 的形式,保存传输过程中的临时数据;

SSPSR:泛指 SPI 设备里面的移位寄存器,它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;

Controller:泛指 SPI 设备里面的控制寄存器,可以通过配置它们来设置 SPI 总线的传输模式。

SPI四根通信线解释如下

SPI通信线

描述

SCK

主要的作用是 Master(主)设备往 Slave(从)设备传输时钟信号, 控制数据交换的时机以及速率;

SS/CS

用于 Master(主)设备片选 Slave (从)设备,使被选中的 Slave(从)设备能够被 Master(主)设备所访问;

SDO/MOSI

在 Master(主)上面也被称为 Tx-Channel,作为数据的出口,主要用于 SPI 设备发送数据;

SDI/MISO

在 Master(主)上面也被称为 Rx-Channel,作为数据的入口,主要用于SPI 设备接收数据;

SPI的极性Polarity和相位Phase,最常见的写法是CPOL和CPHA,不过也有一些其他写法,简单总结如下:

CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性

CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位

SCK=SCLK=SPI的时钟

SPI总线极性

极性,会直接影响SPI总线空闲时的时钟信号是高电平还是低电平。

CPOL = 1:表示空闲时是高电平;

CPOL = 0:表示空闲时是低电平。

如下图所示

../../_images/spi_0.jpg

SPI总线相位

一个时钟周期会有2个跳变沿。而相位,直接决定SPI总线从那个跳变沿开始采样数据。

CPHA = 0:表示从第一个跳变沿开始采样;

CPHA = 1:表示从第二个跳变沿开始采样。

../../_images/spi_1.jpg

所以极性和相位结合后会有四种传输方式。