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

时间:2017-12-14 22:43:00

标签: c++ memory avr eeprom

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

我在备用电路板上找到了Atmel 24C02n 2kb EEPROM,想要试一试看看这个芯片里面有什么样的数据,以及我是否可以重复使用它。从未读过/写入外部存储器。接线很简单(i2c),工作完美。

运行i2cScanner,它在总线上找到了8个地址,0x50 .. 0x57。首先想到:"奇怪,一个设备有8个地址。"该文档描述了8x256字节,所以没关系,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() {
} 

写完一次&#34; Hello world!&#34;到第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个地址呢?

1 个答案:

答案 0 :(得分:1)

RAM和ROM的内存容量通常用表示,而不是字节,如您所示。

所以你所指的这个芯片有8×256 的EEPROM,你似乎期望比实际存在的内存多得多 - 你可以存储256个字节在那个筹码中。

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

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