特性
256 x 8 (2K)
IIC接口、施密特触发器、噪声抑制
用于硬件数据保护的写保护引脚
8字节页(1K, 2K)
允许部分页写
写周期(最大5ms)
描述
AT24C02提供2048位的电可擦和可编程只读存储器(EEPROM)
组织为256, 8位字。该装置经过优化,可用于许多工业和商业应用。
引脚 | 功能 |
---|---|
A0-A2 | 地址输入 |
SDA | 串行数据 |
SCL | 串行时钟输入 |
WP | 写保护 |
NC | No Connect |
GND | 地 |
VCC | 电源 |
引脚描述:
- SERIAL CLOCK (SCL):
SCL输入用于将正边缘时钟数据输入到每个EEPROM设备,并将负边缘时钟数据输出到每个设备。 - SERIAL DATA (SDA):
SDA引脚是双向的,用于串行数据传输。 - DEVICE/PAGE ADDRESSES (A2, A1, A0):
A2、A1和AO引脚是硬接线AT24C02的设备地址输入。多达8个1K/2K设备可以在一个总线系统上被寻址。 - WRITE PROTECT (WP):
AT24C02有一个写保护引脚,提供硬件数据保护。当连接到地(GND)时,写保护引脚允许正常读/写操作。当引脚连接到Vcc时,就会启用Write protection特性,不允许读写。
存储组织:
AT24C02, 2K SERIAL EEPROM:
内部组织32页,每个8字节2K需要8位数据字地址用于随机字寻址也就是说有32页,每一页8Byte,每1Byte是8位,总共就是2Kbit的存储空间
设备操作(IIC)
-
时钟和数据转换:
SDA引脚通常与外部设备拉高。SDA引脚上的数据只能在SCL低时间段内改变。在SCL高时间段内的数据改变将表明如下定义的启动或停止条件。 -
启动条件:
SCL高的时候SDA从高到低的过渡是一个启动条件。 -
停止条件:
SCL高的SDA从低到高的转变是停止条件。在读取序列之后,stop命令将EEPROM置于备用电源模式。 -
确认:
所有地址和数据字都以8位字串行地传送到EEPROM或从它传送出来。EEPROM发送一个0来确认它已经接收到每个字。 -
待机模式:
AT24C01A/02/04/08A/16A具有低功率待机模式
启用:
(a)上电后
(b)在收到停止位和完成任何内部操作后。
设备地址
设备需要一个8位的设备地址字,后面跟着一个启动条件,以使芯片能够进行读或写操作
设备地址字由一个强制的1,0序列的前四个最有效的位,如所示。这是所有EEPROM设备的共同特点。
接下来的3位是1K/2K EEPROM的A2、A1和AO设备地址位。这3位必须与相应的硬接线输入引脚相比较。
最后一位为0表示写。最后一位为1表示读!
写操作
字节写:
写操作需要在设备地址字和确认之后有一个8位的数据字地址。一旦收到这个地址,EEPROM将再次响应一个零,然后在第一个8位数据字时钟。接收到8位数据字后,EEPROM将输出一个零。主机必须用一个停止条件终止写序列。此时,EEPROM进入一个内部计时的写周期,到非易失性存储器。在这个写周期中,所有输入都被禁用,EEPROM直到写完成才会响应。
页写入:
1K/2K EEPROM能够进行8字节的页写入,4K、8K和16K设备能够进行16字节的页写入。
页写的初始化过程与字节写的初始化过程相同。但是微控制器在第一个数据字被写入后并没有发送一个停止条件。
相反,在EEPROM承认接收到第一个数据字之后。该微控制器可以传输多达7 (1K/2K)或15 (4K, 8K, 16K)更多的数据字。EEPROM在接收到每个数据字后将以一个零响应。微控制器必须用一个停止条件终止页写序列。
当内部生成的字到达页面边界时,下面的字节被放置在同一页面的开头。
如果有超过8个(1K/2K)或16个(4K, 8K, 16K)数据字传输到EEPROM,数据字地址将“翻转”,先前的数据将被覆盖。
确认轮询:
一旦内部计时的写周期已经开始并且EEPROM输入被禁用,确认轮询可以被启动。这包括发送一个起始条件,后面跟着设备地址字。读/写位代表所需的操作。只有当内部写周期已经完成,EEPROM才会以零响应,允许读或写序列继续。
读操作
确认轮询:
一旦内部计时的写周期已经开始并且EEPROM输入被禁用,确认轮询可以被启动。这包括发送一个起始条件,后面跟着设备地址字。读/写位代表所需的操作。只有当内部写周期已经完成,EEPROM才会以零响应,允许读或写序列继续。
读操作和写操作的初始化方式相同,只是设备地址字的读/写选择位被设置为1。读操作有三种:
- 读当前地址
- 任意地址读
- 连续顺序读
当前地址读取:
内部数据字地址计数器维护上次读或写操作期间访问的最后一个地址,该地址加1。这个地址在操作之间保持有效,只要芯片电源是保持的。读取期间的地址“翻转”是从最后一个内存页的最后一个字节到第一个页的第一个字节。写过程中的地址“翻转”是从当前页的最后一个字节到同一页的第一个字节一旦具有读/写选择位设置为1的设备地址被打卡并被EEPROM确认。
任意地址读:
随机读需要一个“虚拟”字节写序列来加载数据字地址。一旦设备地址字和数据字地址被输入并且被EEPROM确认
微控制器必须产生另一个启动条件,微控制器现在通过发送带读设备地址来启动当前读地址。
EEPROM确认设备地址并报出数据字。微控制器后跟随停止条件结束。
连续顺序读:
顺序读由当前地址读或任意地址读发起。在微控制器收到一个数据字后,它以一个确认响应。只要EEPROM收到一个确认,它就会继续增加数据字地址,并连续地以时钟的方式中断连续的数据字。当达到内存地址限制时,数据字地址将“翻转”,顺序读取将继续。顺序读操作被终止时,后跟停止条件。
蓝桥杯部分
因为比赛常常存的数据不是8位的数据,而是一个超过255的数字,因此这里封装函数采用连续写,和连续读,但是向上提供的接口是一样的,方便后面使用
//写函数
void v_AtW(uchar addr, uint dat)
{
IIC_Start();
IIC_SendByte(SlaveAddrW);
IIC_WaitAck();
IIC_SendByte(addr/2);
IIC_WaitAck();
IIC_SendByte(dat >> 8);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//读函数
uint u_AtR(uchar addr)
{
uint _data;
IIC_Start();
IIC_SendByte(SlaveAddrW);
IIC_WaitAck();
IIC_SendByte(addr/2);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(SlaveAddrR);
IIC_WaitAck();
_data = IIC_RecByte();
IIC_SendAck(0);
_data = _data << 8 | IIC_RecByte();
IIC_Stop();
return _data;
}
void main()
{
uint saveData = 0;
UartInit();
v_AtW(0, 56431);
Delay500ms();
saveData = u_AtR(0);
while(1)
{
Delay500ms();
TI = 1;
printf("%u", saveData);
}
}
输出
版权声明:本文为CSDN博主「_WILLPOWER_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37429313/article/details/115317374
特性
256 x 8 (2K)
IIC接口、施密特触发器、噪声抑制
用于硬件数据保护的写保护引脚
8字节页(1K, 2K)
允许部分页写
写周期(最大5ms)
描述
AT24C02提供2048位的电可擦和可编程只读存储器(EEPROM)
组织为256, 8位字。该装置经过优化,可用于许多工业和商业应用。
引脚 | 功能 |
---|---|
A0-A2 | 地址输入 |
SDA | 串行数据 |
SCL | 串行时钟输入 |
WP | 写保护 |
NC | No Connect |
GND | 地 |
VCC | 电源 |
引脚描述:
- SERIAL CLOCK (SCL):
SCL输入用于将正边缘时钟数据输入到每个EEPROM设备,并将负边缘时钟数据输出到每个设备。 - SERIAL DATA (SDA):
SDA引脚是双向的,用于串行数据传输。 - DEVICE/PAGE ADDRESSES (A2, A1, A0):
A2、A1和AO引脚是硬接线AT24C02的设备地址输入。多达8个1K/2K设备可以在一个总线系统上被寻址。 - WRITE PROTECT (WP):
AT24C02有一个写保护引脚,提供硬件数据保护。当连接到地(GND)时,写保护引脚允许正常读/写操作。当引脚连接到Vcc时,就会启用Write protection特性,不允许读写。
存储组织:
AT24C02, 2K SERIAL EEPROM:
内部组织32页,每个8字节2K需要8位数据字地址用于随机字寻址也就是说有32页,每一页8Byte,每1Byte是8位,总共就是2Kbit的存储空间
设备操作(IIC)
-
时钟和数据转换:
SDA引脚通常与外部设备拉高。SDA引脚上的数据只能在SCL低时间段内改变。在SCL高时间段内的数据改变将表明如下定义的启动或停止条件。 -
启动条件:
SCL高的时候SDA从高到低的过渡是一个启动条件。 -
停止条件:
SCL高的SDA从低到高的转变是停止条件。在读取序列之后,stop命令将EEPROM置于备用电源模式。 -
确认:
所有地址和数据字都以8位字串行地传送到EEPROM或从它传送出来。EEPROM发送一个0来确认它已经接收到每个字。 -
待机模式:
AT24C01A/02/04/08A/16A具有低功率待机模式
启用:
(a)上电后
(b)在收到停止位和完成任何内部操作后。
设备地址
设备需要一个8位的设备地址字,后面跟着一个启动条件,以使芯片能够进行读或写操作
设备地址字由一个强制的1,0序列的前四个最有效的位,如所示。这是所有EEPROM设备的共同特点。
接下来的3位是1K/2K EEPROM的A2、A1和AO设备地址位。这3位必须与相应的硬接线输入引脚相比较。
最后一位为0表示写。最后一位为1表示读!
写操作
字节写:
写操作需要在设备地址字和确认之后有一个8位的数据字地址。一旦收到这个地址,EEPROM将再次响应一个零,然后在第一个8位数据字时钟。接收到8位数据字后,EEPROM将输出一个零。主机必须用一个停止条件终止写序列。此时,EEPROM进入一个内部计时的写周期,到非易失性存储器。在这个写周期中,所有输入都被禁用,EEPROM直到写完成才会响应。
页写入:
1K/2K EEPROM能够进行8字节的页写入,4K、8K和16K设备能够进行16字节的页写入。
页写的初始化过程与字节写的初始化过程相同。但是微控制器在第一个数据字被写入后并没有发送一个停止条件。
相反,在EEPROM承认接收到第一个数据字之后。该微控制器可以传输多达7 (1K/2K)或15 (4K, 8K, 16K)更多的数据字。EEPROM在接收到每个数据字后将以一个零响应。微控制器必须用一个停止条件终止页写序列。
当内部生成的字到达页面边界时,下面的字节被放置在同一页面的开头。
如果有超过8个(1K/2K)或16个(4K, 8K, 16K)数据字传输到EEPROM,数据字地址将“翻转”,先前的数据将被覆盖。
确认轮询:
一旦内部计时的写周期已经开始并且EEPROM输入被禁用,确认轮询可以被启动。这包括发送一个起始条件,后面跟着设备地址字。读/写位代表所需的操作。只有当内部写周期已经完成,EEPROM才会以零响应,允许读或写序列继续。
读操作
确认轮询:
一旦内部计时的写周期已经开始并且EEPROM输入被禁用,确认轮询可以被启动。这包括发送一个起始条件,后面跟着设备地址字。读/写位代表所需的操作。只有当内部写周期已经完成,EEPROM才会以零响应,允许读或写序列继续。
读操作和写操作的初始化方式相同,只是设备地址字的读/写选择位被设置为1。读操作有三种:
- 读当前地址
- 任意地址读
- 连续顺序读
当前地址读取:
内部数据字地址计数器维护上次读或写操作期间访问的最后一个地址,该地址加1。这个地址在操作之间保持有效,只要芯片电源是保持的。读取期间的地址“翻转”是从最后一个内存页的最后一个字节到第一个页的第一个字节。写过程中的地址“翻转”是从当前页的最后一个字节到同一页的第一个字节一旦具有读/写选择位设置为1的设备地址被打卡并被EEPROM确认。
任意地址读:
随机读需要一个“虚拟”字节写序列来加载数据字地址。一旦设备地址字和数据字地址被输入并且被EEPROM确认
微控制器必须产生另一个启动条件,微控制器现在通过发送带读设备地址来启动当前读地址。
EEPROM确认设备地址并报出数据字。微控制器后跟随停止条件结束。
连续顺序读:
顺序读由当前地址读或任意地址读发起。在微控制器收到一个数据字后,它以一个确认响应。只要EEPROM收到一个确认,它就会继续增加数据字地址,并连续地以时钟的方式中断连续的数据字。当达到内存地址限制时,数据字地址将“翻转”,顺序读取将继续。顺序读操作被终止时,后跟停止条件。
蓝桥杯部分
因为比赛常常存的数据不是8位的数据,而是一个超过255的数字,因此这里封装函数采用连续写,和连续读,但是向上提供的接口是一样的,方便后面使用
//写函数
void v_AtW(uchar addr, uint dat)
{
IIC_Start();
IIC_SendByte(SlaveAddrW);
IIC_WaitAck();
IIC_SendByte(addr*2);
IIC_WaitAck();
IIC_SendByte(dat >> 8);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//读函数
uint u_AtR(uchar addr)
{
uint _data;
IIC_Start();
IIC_SendByte(SlaveAddrW);
IIC_WaitAck();
IIC_SendByte(addr*2);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(SlaveAddrR);
IIC_WaitAck();
_data = IIC_RecByte();
IIC_SendAck(0);
_data = _data << 8 | IIC_RecByte();
IIC_Stop();
return _data;
}
void main()
{
uint saveData = 0;
UartInit();
v_AtW(0, 56431);
Delay500ms();
saveData = u_AtR(0);
while(1)
{
Delay500ms();
TI = 1;
printf("%u", saveData);
}
}
输出
版权声明:本文为CSDN博主「_WILLPOWER_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37429313/article/details/115317374
暂无评论