---
title: Flash 記憶體的原理與應用—PART8（I2C EEPROM）
description: "**作者：Bird** 上一回我們介紹了 I^2C EEPROM 的應用情境，以…"
url: "https://makerpro.cc/docs/flash-memory-principle-and-application-part8/"
updated: "2025-03-26"
category: Flash記憶體
---

# Flash 記憶體的原理與應用—PART8（I2C EEPROM）

**作者：Bird**

上一回我們介紹了 I^2C EEPROM 的應用情境，以及它的晶片封裝有哪些訊號，這一回我們要繼續介紹如何用 I^2C 的通訊來操作 I^2C EEPROM 的讀寫。

### **I^2C 通訊**

一個 I^2C 通訊一定是由 master 發起。當 master 想要與某一個 slave 通訊時，它會在 bus 上送出一個 START condition，接著送出要通訊的 7-bit slave address，再加上一個 bit 的讀寫控制 bit。如果 bus 上有 slave 裝置符合這個 slave address，這個 slave 裝置就會在 I^2C bus 上回應一個 ACK，讓 master 知道有人接電話了，Master 收到 ACK 後，確定它不是在對空氣講話，就會繼續接下來的通訊。

I^2C 所有的通訊都是以 8-bit，也就是 byte 為單位，由 master 發起的第一個 byte 就是 7 個 bit 的 slave address 加上一個讀寫控制 bit：0 代表寫入、1 代表讀取，但 I^2C address 這件事常常會讓人搞混，因為有時候我們會直接把第一個 byte 的內容當作 I^2C address；以 24LC64 這個 I^2C EEPROM 為例，有時候我們會講：對 0xA0 這個 I^2C 位址通訊的話就是寫入、對 0xA1 這個位址通訊的話就是讀取，這種包含讀寫控制 bit 的位址表示方法，通常叫做「8-bit I^2C address」，而如果我們將前面 7 個 bit 與讀寫控制 bit 分開來說，那就是「7-bit I^2C address」，以 24LC64 來說，它的 7-bit I^2C address 就是 0x50。

因此，當我們看到一個裝置的 I^2C address 時，最好先確定一下它到底是 7-bit 表示法還是 8-bit 表示法，特別是當它小於 0x80 的時候。

### **內部位址指標**

在 24LC64 EEPROM 的內部有一個位址指標（address pointer），所有的讀寫操作都是經由這個指標完成的，在讀或寫之前，要先設定這個指標到要讀寫的位置上。

24LC64 有 64K bits 的容量，不過 I^2C 的資料傳輸單位是 byte，因此 24LC64 內部實際上是以 8K bytes 的形式在儲存資料，要定址 8K 個不同的位址，需要 13 個 bit （2^13 = 8192），所以 24LC64 的內部位址指標是 13 個 bit。

### **讀取**

以下是一個讀取的動作：

 ![](https://makerpro.cc/wp-content/uploads/2024/07/Screenshot-2024-07-27-233139.png)

（圖片來源：Bird 提供）

當我們要讀取 24LC64 裡的資料時，首先要用 I^2C 的寫入動作來設定位址指標，接著不要送出 STOP，而是直接用另一個 START 對 24LC64 的 slave address 開始一個讀取的動作，然後隨著 master 持續送出 SCL 訊號，24LC64 就會在 SDA 上吐出位址指標所指的那個 byte 的資料。每讀出一個 byte 的資料之後，24LC64 內部的位址指標會自動加一。

如果只要讀取一個 byte，那麼當一個 byte 吐完後，master 可以送出 NO ACK 狀態，結束這個回合；如果 master 送出 ACK，代表它還想要繼續讀取，這時 master 可以繼續送出 SCL 訊號，而因為 24LC64 內部的位址指標在剛剛讀完上一個 byte 時就已經自動加一，它當然就會繼續吐出下一個位址的資料。

 ![](https://makerpro.cc/wp-content/uploads/2024/07/Screenshot-2024-07-27-233145.png)

（圖片來源：Bird 提供）

這個動作稱之為「sequential read」，它可以只送一次位址就連續從 24LC64 讀出許多個 bytes 的資料。

### **寫入**

寫入時的操作其實也一樣：先設定內部位址指標，然後把資料寫進去，但不同的是，設定內部位址指標時已經是寫入動作，因此寫完兩個 bytes 的指標後，master 可以接著送出要寫入的資料，不必用 START condition 重新開始另一個動作。

 ![](https://makerpro.cc/wp-content/uploads/2024/07/Screenshot-2024-07-27-233151.png)

（圖片來源：Bird 提供）

寫入動作同樣也可以連續執行。如果寫完一個 byte 之後，master 不是送出 STOP condition，而是繼續送出資料，隨著內部位址指標的自動增加，就可以連續寫入很多個 bytes：

 ![](https://makerpro.cc/wp-content/uploads/2024/07/Screenshot-2024-07-27-233158.png)

（圖片來源：Bird 提供）

24LC64 最多可以一次寫入 32 個 bytes 的資料，如果送超過 32 個 bytes，會蓋掉第一個送過去的 byte，實際的寫入動作會在 STOP condition 送出後才被執行。

雖然連續寫入有 32 bytes 的限制，但是連續讀取卻沒有長度的限制。你可以在一個讀取動作中，讓 master 不斷的送出 ACK，叫 24LC64 一直吐出接下來的資料，隨著它內部位址指標的自動增加，你可以一次讀出沒有長度限制的資料，而且當內部位置指標到達最大值 0x1FFF 後，它會自動繞回 0x0000，讓你可以從頭繼續讀取。

以 400KHz 的 I^2C Fast Mode 來計算，讀取 8192 個 bytes 會需要：

8192 * 9 / 400K = 0.18432（秒）

上面那個算式乘以 9 是因為每讀取一個 byte 需要 8 次 SCL 的動作，加上一次 ACK，總共 9 次。

### **小結**

這一回我們說明了如何利用 I^2C 上的通訊來讀取和寫入 24LC64 這顆 I^2C EEPROM 的內容。寫入時，實際寫入的動作是發生在 STOP condition 之後，而且寫入其實比讀取要花時間，因為 24LC64 內部的控制電路要先擦除欲寫入位址的內容，才能將資料寫進去，這個動作根據 24LC64 的 datasheet 描述，會花到 5 ms。

5 ms 對大部分的 MCU 來講已經是一個很長很長的時間，下一回我們會繼續來探討，要如何等待這一個時間，知道它寫入完成了沒。

（責任編輯：賴佩萱）
