c – 可以读/写EEPROM地址但是只能读/写第一个存储页面

编辑:我对BITS和BYTES感到困惑,文档指定位而不是字节,并将位读取为字节.这解释了我的错误.为什么制造商使用位而不是字节来指定容量?这是令人困惑的BIT. 😉

我在备用电路板上找到了Atmel 24C02n 2kb EEPROM,并想试一下这个芯片内部的数据类型以及是否可以重复使用.从未读过/写入外部存储器.接线很简单(i2c),工作完美.

运行i2cScanner,它在总线上找到了8个地址,0x50 .. 0x57.首先想到的是:“奇怪,一个设备有8个地址.”该文档描述了8×256字节,所以没关系,8个256字节的8个地址.

但是,当我想访问另一个页面时,例如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() {
} 

写完“Hello world!”后输出到第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个地址呢?

最佳答案 RAM和ROM的存储容量通常用位表示,而不是像你想象的那样用字节表示.

所以你所指的这个芯片有8 x 256位EEPROM,你似乎期望比实际存在的内存多得多 – 你可以在该芯片中存储256个字节.

低容量芯片显然使用与更高容量芯片相同的地址解码机制,所以你看到的是在你一遍又一遍地读取相同字节时简单的地址环绕(见第10页)关于“翻转”的数据表.

关于“多个I2C地址的答案” – 您是如何连接A0,A1,A2线路的?他们需要通过硬线连接来创建设备的地址.

点赞