什麼是 EEPROM ?
EEPROM 代表電子可擦除式可做讀寫的存儲器。它允許在使用非常少的功率的情況下長時間寫入和存儲值。大多數微控制器甚至在其電路中直接有 EEPROM,例如 ATmega328P(Arduino Uno 芯片),它有 1KB。但如果這還不夠呢?SD 卡具有更大的存儲容量,但也更複雜、體積更大且耗電量更大。
這次的範例使用 Arduino 的 Wire 基本函式, 不套用現成 Library 。從實做中理解控制原理。這次選用型號為 AT24C02B / 儲存空間 2Kbit
Datasheet ( https://ww1.microchip.com/downloads/en/DeviceDoc/doc5126.pdf)
輸出腳位
開發板
此次使用的是 自行開發的 A1 Lite / Realtek RL8720DN 。連結在此 (連結) ,在這就不多做介紹。
在 A1 Lite 使用 I2C 前先將預裝的提升電阻用焊接的方式將 JP2 , JP3 短接起來
接線
AT24C02 | Connect | A1 Lite |
A0 | GND | |
A1 | GND | |
A2 | GND | |
GND | GND | GND |
SDA | 8 | |
SCL | 7 | |
WP | GND | |
VCC | 3V3 | 3V3 |
EEPROM I2C 位址
位址為 7-bit 規則 , A0 ~ A2 均接地。 所以位址為 0x50
寫入資料
我們要先確認 WP 是否接入 GND。首先送出 EEPROM 的設備位址,0x50 ~ 0x57 之間。根據接線需送出 0x50 (若設備得到正確位址會有 NACK/ACK 反饋)。接著送出數據位址,再送出資料,最後發出 STOP 訊號 endTransmission() 告知 EEPROM 不再繼續。
程式碼
void WriteByte(uint8_t data_addr, uint8_t data)
{
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(data_addr);
Wire.write(data);
Wire.endTransmission();
}
讀取資料
首先要先送出 EEPROM 設備位址 及 數據位址。接下來再送出 設備位址,EEPROM 會反饋 1 組(Byte)資料。
程式碼
uint8_t ReadByte(uint8_t data_addr)
{
uint8_t data;
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(data_addr);
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDRESS,1);
if(Wire.available())
{
data = Wire.read();
}
Wire.endTransmission();
return data;
}
綜合以上,組成
WriteByte(1,0x5A);
delay(10);
Serial.println(ReadByte(1),HEX);
輸出結果
進階
以 AT24C02 來說, 它是由 8 bytes 組成 一個 page, 以這個型號有 32 page。它可以一次寫入讀取最多 8 bytes 的資料, 我們將改寫程式
寫入資料
void WriteBytes(uint8_t data_addr, uint8_t *data,uint8_t len)
{
uint8_t x;
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(data_addr);
for(x = 0; x < len; x++)
{
Wire.write(data[x]);
}
Wire.endTransmission();
}
讀取資料
void ReadBytes(uint8_t data_addr,uint8_t *data, int len)
{
uint8_t x;
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(data_addr);
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDRESS,len);
if(Wire.available())
{
for(x = 0; x < len;x++)
{
data[x] = Wire.read();
}
}
Wire.endTransmission();
}
輸出結果
GitHub 完整程式碼
連結 ( https://github.com/cold63/Arduino_Code/tree/main/I2C_EEPROM )
其他參考
TI 應用手冊 Understanding the I2C Bus (SLVA704 )
連結 ( https://www.ti.com/lit/an/slva704/slva704.pdf )
0 comments:
發佈留言