刚写的at24c512多字节读写函数,欢迎测试。
/********************************************************************
函数功能:EEPROM写一字节函数。
入口参数:device_addr:设备地址;data_addr:数据地址;w_data:数据。
返 回:是否成功。
备 注:无。
********************************************************************/
unsigned char EepromWriteByte(unsigned char device_addr,unsigned char data_addr,unsigned char w_data)
{
unsigned char i,Device_Addr;
delay();
SDA=0; //产生一个起始位
delay();
Device_Addr=device_addr; //EEROM的地址暂存
for(i=0;i<7;i++) //输出设备地址
{
SCL="0";
delay();
SDA="device"_addr&0x80; //SDA上输出一位数据,高位在前
device_addr<<=1;
delay();
SCL="1";
delay();
}
SCL=0;
delay();
SDA=0; //SDA上输出0,表示写操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA){return 1;} //如果设备未响应,则返回出错代码1
for(i=0;i<8;i++) //输出数据地址
{
SCL="0";
delay();
SDA="data"_addr&0x80; //SDA上输出一位数据,高位在前
data_addr<<=1;
delay();
SCL="1";
delay();
delay();
}
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA){return 2;} //如果设备未响应,则返回出错代码2
for(i=0;i<8;i++) //输出要写入的数据
{
SCL="0";
delay();
SDA="w"_data&0x80; //SDA上输出一位数据,高位在前
w_data<<=1;
delay();
SCL="1";
delay();
}
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA){return 3;} //如果设备未响应,则返回出错代码3
SCL=0;
delay();
SDA=0;
delay();
SCL=1;
delay();
SDA=1; //产生一个停止位,停止操作
for(i=0;i<250;i++) //等待数据写入
{
delay();
}
for(i=0;i<250;i++)delay();
return 0; //正确写入,返回0
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:从EEROM中读取一字节函数。
入口参数:device_addr:设备地址;data_addr:数据地址。
返 回:无。
备 注:无。
********************************************************************/
unsigned char EepromReadByte(unsigned char device_addr,unsigned char data_addr)
{
unsigned char i,r_data,Device_Addr;
SDA=0; //产生一个起始位
delay();
Device_Addr=device_addr; //EEROM的地址暂存
for(i=0;i<7;i++) //输出设备地址
{
SCL="0";
delay();
SDA="device"_addr&0x80; //SDA上输出一位数据,高位在前
device_addr<<=1;
delay();
SCL="1";
delay();
}
SCL=0;
delay();
SDA=0; //SDA上输出0,表示写操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA) return 0x0100; //如果设备未响应,则返回出错代码0x0100
for(i=0;i<8;i++) //输出数据地址
{
SCL="0";
delay();
SDA="data"_addr&0x80; //SDA上输出一位数据,高位在前
data_addr<<=1;
delay();
SCL="1";
delay();
delay();
}
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA) return 0x0200; //如果设备未响应,则返回出错代码0x0200
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();
SDA=0; //产生一个重启动位
delay();
device_addr=Device_Addr; //EEROM的地址
for(i=0;i<7;i++) //输出设备地址,一个7位的地址
{
SCL="0";
delay();
SDA="device"_addr&0x80; //SDA上输出一位数据,高位在前
device_addr<<=1;
delay();
SCL="1";
delay();
}
SCL=0;
delay();
SDA=1; //SDA上输出1,表示读操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA) return 0x0300; //如果设备未响应,则返回出错代码0x0300
for(i=0;i<8;i++) //从EEROM中读出数据
{
SCL="0";
delay();
r_data<<=1;
delay();
SCL="1";
if(SDA)r_data=r_data|0x01; //保存一位数据
delay();
}
SCL=0;
delay();
SDA=1; //置SDA高电平,表示停止读出
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=0;
delay();
SCL=1;
delay();
SDA=1; //产生一个停止位,停止读操作
return r_data; //返回数据
}
//****************************************************************************************
用户377235 2015-5-20 15:29
用户377235 2012-10-17 23:31