首页 > 代码库 > I2C总线使用说明

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		
}

(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.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总线使用说明