16. STM32-I²C EEPROM DataSheet

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

什麽是EEPROM?

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

这一次使用的是AT24C256B EEPROM,它的特点如下
https://ithelp.ithome.com.tw/upload/images/20220320/201463255CmCdsGIVW.png

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

接下来来看一下脚位如何连接:
https://ithelp.ithome.com.tw/upload/images/20220320/20146325iC6fH1ARd4.png

  • VCC : 连接5V
  • WP : 写入保护 可以不用接(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/W
  • GND : 接地

时序

  • 资料有效性 : 当SCL = 1时资料稳定 SDA不可更动 ; SCL = 0时资料混乱可进行资料交换
    https://ithelp.ithome.com.tw/upload/images/20220320/201463254I9kqscAGO.png
  • 起始与结束信号
    https://ithelp.ithome.com.tw/upload/images/20220320/20146325GFAbEakfdY.png
//I2C Start
SDA = 1;
delay();
SCL = 1;
delay();
SDA = 0;
delay();
SCL = 0;
delay();
//I2C Stop
SDA = 0;
delay();
SCL = 1;
delay();
SDA = 1;
delay();
  • ACK : 下图可以看到当EEPROM在接收到完整8bit讯息後,会在第9个bit去输出ACK。
    https://ithelp.ithome.com.tw/upload/images/20220320/20146325OhjJ0UYCch.png

设备地址

https://ithelp.ithome.com.tw/upload/images/20220320/2014632586g1NIWnGh.png
上图是AT24C256B的设备地址,前面有提到前4bit是设备固定的地址无法更动。可以更动後方A2-A0来改变地址,最多可以接上8个。

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


如何对AT24C256B写入

  • Byte write : 一次只写入一个byte的资料量
    https://ithelp.ithome.com.tw/upload/images/20220320/20146325pLeM0gyeUK.png
    上图为Byte Write的说明我们把它拆解成以下步骤 :
  1. 先发送起始信号
  2. 设备定址(1 0 1 0 A2 A1 A0 0),因为是写入所以最後的R/W会是0。
  3. 输出一个ACK (这时Master可以去读取看看有没有ACK的回覆)
  4. 接上第一个写入地址
  5. ACK
  6. 第二个写入地址
  7. ACK
  8. 要写入的资料
  9. ACK
  10. 结束信号

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

https://ithelp.ithome.com.tw/upload/images/20220320/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
    https://ithelp.ithome.com.tw/upload/images/20220320/201463251BNQHSKlMI.png
    上图为Page Write的说明我们把它拆解成以下步骤 :
  1. 先发送起始信号
  2. 设备定址(1 0 1 0 A2 A1 A0 0),因为是写入所以最後的R/W会是0。
  3. 接上第一个写入地址
  4. ACK
  5. 第二个写入地址
  6. ACK
  7. 持续写入n资料(0≤n≤63),每一笔资料会接一个ACK
  8. 停止信号

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


如何对AT24C256B读取

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

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

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

  1. 再发送一次起始信号(开始当前位置读的步骤)
  2. 设备地址(1 0 1 0 A2 A1 A0 1),因为读取所以最後的R/W会是1。
  3. ACK
  4. 带回读取到的资料
  5. NACK
  6. 结束信号
  • 连续读取 : 启动方式由随机地址读取与当前地址读取来启动,当每读到一笔资料回覆给EEPROM一个ACK,就可以持续读取资料。同样当读取到最後一笔时会把地址翻转回第一个。
    https://ithelp.ithome.com.tw/upload/images/20220320/20146325ykLb2inaHn.png
  1. 起始信号
  2. 设备地址(1 0 1 0 A2 A1 A0 0 ),因为是写入所以最後的R/W会是0。
  3. ACK
  4. 写入页地址
  5. ACK
  6. 页内地址
  7. ACK
  8. 再发送一次起始信号
  9. 设备地址(1 0 1 0 A2 A1 A0 1),因为读取所以最後的R/W会是1。
  10. ACK
  11. 只要有ACK就持续读取资料,当要停止时则由MCU发送一个NACK
  12. 结束信号

<<:  [笔记][JavaScript] - 随机取出阵列元素之值

>>:  计算机概论 - 软件工程 Software engineering

B+树索引实战篇-Part1(索引的代价、扫描区间与边界条件)

前文非常详细的说明了Innodb储存引擎的B+树索引,我们必须熟悉下面这些观念。 每个索引都对应一棵...

Day29 黑人变白人 (  皮肤上色 )

黑人变白人 (  皮肤上色 ) 教学原文参考:黑人变白人 (  皮肤上色 ) 这篇文章会介绍在 GI...

【Day15】数据展示元件 - Carousel

元件介绍 Carousel 是一个像旋转木马一样会轮流转的轮播元件。在一个内容空间有限的可视范围中进...

【图解演算法教学】一次搞懂「资料结构」与「演算法」到底是什麽?

Youtube连结:https://bit.ly/35x3dih 这次我们将精确定位出,在整个演算...

30天零负担轻松学会制作APP介面及设计【DAY 17】

大家好,我是YIYI,今天我要来制作记帐和报表的页面。 记帐页面 和制作前面的页面一样,先将BACK...