一、I2C的概念 1. I2C总线是PHLIPS公司推出的一种串行总线,I2C总线只有两根双向信号线。其中一根是数据线SDA,另一根是时钟线SCL。
2. 每个接到I2C总线上的器件都有唯一的地址。发送数据到总线上的称为发送器,从总线上接收数据的器件称为接收器。
每个I2C总线上的器件的地址唯一,主机就是通过寻找唯一的地址来进行数据传输。当主机为发送器的时候,器件接收数据,当主机为接收器的时候,器件发送数据。 二、常用的串行扩展总线 I2C(Inter Ic BUS)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)等。 三、I2C的六个信号 1. 起始信号 定义:SCL线为高电平期间,SDA线由高电平向低电平的变化。
[plain] view plain copy
- void iic_start(void)
- {
- SDA = 1;
- SCL = 1;
- delay_us(1);
- SDA = 0;
- delay_us(1);
- SCL = 0;
- }
2. 终止信号
定义:SCL线为高电平期间,SDA线由低电平向高电平的变化。
[plain] view plain copy
- void iic_stop(void)
- {
- SDA = 0;
- SCL = 1;
- delay_us(1);
- SDA = 1;
- delay_us(1);
- SCL = 0;
- }
3. 写数据信号
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。
[plain] view plain copy
- bit iic_send_byte(unsigned char byte)
- {
- unsigned char i;
-
- for(i = 0; i < 8; i++)
- {
- SDA = byte & 0x80;
- SCL = 1;
- delay_us(1);
- SCL = 0;
- byte <<= 1;
- }
-
- SCL = 1;
- SDA = 1;
- delay_us(1);
- if(0 == SDA)
- {
- ack = 1;
- }
- else
- {
- ack = 0;
- }
-
- SCL = 0;
- return ack;
- }
4. 读数据信号
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。
[plain] view plain copy
- unsigned char iic_rcv_byte(void)
- {
- unsigned char i;
- unsigned char temp = 0;
- unsigned char a;
-
- SDA = 1;
- for(i = 0; i < 8; i++)
- {
- SCL = 0;
- delay_us(1);
- SCL = 1;
- if(SDA)
- {
- a = 0x01;
- }
- else
- {
- a = 0;
- }
-
- temp |= (a << (7 - i));
- delay_us(1);
- }
-
- SCL = 0;
-
- return temp;
- }
5. 应答信号
I2C总线协议规定,每传送一个字节数据,都要有一个应答信号以确定数据传送是否被对方接收。应答信号由接收设备产生,在SCL为高电平期间,接收设备将SDA拉低为低电平,表示数据传输正确。
[plain] view plain copy
- void iic_ack(void)
- {
- SDA = 0;
- SCL = 1;
- delay_us(1);
- SCL = 0;
- }
6. 非应答信号
[plain] view plain copy
- void iic_noack(void)
- {
- SDA = 1;
- SCL = 1;
- delay_us(1);
- SCL = 0;
- }
|