我们来看I2C协议中的数据传输时序图,如图1.3所示:
图 1.3 i2c数据传输时序图
SCL是时钟,SDA承载的是数据。当SDA从1变动到0,而SCL还是1时,表示开始数据传输。接下来的7位,就是设备的地址。紧接着的是读写标志,其为1时是读取,为0则是写。如果I2C总线上存在着和请求的地址相对应的设备,则从设备会发送一个ACK信号通知主设备,可以发送数据了。接到ACK信号后,主设备则发送一个8位的数据。当传输完毕之后,SCL保持为1,SDA从0变换到1时,标明传输结束。
从这个时序图中可以看到,SCL很重要,并且哪个时钟沿是干嘛的,都是确定好的。比如,前面7个必定是地址,第8个是读写标志,数据传输必须是8位,必须接个ACK信号等等。
前面的时序图并没有标明数据传输的方向,我们现在看看写操作的数据流向:如图1.4所示:
图 1.4 i2c读操作数据流向
这时候,从设备除了发送ACK以外,紧跟着的还有数据。
(2) SPI协议
SPI总线在物理上由4条信号线和一条地线构成。4条信号线分别是:数据输出MOSI、数据输入MISO、串行同步时钟SCLK和从设备使能线SS(片选)。处理器与外设之间使用SPI总线连接。SPI总线接口如图1.5所示:
图 1.5 spi总线接口
当通信发起时,首先会将SS使能(低电平有效),然后进行数据通信。因此当SPI总线上出现一主多从的连接情况时,主设备通过使能不同的SS信号来区分与之通信的从设备。
SPI总线以字节作为基本单位进行串行传输,每个时钟周期在MISO/MOSI上可以传输一位数据。在数据传输过程中,按照高位(MSB)在前、低位(LSB)在后顺序进行传输。与I2C总线不同,SPI总线在当某个字节数据传送完成后不需要ACK信号实现数据同步。
SPI协议中规定,可以根据外设的工作要求配置输出串行同步时钟(SCLK)的极性和相位。时钟极性(CPOL)对传输协议没有重大影响,只是规定了串行同步时钟在空闲时的状态:如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟空闲状态为高电平。时钟相位(CPHA)用于规定数据采样时使用的时钟沿:如果CPHA=0,数据在串行同步时钟的第一个跳变沿(上升或下降,由CPOL决定)被采样;如果CPHA=1,数据在串行同步时钟的第二个跳变沿被采样。
用一般I/O口线模拟SPI操作,如图1.6所示:
图 1.6 spi i/o口模拟spi操作
P1.0模拟MCU的数据输出端(MOSI),
P1.1模拟SPI的SCK输出端,
P1.2模拟SPI的从机选择端,
P1.3模拟SPI的数据输入端(MISO)。
SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI接口时序如图1.7、1.8所示。
图 1.7 spi CPHA=0时总线数据传输时序
图 1.8 spi CPHA=1时总线数据传输时序
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
(3) 8051单片机 基于8051单片机的I2C和SPI总线仿真(4):http://www.youerw.com/zidonghua/lunwen_13089.html