STM32-16 I²C EEPROM DataSheet

上一篇介绍过了I2C的基本原理以及相关的函数,这一篇会介绍EEPROM来做为I2C实作的示範。

什么是EEPROM?

全名是电子抹除式可複写唯读记忆体,他是一种唯读记忆体(ROM)可以透过程式去多次的写入资料,同时断电后不会清出资料。如果需清除资料可以在特定电压下来清除资料,重新的写入。

这一次使用的是AT24C256B EEPROM,它的特点如下
http://img2.58codes.com/2024/201463255CmCdsGIVW.png

使用I2C介面储存容量256kbit (1 page 32K * 8)硬体写入保护

接下来来看一下脚位如何连接:
http://img2.58codes.com/2024/20146325iC6fH1ARd4.png

VCC : 连接5VWP : 写入保护 可以不用接(WP = 1 禁止写入)SCL : 时钟线 连接到开发板上的SCL (PB6)SDA : 资料线 连接到开发板上的SDA (PB7)A0 A1 A2 : 每一个I2C设备都有它专属的地址在这为 1 0 1 0 A2 A1 A0 R/W,假设都不接的话地址为 1 0 1 0 0 0 0 R/WGND : 接地

时序

资料有效性 : 当SCL = 1时资料稳定 SDA不可更动 ; SCL = 0时资料混乱可进行资料交换
http://img2.58codes.com/2024/201463254I9kqscAGO.png起始与结束信号
http://img2.58codes.com/2024/20146325GFAbEakfdY.png
//I2C StartSDA = 1;delay();SCL = 1;delay();SDA = 0;delay();SCL = 0;delay();
//I2C StopSDA = 0;delay();SCL = 1;delay();SDA = 1;delay();
ACK : 下图可以看到当EEPROM在接收到完整8bit讯息后,会在第9个bit去输出ACK。
http://img2.58codes.com/2024/20146325OhjJ0UYCch.png

设备地址

http://img2.58codes.com/2024/2014632586g1NIWnGh.png
上图是AT24C256B的设备地址,前面有提到前4bit是设备固定的地址无法更动。可以更动后方A2-A0来改变地址,最多可以接上8个。

R/W : 指的是Read / Write 会接续在地址后方,透过R/W bit 可以告知EEPROM这一次的指令是要读取还是写入资料。 ( R = 1 , W = 0)


如何对AT24C256B写入

Byte write : 一次只写入一个byte的资料量
http://img2.58codes.com/2024/20146325pLeM0gyeUK.png
上图为Byte Write的说明我们把它拆解成以下步骤 :先发送起始信号设备定址(1 0 1 0 A2 A1 A0 0),因为是写入所以最后的R/W会是0。输出一个ACK (这时Master可以去读取看看有没有ACK的回覆)接上第一个写入地址ACK第二个写入地址ACK要写入的资料ACK结束信号

这边先说明一下写入地址是什么?

http://img2.58codes.com/2024/20146325PdCFzWB1xV.png
上图可以看到AT24C256B的储存空间是分为512页且每一页有64Byte。

First word address : 可以把它理解成页数

Second word address : 可以把它理解成第几页当中的第几个字

根据上面说的 512页*64个字,而两地址总共为15bit。(0-511)(0-63)

2^9 = 512页 2^6 = 64个字所以在Second Word Address低6bit就是页内地址而其余的就是页数地址。

举例来说假如我们要写第3页的第2个位置就会是 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0

Page Write : 一次写入一整页的64bytes
http://img2.58codes.com/2024/201463251BNQHSKlMI.png
上图为Page Write的说明我们把它拆解成以下步骤 :先发送起始信号设备定址(1 0 1 0 A2 A1 A0 0),因为是写入所以最后的R/W会是0。接上第一个写入地址ACK第二个写入地址ACK持续写入n资料(0≤n≤63),每一笔资料会接一个ACK停止信号

这边要注意假设原先这一页已有资料,后续超过的资料将覆盖到同页前面的资料并不会换页。


如何对AT24C256B读取

读取分为三种方式: 当前地址读取、随机地址读取、顺序读取

当前地址读取 : AT24C256B会保存上一次读or写的地址,透过这个方式会去读取n+1的位置。要注意假设是该页最后一个位置会翻转地址回到第一个地址。举例来说假设上次写入 0 page 1 word 那使用当前地址读取就会读到0 page 2 word的资料。
http://img2.58codes.com/2024/20146325MvehXl1LO7.png先发送起始信号接上设备地址(1 0 1 0 A2 A1 A0 1),因为读取所以最后的R/W会是1。ACK这时会带回该地址的资料NACK (SDA = 1)发送停止信号随机地址读取 : 下图有一段是Dummy Write 在这过程其实是去写入一个地址改变AT24C256B所储存的上一次读写地址,接着透过当前地址读的方法读取资料。
http://img2.58codes.com/2024/201463252ZCHH0WBDj.png先发送起始信号设备地址(1 0 1 0 A2 A1 A0 0 ),因为是写入所以最后的R/W会是0。(要写入地址资料)ACK写入一个地址去改变AT24C256B的上一次地址ACK

上方5个步骤是Dunny Write的拆解

再发送一次起始信号(开始当前位置读的步骤)设备地址(1 0 1 0 A2 A1 A0 1),因为读取所以最后的R/W会是1。ACK带回读取到的资料NACK结束信号连续读取 : 启动方式由随机地址读取与当前地址读取来启动,当每读到一笔资料回覆给EEPROM一个ACK,就可以持续读取资料。同样当读取到最后一笔时会把地址翻转回第一个。
http://img2.58codes.com/2024/20146325ykLb2inaHn.png起始信号设备地址(1 0 1 0 A2 A1 A0 0 ),因为是写入所以最后的R/W会是0。ACK写入页地址ACK页内地址ACK再发送一次起始信号设备地址(1 0 1 0 A2 A1 A0 1),因为读取所以最后的R/W会是1。ACK只要有ACK就持续读取资料,当要停止时则由MCU发送一个NACK结束信号

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章