Может читать / записывать адрес EEPROM, но может только читать / записывать первую страницу памяти

РЕДАКТИРОВАТЬ: Я был БИТ запутался насчет БИТОВ и БАЙТОВ, документация указывает биты, а не в байтах и ​​читает биты как байты. Это объясняет мою ошибку. Почему производители используют биты вместо байтов для указания емкости? это немного сбивает с толку. 😉


Я нашел Atmel 24C02n 2 Кб EEPROM на запасной плате, и я хочу попробовать, чтобы посмотреть, какие данные находятся внутри этого чипа, и могу ли я использовать их повторно. Никогда не заканчивал чтение / запись внешней памяти. Проводка проста (i2c) и работает отлично.

Запустите i2cScanner и он нашел 8 адресов на шине, 0x50 .. 0x57. Сначала подумала: «странно, 8 адресов на одно устройство». Документация описывает, что есть 8×256 байтов, так что хорошо, 8 адресов для 8 страниц по 256 байтов.

Однако, когда я хочу получить доступ к другой странице, например, 0x51, я получаю те же данные, и кажется, что они записывают на ту же страницу памяти. Я что-то здесь скучаю?


Это мой пример кода с использованием библиотеки проводов:

#include <Wire.h>

int     A24C_PAGE_COUNT     = 8;
uint8_t A24C_PAGE_ADDR[8]   = { 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57 };
int     A24C_PAGE_SIZE      = 256;

uint8_t eepromReadAddress(int address, int from_addr)
{
Wire.beginTransmission(address);
Wire.write(from_addr);

Wire.requestFrom(address, 1);

uint8_t iResult = (Wire.available())?Wire.read():0x32;
Wire.endTransmission();

return iResult;
}

void eepromWriteAddress(uint8_t address, uint8_t from_addr, uint8_t* data)
{
Wire.beginTransmission(address);

Wire.write(from_addr);
while( *data )
{ Wire.write( *data++ ); }

Wire.endTransmission();
}

void eepromRead()
{
int iByte = 0;
int iPage = 0;
while( iPage < A24C_PAGE_COUNT )
{
Serial.print( "PAGE: " );
Serial.println( iPage+1 );

while( iByte < A24C_PAGE_SIZE )
{
//Serial.print( "0x" );
Serial.print( (char)eepromReadAddress( A24C_PAGE_ADDR[ iPage ], iByte ) );
++iByte;
Serial.print(( iByte % 16 == 0 )?"\n":",");
}

iByte=0;
++iPage;
}
}

void setup()
{
Wire.begin();
Serial.begin(9600);

delay( 1000 );
//eepromWriteAddress( 0x50, 128, "Hello world!" );
eepromRead();
}

void loop() {
}

Выходной после того, как один раз напишите «Привет мир! к первой странице в позиции 128 я получу:

PAGE: 1
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
PAGE: 2
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
PAGE: 3
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
PAGE: 4
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
PAGE: 5
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
PAGE: 6
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
PAGE: 7
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
PAGE: 8
G, ,?,?,, ,,k, ,, ,, ,., ,
,, ,!,,,,?, ,,!,?, ,Q,?,4
,?, ,,I,?, ,<, ,?,?,?,?,?,?,?
?, ,D, ,,<, ,,?, ,, ,,t, ,
?, ,?,?,?,?,?, , , , , , , , ,
, , , , , , , , , , , , , , ,
, , , , , ,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,H,e,l,l,o, ,w,o,r,l,d,!,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?

Каждый адрес указывает на одну и ту же страницу ????

Хорошо, другой подход, изменил следующие переменные, чтобы прочитать одну большую страницу (просто попытаться увидеть, что произойдет):

int     A24C_PAGE_COUNT     = 1;
int     A24C_PAGE_SIZE      = 2048;

Тот же результат, отображается только первая страница, но повторяется 8 раз. Так что я не так делаю? И почему в любом случае есть 8 адресов для одного устройства?

4

Решение

Объем памяти ОЗУ и ПЗУ обычно выражается в биты, не байтов как вы, кажется, предполагаете.

Таким образом, этот чип имеет 8 х 256 биты ЭСППЗУ, и вы, кажется, ожидаете гораздо больше памяти, чем на самом деле — вы можете хранить 256 байтов в этом чипе.

Чипы с малой емкостью, по-видимому, используют тот же механизм декодирования адресов, что и чипы с большей емкостью, поэтому вы, похоже, видите простую передачу адресов, когда вы снова и снова читаете одни и те же байты (см. Стр. 10). из таблицы на «опрокидывание»).

Что касается ваших «ответов на более чем один адрес I2C» — как вы подключили линии A0, A1, A2? Они должны быть встроены, чтобы создать адрес устройства.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]