外部EEPROM读写问题(Arduino Uno)

时间:2018-08-09 18:39:13

标签: arduino

我有通过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),但是我不知道如何在代码中使用它。

0 个答案:

没有答案