标签: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