« 上一篇下一篇 »

I2C与SPI

花了一个星期用汇编写的模拟I2C与SPI程序,稍微总结下。

1、I2C

I2C(Inter Interface Circuit)全称为芯片间总线,是应用广泛的芯片间串行扩展总线。目前世界上采用的I2C总线有两个规范,一个是荷兰飞利浦的,一个是日本索尼的,现在大多是采用飞利浦的规范。

I2C只有两条线:SDA/SCL,两条线均为双向的,I2C总线上各器件的数据线都接到SDA上,各器件的时钟线都接到SCL上。

I2C数据传送规定

(1)I2C总线空闲时,SDA和SCL线均为高电平

(2)I2C总线在进行数据传送时,每一数据位的传送都与时钟脉冲相对应。时钟脉冲为高电平期间,数据线上的数据必须保持稳定。只有在时钟线SCL为低电平期间,数据线SDA上的电平状态才允许变化

(3)根据I2C总线协议,总线上数据信号的传送由起始信号(S)开始,由终止信号(P)结束

    起始信号:在SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号,只有在起始信号以后,其他命令才有效。

    终止信号:在SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。

(4)I2C总线上数据传送的应答

    I2C总线进行数据传送时,首先要由主器件对从器件进行寻址,发出寻址字节。数据传送时,先送最高位MSBI2C总线在传送每1字节数据后都必须有数据接收方发出的应答信号A,应答信号在第9个时钟位上出现,与应答信号对应的时钟信号由主器件产生,这里发送方必须在这一时钟位上使SDA线处于高电平状态,以便接收方在这一位上送出低电平的应答信号A

(5)寻址字节

    寻址字节包含了7位从器件地址和1位数据传输方向(读或写)控制位。

    7位从器件地址为“DA3, DA2, DA1, DA0”和"A2, A1, A0",其中"DA3, DA2, DA1, DA0"为器件固有的类型号编码,出厂时就已经给定。"A2, A1, A0"为引脚地址,由器件引脚A2, A1, A0在电路中接高电平或接地决定。寻址字节的最低位为数据方向位(R/W),规定了总线上的主器件与从器件的数据传送方向。R/W = 1,表示主器件接收(读);R/W = 0,表示主器件发送(写)。

(6)数据传送的时序

    在时钟线为高电平期间,数据线的状态就是要传送的数据。

    数据线上数据的改变必须在时钟线为低电平期间完成。在数据传输期间,只要时钟线为高电平,数据线都必须稳定,否则数据线上的任何变化都当作起始或终止信号。

    在数据传送完成后主器件都必须发送终止信号。在起始信号与终止信号之间传输的数据字节数由主器件决定,无字数限制。

(7)从器件必须带I2C总线接口,51系列单片机没有I2C接口,可利用并行IO口线结合软件来模拟I2C总线时序。因此,在许多的应用中,都将I2C总线的模拟传送作为常规的设计方法。

基于I2C总线的E2PROM芯片AT24C02的应用代码如下:

软件I2C_按键_LCD.txt

2、SPI

SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司推出的一种同步串行外设接口,允许单片机与多厂家的带有标准SPI接口的外围器件直接连接。所谓同步,就是串行口每发送、接收一位数据都伴随有一个同步时钟脉冲来控制。

SPI使用4条线:串行时钟线SCK、主器件输入/从器件输出数据线MISO、主器件输出/从器件输入数据线MOSI和从器件选择线CS。

SPI系统中单片机对从器件的选通需控制其CS端,从而省去了地址字节。

数据传送格式:高位MSB在前,低位LSB在后

DS1302是美国DALLAS公司推出的一种采用SPI三线接口与CPU进行同步通信的时钟芯片。

芯片具体介绍请参看相应数据手册,下面为基于DS1302的SPI协议应用代码:

软件SPI - DS1302.txt

3、I2C + SPI

下面为I2C与SPI综合应用代码,具体器件为上述AT24C02与DS1302。

I2C&SPI.txt