特性
描述

| 引脚 | 功能 |
|---|---|
| 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)在收到停止位和完成任何内部操作后。
设备地址
写操作
字节写:
页写入:

确认轮询:
一旦内部计时的写周期已经开始并且EEPROM输入被禁用,确认轮询可以被启动。这包括发送一个起始条件,后面跟着设备地址字。读/写位代表所需的操作。只有当内部写周期已经完成,EEPROM才会以零响应,允许读或写序列继续。
读操作
确认轮询:
一旦内部计时的写周期已经开始并且EEPROM输入被禁用,确认轮询可以被启动。这包括发送一个起始条件,后面跟着设备地址字。读/写位代表所需的操作。只有当内部写周期已经完成,EEPROM才会以零响应,允许读或写序列继续。
读操作和写操作的初始化方式相同,只是设备地址字的读/写选择位被设置为1。读操作有三种:
- 读当前地址
- 任意地址读
- 连续顺序读
当前地址读取:
内部数据字地址计数器维护上次读或写操作期间访问的最后一个地址,该地址加1。这个地址在操作之间保持有效,只要芯片电源是保持的。读取期间的地址“翻转”是从最后一个内存页的最后一个字节到第一个页的第一个字节。写过程中的地址“翻转”是从当前页的最后一个字节到同一页的第一个字节一旦具有读/写选择位设置为1的设备地址被打卡并被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); } }
输出


发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218485.html原文链接:https://javaforall.net
