我有通过I2C连接的Arduino Uno(Atmega328p)和外部EEPROM。
我在Arduino Studio中的代码:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#define EEPROM_ADDR 0x50
#include <M24AA01.h>
M24AA01 dev(0);
byte data[1] = {1};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC);
writeEEPROM(1);
uint8_t readData = readEEPROM(1);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(5,30);
display.print("read:");
display.print(data);
display.display();
}
void loop() {
// put your main code here, to run repeatedly:
}
void writeEEPROM(unsigned int eeaddress)
{
Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write(data[0]);
Wire.endTransmission();
delay(5);
}
uint8_t readEEPROM(unsigned int eeaddress)
{
uint8_t rdata = 0xFF;
Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDR,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
我与EEPROM的物理连接:
PIN 1 :A0-5V(VCC)
PIN 2 :A1-0(GND)
PIN 3 :A2-0(GND)
PIN 4 :VSS-0(GND)
PIN 5 :SDA-SDA
PIN 6 :SCL-SCL
PIN 7 :WP-0(GND)
PIN 8 :VCC-5V(VCC)
我有EEPROM的DIP版本。
从文档中我读到EEPROM的地址为0x50
(1010000)。 A0连接到5V,但是根据文档,A0,A1,A2都是“不在乎”的,所以我相信地址是可以的。
无论我向EEPROM写入什么内容,在这种情况下,我都只写入1字节的数据(数字1)-它读取255。
我注意到的一件事是,我没有在代码中指定是否要写入或读取(在文档中,第8位是读取/写入位,读取= 1,写入= 0),但是我不知道如何在代码中使用它。