📄 i2c_eeprom.h
字号:
/*--------------------------------------------------------------------------
I2C_EEPROM.H
Design For :I2C_EEPROM器件( 适用于:AT24C64 / AT24C128 / At24C256 / At24C512 / 2464 / 24128 /24256 )
Author:xieqin
CopyRight:2004.9.8
--------------------------------------------------------------------------*/
#ifndef __I2C_EEPROM_H__
#define __I2C_EEPROM_H__
void Write_I2C_EEPROM(unsigned char nChip,unsigned int address,unsigned char *dat,unsigned char num)
{ //nChip=器件地址,address=器件内部字节单元地址,dat=数据缓冲区首址,num=数据长度
unsigned char i;
Start_I2C(); //申请总线
if(SendByte_I2C(0xa0+(nChip<<1)))return; //发送写命令
if(SendByte_I2C((address&0xff00)>>8))return;//发送内部地址高字节部分
if(SendByte_I2C(address&0xff))return; //发送内部地址低字节部分
for(i=0;i<num;i++)
{
if(SendByte_I2C(*dat++))return;//发送数据
}
Stop_I2C(); //释放总线
}
void Read_I2C_EEPROM(unsigned char nChip,unsigned int address,unsigned char *x,unsigned char num)
{ //nChip=器件地址,address=器件内部字节单元地址,x=数据缓冲区首址,num=数据长度
unsigned char i;
//对24系列的器件而言,要读取器件内部数据必须两次申请I2C总线,
//第一次用于设置器件内部地址指针
//第二才以"读取当前地址单元的数据"的方式读取数据
Start_I2C(); //申请总线
if(SendByte_I2C(0xa0+(nChip<<1)))return; //发送写命令
if(SendByte_I2C((address&0xff00)>>8))return;//发送内部地址高字节部分
if(SendByte_I2C(address&0xff))return;//发送内部地址低字节部分
Start_I2C(); //重新申请总线
if(SendByte_I2C(0xa1+(nChip<<1)))return; //发送读命令
for(i=0;i<num-1;i++)//接收前num-1个字节
{
*x++=ReadByte_I2C();
AckS_I2C(0);//发送有效应答
}
*x++=ReadByte_I2C();//接收最后一个字节
AckS_I2C(1); //发送无效应答
Stop_I2C(); //释放总线
}
unsigned char CurrentAddressRead(unsigned char nChip)//从当前地址读取数据函数
{ //nChip=器件地址,函数返回读取的一字节数据
unsigned char dat;
Start_I2C(); //重新申请总线
if(SendByte_I2C(0xa1+(nChip<<1)))return; //发送读命令 (包括器件地址)
dat=ReadByte_I2C;//读取一字节数据
AckS_I2C(1);//发回无效应答
Stop_I2C();//释放总线
return dat;//返回读取的数据
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -