标签:i2c总线
I2C总线协议
概念:
1、I2C(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备(特别是外部存储器件),最初为音频和视频的开发。
2、I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
3、I2C总线在传送数据过程中共有三种特殊类型信号, 它们分别是:开始信号、结束信号和应答信号。
4、I2C先传高位,后传送低位数据。
时序:
I2C总线发送数据的整个过程时序
(1)I2C的起始信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号。
/************************************************************************* * 函数名 : I2cStart() * 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿 * 输入 : 无 * 输出 : 无 * 备注 : 起始之后SDA和SCL都为0 *************************************************************************/ void I2cStart() { SDA=1; Delay10us(); SCL=1; Delay10us();//建立时间是SDA保持时间>4.7us SDA=0; Delay10us();//保持时间是>4us SCL=0; Delay10us(); }(2)I2C 停止信号
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
/************************************************************************* * 函数名 : I2cStop() * 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿 * 输入 : 无 * 输出 : 无 * 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲 *************************************************************************/ void I2cStop() { SDA=0; Delay10us(); SCL=1; Delay10us();//建立时间大于4us SDA=1; Delay10us();//SDA持续时间大于4.7us }
应答信号的流程是,单片机发完8Bit数据后把SDA拉高->I2C芯片把SDA拉低->单片机收到ACK信号,而非应答信号则不会被拉低。
发送一个字节 /*********************************************************** * 函数名 : I2cSendByte(unsigned char num) * 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定 * 输入 : num * 输出 : 0或1。发送成功返回1,发送失败返回0 * 备注 : 发送完一个字节SCL=0,SDA=1 ************************************************************/ unsigned char I2cSendByte(unsigned char dat) { unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。 for(a=0;a<8;a++)//要发送8位,从最高位开始 { SDA=dat>>7; //右移7位,因先传最高位 dat=dat<<1; //左移一位 Delay10us(); SCL=1; Delay10us();//建立时间>4.7us SCL=0; Delay10us();//时间大于4us } SDA=1; //释放数据线,等待应答信号 Delay10us(); SCL=1; while(SDA)//等待应答,也就是等待从设备把SDA拉低 { b++; if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束 { SCL=0; Delay10us(); return 0; } } SCL=0; Delay10us(); return 1; } 接收一个字节 unsigned char I2cReadByte() { unsigned char a=0,dat=0; SDA=1; //释放这条线,起始和发送一个字节之后SCL都是0 Delay10us(); for(a=0;a<8;a++)//接收8个字节 { SCL=1; Delay10us(); dat<<=1; dat|=SDA; Delay10us(); SCL=0; Delay10us(); } return dat; }
附带:数据传送时序(包括读和写)
标签:i2c总线
原文地址:http://blog.csdn.net/guomutian911/article/details/41733475