#include <Wire.h>
#define EEPROM_ADDR_1 0x50
#define EEPROM_ADDR_2 0x54
#define EEPROM_PGSZ 0x20
#define HALF_BUFFER 16
#define TEST_POS 100
//------------------------------------------------------------------------//
bool TestAddres(byte address)
{
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
return (error == 0);
}
//------------------------------------------------------------------------//
bool writeEEPROM_i2c(uint8_t EEPROM_ADDR,uint16_t addr, uint16_t len, const uint8_t * data )
{
uint16_t data_pntr = 0;
uint16_t first_page = addr / HALF_BUFFER; // начальная страница памяти
uint16_t last_page = (addr + len - 1) / HALF_BUFFER + 1;; // конечная страница памяти
uint16_t first_byte = addr;
uint16_t end_byte = min((first_page + 1) * HALF_BUFFER - 1, addr + len - 1) + 1;
for (int i = first_page; i < last_page; i++)
{
Wire.beginTransmission(EEPROM_ADDR);
Wire.write(first_byte >> 8);
Wire.write(first_byte & 0xFF);
for (int j = first_byte; j < end_byte; j++)
{
Wire.write(data [data_pntr++]);
}
bool err = Wire.endTransmission(); // добавить обработчик ошибок
if (err != 0) return false;
delay(5);
first_byte = end_byte;
end_byte = min(first_byte + HALF_BUFFER- 1, addr + len - 1) + 1;
}
return true;
}
//------------------------------------------------------------------------//
bool readEEPROM_i2c(uint8_t EEPROM_ADDR, uint16_t addr, uint16_t len, uint8_t * data)
{
Wire.beginTransmission (EEPROM_ADDR);
Wire.write ((uint8_t ) (addr >> 8)); // старший байт адреса чтения
Wire.write ((uint8_t ) (addr & 0xFF)); // младший байт адреса чтения
bool err = Wire.endTransmission();
if (err != 0) return false; // ошибка доступа!
/* выбираем размер для чтения, либо по буферу либо по странице EEPROM
предполагаем, что размер буфера кратен размеру страницы памяти
буфер Wire 32, буфер TinyWireM 16
Страницы памяти 32 64 128 256 байт
*/
uint8_t One_Page = min(EEPROM_PGSZ, BUFFER_LENGTH);
uint16_t first_page = addr / One_Page;; // начальная страница памяти
uint16_t last_page = (addr + len - 1) / One_Page + 1;; // конечная страница памяти
uint16_t first_byte;// адрес 1-го байта для чтения
uint16_t end_byte; // адрес последнего байта для чтения
uint16_t data_pntr = 0;
for (int i = first_page; i < last_page; i++)
{
first_byte = i * One_Page;
end_byte = (i + 1) * One_Page - 1;
first_byte = max(addr, first_byte);
end_byte = min(end_byte, addr + len - 1);
Wire.requestFrom (EEPROM_ADDR, end_byte - first_byte + 1);
uint8_t cntr = 0;
while (Wire.available())
{
data [data_pntr] = Wire.read ();
data_pntr++;
cntr++;
}
if ((end_byte - first_byte + 1) != cntr) return false; // считано меньше чем надо. Ошибка!
}
return true;
}
void setup() {
Wire.begin();
Serial.begin(115200);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
digitalWrite(4,0);
digitalWrite(5,0);
byte TestArray[10];
Serial.println("Пишем в перувую память");
digitalWrite(4,1); // устанавливаем на 1-ой памяти адрес 54H
for (byte i=0;i<10;i++)TestArray[i]=i;
writeEEPROM_i2c(EEPROM_ADDR_2,TEST_POS,10,TestArray); //записываем туда данные от 0 до 9
digitalWrite(4,0); // устанавливаем на 1-ой памяти адрес 50H
Serial.println("Пишем во вторую память");
digitalWrite(5,1); // устанавливаем на 2-ой памяти адрес 54H
for (byte i=0;i<10;i++)TestArray[i]=i+10;
writeEEPROM_i2c(EEPROM_ADDR_2,TEST_POS,10,TestArray); //записываем туда данные от 10 до 19
digitalWrite(5,0); // устанавливаем на 1-ой памяти адрес 50H
Serial.println("Читаем из перувой памяти");
digitalWrite(4,1); // устанавливаем на 1-ой памяти адрес 54H
readEEPROM_i2c(EEPROM_ADDR_2,TEST_POS,10,TestArray);
for (byte i=0;i<10;i++) Serial.print(TestArray[i]);
Serial.println();
digitalWrite(4,0); // устанавливаем на 1-ой памяти адрес 50H
Serial.println("Читаем из второй памяти");
digitalWrite(5,1); // устанавливаем на 1-ой памяти адрес 54H
readEEPROM_i2c(EEPROM_ADDR_2,TEST_POS,10,TestArray);
for (byte i=0;i<10;i++) Serial.print(TestArray[i]);
Serial.println();
digitalWrite(5,0); // устанавливаем на 1-ой памяти адрес 50H
}
void loop() {
}