注意事项: EEPROM读写以及数据管理
特性:
1.运行的电压和标准电压的范围:
最低电压 | 范围 |
---|---|
2.7 | (Vcc=2.7 V to 5.5 V ) |
1.8 | (Vcc=1.8 V to 3.6 V ) |
2.大小有128 KBytes (16384*8)和 256KBytes(32768*2)两种。
3.两线串口总线。
4.双向数据传输协议
5.兼容:1 MHz(5V)、400 kHz(2.7V,2.5V)、100 kHz(1.8V)。
6.拥有硬件的写保护功能以及软件的数据保护功能。
7.64-Byte一个page。
8.写回操作5 ms。
9.高性能:
写次数 | 保存数据(年) |
---|---|
100000 | 40 |
10.封装方式有: 8-pin JEDEC、8-pin JEDEC、EIAJ SOIC、8-pin TSSOP、8-ball dBGA。
描述:
AT24C128/256提供128 Kbtyes 和 256 Kbytes 两种方式。允许四个设备共享一个I2C总线。
管脚描述:
管脚名称 | 功能 |
---|---|
A0、A1 | 器件地址选择 |
SDA | 串行数据/地址 |
SCL | 串行时钟 |
WP | 写保护 |
Vcc | 工作电压 |
GND | 低 |
SCL:用于产生时钟的管脚,是一个输入管脚。
SDA:双向串行数据/地址管脚用于器件所有数据的发送或接受,SDA是一个开漏输出管脚,可以与其他的开漏输出或集电极开路输出进行线或操作。
A1、A0:输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。做多可以级联4个设备。只有一个设备的话,A0,A1悬空或者为0。
WP:如果WP管脚连接到Vcc,所有的内容都会被写保护(只能读)。当WP管脚连接到GND或者悬空,允许器件进行正常的读/写操作。
极限参数
工作温度:
用途 | 温度范围 |
---|---|
工业级别 | -55℃~+125℃ |
商业级别 | 0℃~+75℃ |
存储温度:-65℃~+150℃
Vcc管脚承受电压:-2.0~+7.0V
焊接温度:300℃
输出短路电流:100mA
框图
分布电容
温度=25 ℃,频率=1.0 MHz,电压=5.0 V
符号 | 测试项 | 最大 | 单位 | 条件 |
---|---|---|---|---|
C(I/O) | I/O电容(SDA脚) | 8 | pF | V(I/O)=0V |
C(IN) | 输出电容(A0,A1) | 6 | pF | V(IN)=0V |
实例代码
本程序是用的CC2541的I2C接口:
I2C写函数:
void CC_I2C_WriteFun(u8 slave_addr,i2cClock_t clockRate, u16 address,u8 len,u8* pBuf ){
i2cAddr = slave_addr << 1;
I2C_WRAPPER_DISABLE();
I2CADDR = 0;
I2C_CLOCK_RATE(clockRate);
I2C_ENABLE();
if(i2cMstStrt(0) != mstAddrAckW)
{
len = 0;
}
u8 High_addr = HI_UINT16(address);
u8 low_addr = LO_UINT16(address);
I2C_WRITE(High_addr);
I2C_WRITE(low_addr);
for (uint8 cnt = 0; cnt < len; cnt++)
{
I2C_WRITE(*pBuf++);
if (I2CSTAT != mstDataAckW)
{
if (I2CSTAT == mstDataNackW)
{
len = cnt + 1;
}
else
{
len = cnt;
}
break;
}
}
I2C_STOP();
}
I2C读函数:
void CC_I2C_ReadFun(u8 slave_addr,i2cClock_t clockRate,u16 address,u8 len,u8* pBuf){
i2cAddr = slave_addr << 1; //write oprearation
I2C_WRAPPER_DISABLE();
I2CADDR = 0; // no multi master support at this time
I2C_CLOCK_RATE(clockRate);
I2C_ENABLE();
uint8 cnt = 0;
if (i2cMstStrt(0) != mstAddrAckW)
{
len = 0;
}
u8 High_addr = HI_UINT16(address);
u8 low_addr = LO_UINT16(address);
I2C_WRITE(High_addr);
I2C_WRITE(low_addr);
I2C_STRT();
I2C_WRITE(i2cAddr | 1);
// All bytes are ACK'd except for the last one which is NACK'd. If only
// 1 byte is being read, a single NACK will be sent. Thus, we only want
// to enable ACK if more than 1 byte is going to be read.
if (len > 1)
{
I2C_SET_ACK();
}
while (len > 0)
{
// slave devices require NACK to be sent after reading last byte
if (len == 1)
{
I2C_SET_NACK();
}
// read a byte from the I2C interface
I2C_READ(*pBuf++);
cnt++;
len--;
if (I2CSTAT != mstDataAckR)
{
if (I2CSTAT != mstDataNackR)
{
// something went wrong, so don't count last byte
cnt--;
}
break;
}
}
I2C_STOP();
//return cnt;
}