Привет.
Бывают ситуации когда нужно добавить дополнительную память в Ардуино, в этом нам поможет микросхема памяти 24LC32 (или подобные с другими размерами памяти). Она используется для хранения данных и программ в различных электронных устройствах, имеет объём памяти 32 килобита (либо другой).
Для подключения внешней памяти EEPROM к Arduino 24LC32 вам потребуется модуль памяти 24LC32 в DIP-корпусе. Схема подключения выглядит следующим образом:
- Подключите пины A0, A1 и A2 к земле.
- Соедините 4-й контакт с минусом и 8-й контакт модуля памяти с плюсом.
- SCL и SDA подключить к соответствующим пинам на плате (на разных платах Arduino пины SCL и SDA могут иметь разные номера, на плате Arduino Nano и lgt8f328p пины SCL и SDA обозначены как A5 и A4 соответственно) подтяните также их к питанию через резистор 1 или 10 кОм.
Теперь вы можете записывать и выводить значения в память EEPROM. Используем информацию из даташита на микросхему 24LC32.
Сначала необходимо отправить контрольный байт указывающий микросхему памяти и её адрес 1010000. Далее необходимо отправить High байт указывая на адрес ячейки в памяти микросхемы. В конце отправить Low байт прописывая наше значение в ячейку.
Для микросхемы 24LC32 доступно 32 килобайта (32 768 байта). Читать можем только по 1 байту, а записывать можно больше 1 байта за раз.
У нас имеется число в 2 байта. Для записи разделим его на 2 числа по 1 байту и запишем в ячейки 0 и 1. Далее ячейки 0 и 1 станут ячейкой с адресом 0, ячейки 2 и 3 станут ячейкой с адресом 1 и так далее.
Ячеек для записи значений 2 байта (unsigned int) по логике станет меньше в 2 раза 12 килобайт (12 288 байта).
Напишем код для записи и чтения 2 байтов информации:
#include <Wire.h> //подключение библиотеки Wire, которая используется для работы с EEPROM
#define disk1 0x50 // определение адреса EEPROM (0x50)
void setup() {
Wire.begin(); // инициализация библиотеки Wire для работы с EEPROM
writeEEPROM(0, 12345); // обращение к функции записи значения 12345 в ячейку EEPROM с адресом 0 и 1
Serial.println(readEEPROM(1)); // чтение значения из EEPROM с адресом 0 и 1 вывод его в порт
void loop() {
}
void writeEEPROM(unsigned int eeaddress, unsigned int data) { //введем функцию для записи 2 байт информации
Wire.beginTransmission(disk1);
Wire.write((int)(eeaddress * 2 >> 8));
Wire.write((int)(eeaddress * 2 & 0xFF));
Wire.write(data >> 8);
Wire.write(data);
Wire.endTransmission();
delay(5);
}
unsigned int readEEPROM(unsigned int eeaddress) { //напишем функцию, которая принимает аргументы и возвращает прочтенное число
unsigned int rdata = 0xFFFF;
Wire.beginTransmission(disk1);
Wire.write((int)(eeaddress * 2 >> 8));
Wire.write((int)(eeaddress * 2 & 0xFF));
Wire.endTransmission();
Wire.requestFrom(disk1, 1);
rdata = Wire.read();
Wire.beginTransmission(disk1);
Wire.write((int)(eeaddress * 2 + 1 >> 8));
Wire.write((int)(eeaddress * 2 + 1 & 0xFF));
Wire.endTransmission();
Wire.requestFrom(disk1, 1);
rdata = Wire.read() | (rdata << 8);
return rdata;
}
Ниже код дополнил комментариями и исправил недочеты
#include <Wire.h> // подключение библиотеки Wire для работы с EEPROM
#define disk1 0x50 // определение адреса EEPROM (0x50)
void setup() {
Serial.begin(9600); // инициализация Serial порта
Wire.begin(); // инициализация библиотеки Wire для работы с EEPROM
writeEEPROM(0, 12345); // запись значения 12345 в ячейки 0 и 1
Serial.print("Записанное число: 12345");
Serial.println();
unsigned int readValue = readEEPROM(0); // чтение из адреса 0 (фактически 2 байта)
Serial.print("Прочитанное число: ");
Serial.println(readValue);
// Дополнительная проверка: запись и чтение максимального значения
writeEEPROM(10, 65535); // максимальное значение для unsigned int
Serial.print("Максимальное значение (65535): ");
Serial.println(readEEPROM(10));
}
void loop() {
// пусто
}
// Функция для записи 2 байт информации
void writeEEPROM(unsigned int eeaddress, unsigned int data) {
Wire.beginTransmission(disk1);
// Отправляем адрес (16 бит разбиваем на 2 байта)
Wire.write((int)(eeaddress * 2 >> 8)); // старший байт адреса
Wire.write((int)(eeaddress * 2 & 0xFF)); // младший байт адреса
// Отправляем данные (16 бит разбиваем на 2 байта)
Wire.write(data >> 8); // старший байт данных
Wire.write(data & 0xFF); // младший байт данных
Wire.endTransmission();
delay(5); // небольшая задержка для завершения операции записи
}
// Исправленная функция для чтения 2 байт информации
unsigned int readEEPROM(unsigned int eeaddress) {
unsigned int highByte = 0;
unsigned int lowByte = 0;
// Чтение старшего байта
Wire.beginTransmission(disk1);
Wire.write((int)(eeaddress * 2 >> 8)); // старший байт адреса
Wire.write((int)(eeaddress * 2 & 0xFF)); // младший байт адреса
Wire.endTransmission();
Wire.requestFrom(disk1, 1); // запрашиваем 1 байт
if (Wire.available()) {
highByte = Wire.read();
}
// Чтение младшего байта
Wire.beginTransmission(disk1);
Wire.write((int)(eeaddress * 2 + 1 >> 8)); // старший байт следующего адреса
Wire.write((int)(eeaddress * 2 + 1 & 0xFF)); // младший байт следующего адреса
Wire.endTransmission();
Wire.requestFrom(disk1, 1); // запрашиваем 1 байт
if (Wire.available()) {
lowByte = Wire.read();
}
// Комбинируем байты в правильном порядке
unsigned int rdata = (highByte << 8) | lowByte;
return rdata;
}
Отлично! Данный код позволит без труда записывать и читать с микросхемы 24LC32 данные типа unsigned int.