I2C总线使用说明

来源:互联网 发布:二手租赁平java源码 编辑:程序博客网 时间:2024/06/06 15:48

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.7usSDA=0;Delay10us();//保持时间是>4usSCL=0;Delay10us();}
(2)I2C 停止信号

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



/************************************************************************** 函数名         : I2cStop()* 函数功能: 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿* 输入           : 无* 输出          : 无* 备注           : 结束之后保持SDA和SCL都为1;表示总线空闲*************************************************************************/void I2cStop(){SDA=0;Delay10us();SCL=1;Delay10us();//建立时间大于4usSDA=1;Delay10us();//SDA持续时间大于4.7us}

(4)应答信号

应答信号的流程是,单片机发完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.7usSCL=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都是0Delay10us();for(a=0;a<8;a++)//接收8个字节{SCL=1;Delay10us();dat<<=1;dat|=SDA;Delay10us();SCL=0;Delay10us();}return dat;}

附带:数据传送时序(包括读和写)





 


0 0
原创粉丝点击