AT24Cxx - 电可擦可写E2PROM
芯片介绍
基础介绍\引脚介绍
AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms,典型时间为5ms)的。
串行E2PROM一般具有两种写入方式,一种是字节写入方式,还有另一种页写入方式。允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,1页的大小取决于芯片内页寄存器的大小。其中,AT24C01具有8字节数据的页面写能力,AT24C02/04/08/16具有16字节数据的页面写能力,AT24C32/64具有32字节数据的页面写能力。
其引脚如图:
A0、A1、A2:通过器件地址输入端 A0 A1 和 A2 可以实现将最多 8 个 24WC01 和 24WC02 器件 4 个 242C04 器件,2 个 24WC08 器件和 1 个 24WC16 器件连接到总线上。即其除了用于地址跨页选择外,还充当主机的选择引脚。由于该芯片最多支持256个字节的连续写入,因此每256个字节地址输入端会进行相应的电平变化。
WP:写保护,当WP为高电平时,该芯片只能读数据。
SCL、SDA:I2C协议的时钟线与数据线,详见协议使用笔记I2C章节。
控制命令
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
1 | 0 | 1 | 0 | A2 | A1 | A0 | R/~W |
-
前四位为固定值 - 1010(0xAx)。
-
根据芯片容量不同,从A0开始可作为地址线,从A2结尾可作为片选线。
以AT24C08为例:
AT24C08为一片容量为8Mbit(1Mbyte)的芯片,以256字节为一页,其共被分为4页,即需要两位地址线作为地址选择,以A2为0时为例(片选第一片,AT24C08最多可同时接入两片)选择情况如下:
3 2 1 选择地址(byte) 0/1 0 0 0 ~ 255 0 1 256~ 511 1 0 512 ~ 766 1 1 767 ~ 1023
- 最后一位为读写信号,高电平为读,低电平为写。
地址命令
地址命令为8bit的地址数据,为AT24Cxx的页内相对地址,值得注意的是:当使用芯片为AT24C32及以上时,其地址命令为两个8bit地址,前为地址高八位,后为地址低八位,发送方式同其它时序。
基础读写操作
写字节\页写
写字节:
- 其格式为:
开始信号 --> 控制命令 --> 。–> 写入地址 --> 。–> 写入数据 --> 。–> 停止信号
注:。处为等待响应。
页写:
- 其格式为:
开始信号 --> 控制命令 --> 。–> 写入地址 --> 。–> 写入数据 --> 。–> …… --> 停止信号
注:。处为等待响应,……为省略。
使用页写 AT24C01 可一次写入 8 个字节数据 AT24C02/04/08/16 可以一次写入 16 个字节的
数据 页写操作的启动和字节写一样 不同在于传送了一字节数据后并不产生停止信号。如果数据量大于限定的最大数据,则后续数据将会从预写入数据处覆盖先前的数据。
立即读字节\选择读\连续读
立即读字节:即读取单个字节
- 立即读操作不需要发送读取数据地址,因为该数据地址为上次读数据的地址+1,即若上次读取的地址为N,则此次读取地址为N+1。若N为芯片最后一个地址(AT24C08为1023),则此次读取地址为 0。
- 其格式为:
开始信号 --> 控制命令 --> 。–>读取数据 --> x --> 停止信号
注:。处为等待响应,x为发送非应答。
该读取方式由于使用情况略显复杂,因此在实际操作中使用较少,但在特定情况下使用方便。
选择读:
- 选择读可读取芯片存储地址中任意地址地字节内容,即任意读一个字节
- 其格式为:
开始信号 --> 控制命令(写) --> 。–> 读取地址 --> 。 --> 开始信号 --> 控制命令(读) --> 。 --> 读取数据 -->
x --> 停止信号
注:。处为等待响应,x为发送非应答。
主器件首先通过发送起始信号从器件地址和它想读取的字节数据的地址执行一个伪写操作,应答之后主器件重新发送起始信号和从器件地址此时R/W位置 1,响应并发送应答信号然后输出所要求的一个 8 位字节数据,主器件不发送应答信号但产生一个停止信号。
连续读:
- 连续读操作可通过立即读或选择性读操作启动, 在立即读或选择读发送非应答时不发送非应答,发送应答并继续接收数据,此时地址指针会自动向后偏移1位。待接收数据完成后再发送非应答。
- 此操作可以连续读任意个数据,可跨页,若读取数据大于其读取处至存储器尾地址的总字节数,则其将从绝对地址0处开始读取剩余数据。
代码示例
注意:以下代码以模拟I2C、AT24C08为例,需要初始化对应引脚。
此处仅介绍写字节与选择读的函数。
变量介绍
void IIC_StartOrStop(u8 mode); //I2C开始结束
void IIC_WriteByte(u8 tData); //I2C写字节
u8 IIC_Wait_ACK(void); //I2C等待从机应答
u8 IIC_ReadByte(void); //I2C读字节
void IIC_Send_ACK(void); //I2C发送应答
void IIC_Send_NonACK(void); //I2C发送非应答
/*以上函数变量详情请参照 - 协议使用笔记I2C章节 - 此处不做说明*/
写字节
void AT24CXX_WriteByte(u16 addr, u8 tData) //addr - 芯片绝对地址,tData - 芯片发送的数据(8byte)
{
u8 page = 0,offset = 0;
page = addr / 256; //将绝对地址转换成相应页
offset = addr % 256; //计算绝对地址在相应页的偏移量
page <<= 1;
page |= (0xa << 4); //组装控制命令,最后一位为 0 - 写
IIC_StartOrStop(OPEN); //开始信号
IIC_WriteByte(page); //发送控制命令
IIC_Wait_ACK(); //等待应答
IIC_WriteByte(offset); //发送页内偏移地址
IIC_Wait_ACK(); //等待应答
IIC_WriteByte(tData); //写数据
IIC_Wait_ACK(); //等待应答
IIC_StartOrStop(CLOSE); //结束信号
delayMs(10); //等待写入完成
}
选择读
u8 AT24CXX_ReadByte(u16 addr) //addr - 读取地址 ,返回值 - 该地址处数据
{
u8 rData,page = 0,offset = 0;
page = addr / 256;
offset = addr % 256; //同上
page <<= 1;
page |= (0xa << 4); //伪写
IIC_StartOrStop(OPEN);
IIC_WriteByte(page);
IIC_Wait_ACK();
IIC_WriteByte(offset);
IIC_Wait_ACK();
page |= 1; //至最低为为读(1)
IIC_StartOrStop(OPEN);
IIC_WriteByte(page);
IIC_Wait_ACK();
rData = IIC_ReadByte();
IIC_Send_NonACK(); //发送非应答
IIC_StartOrStop(CLOSE);
return rData; //返回数据
}