当前位置: 代码迷 >> 单片机 >> 单片机模拟 IIC 总路线与 EEPROM(AT24C02)通信
  详细解决方案

单片机模拟 IIC 总路线与 EEPROM(AT24C02)通信

热度:530   发布时间:2016-04-28 14:59:13.0
单片机模拟 IIC 总线与 EEPROM(AT24C02)通信

数据有效性:


起始和终止信号时序:


设备地址:


写字节时序:


读数据时序:


函数模拟 IIC 总线 时序:

/**************************************//******模拟I2C总线操作函数*************//**************************************///延时函数void Delay(){ ; ; }//初始化void I2C_Init(){	SDA = 1;	SCL = 1;}//起始信号void I2C_Start(){	SDA = 1;	Delay();	SCL = 1;	Delay();	SDA = 0;	Delay();}//终止信号void I2C_Stop(){	SDA = 0;	Delay();	SCL = 1;	Delay();	SDA = 1;	Delay();}//应答信号void I2C_Acknowledge(){	unsigned char i;	SCL = 1;	Delay();	while((SDA == 1) && (i<250)){ //在一定时间内等待应答信号		i++;	}	SCL = 0;	Delay();}//写一个字节void I2C_WriteByte(unsigned char Data){	unsigned char i,temp;	temp = Data;	SCL = 0;	Delay();	for(i = 0;i < 8;i++){		temp = temp<<1;			SDA = CY;     //CY为PSW寄存器的溢出位		Delay();		SCL = 1;		Delay();		SCL = 0;		Delay();	}	SDA = 1;	Delay();}//读一个字节unsigned char I2C_ReadByte(){	unsigned char i,temp,Data;	SCL = 0;	Delay();	SDA = 1;	Delay();	for(i = 0;i < 8;i++){		SCL = 1;		Delay();		temp = SDA;		Data = (Data<<1)|temp;		SCL = 0;		Delay();	}	return Data;}//在特定位置写一个字节数据void I2C_WriteByteAt(unsigned char address,unsigned char Data){	I2C_Init();	I2C_Start();	I2C_WriteByte(0xa0);//写器件地址,最后一位表示数据方向	I2C_Acknowledge();	I2C_WriteByte(address);//写存储地址	I2C_Acknowledge();	I2C_WriteByte(Data);//写数据	I2C_Acknowledge();	I2C_Stop();}//从特定位置读一个字节数据unsigned char I2C_ReadByteAt(unsigned char address){	unsigned char Data;	I2C_Init();	I2C_Start();	I2C_WriteByte(0xa0);//写器件地址,最后一位表示数据方向	I2C_Acknowledge();	I2C_WriteByte(address);//写存储地址	I2C_Acknowledge();	I2C_Start();	I2C_WriteByte(0xa1);//再次写器件地址,注意改变数据方向	I2C_Acknowledge();	Data = I2C_ReadByte();//读数据	I2C_Stop();	return Data;}