首页 > 代码库 > AT24C02

AT24C02

   驱动程序照着时序图写或上网找,这里不说了

   

   24c02是按照i2c通信的,

  在此谈一下鄙人关于i2c的认识:

首先需一个起始信号表示操作开始:先将sda和scl均置高(释放总线)再将sda置0,即在scl为高时sda低跳变,就是开始信号  顺便把scl拉低。    

 

开始写一字节:在scl为低时把sda赋好数据,scl上升沿后写过去,再将scl置低,sda装载数据,如此重复,写完8位后,释放总线,等待应答   ,最后把scl置0

 

等待ack:等待从件把sda拉低  表示接受成功

 

读一个字节:先将sda置高(个人理解:若读字节时是下降沿后读到信号,该信号靠从件发出,若主机sda拉低,从件是无力拉高的,因此主机先将sda拉高)此后与写类似,只不过有可能下降沿后读,结束后把scl置0

 

读后也需要释放总线

 

结束信号:先将scl,sda均置低(释放总线,若上述均保证结束时scl为0,则不需置scl)再将scl置高,此时sda上升跳变,就是结束信号  

 

 

具体实现:

向某个地址写一个数据:

 

void At24c02Write(uchar addr,uchar dat)
{
    I2C_Start();//起始信号	·	
	I2C_SendByte(0xa0,1);//器件寻址,1表等待响应,0则略过,另外:器件地址高四位固定为1010,低四位中最低位为写入与读取的选择,
                              //其余三位为器件选择,这里全部接地所以为0
	I2C_SendByte(addr,1);//写入数据的目标地址	
	I2C_SendByte(dat,1);//要写的数据
	I2C_Stop();	 //停止信号	,此后器件进入擦写工作,期间不接受主机的信号
}


向某个地址读一个数据:

 

 

<pre name="code" class="cpp">uchar  At24c02Read(uchar addr)
{
    uchar dat=0;
    I2C_Start();//起始信号
	I2C_SendByte(0xa0,1);
	I2C_SendByte(addr,1);//假写入 ,地址即为要读的地址,具体看所含芯片文档
	I2C_Start();//起始信号
	I2C_SendByte(0xa1,1); //最低位变1,设为读取模式
	dat=I2C_ReadByte();	//接受数据
	I2C_Stop();//停止信号
	return dat;
}



 


接着上次读或写的地址读数据:

 

 

uchar  At24c02Read_next()
{
    uchar dat=0;
    I2C_Start();
	I2C_SendByte(0xa1,1);//直接读命令,接着上一次读写的地址读数据
	dat=I2C_ReadByte();
	I2C_Stop();
	return dat;
}	 

 

 

注意:写入操作后一段时间不能对24c02进行任何操作(正在擦写)   需延时10ms左右

参考资料:点击打开链接,i2c,i         2c

代码:点击打开链接

proteus 调试i2c元件的方法

 

AT24C02