c++ - 可以读/写EEPROM地址但是只能读/写第一个内存页

标签 c++ memory avr eeprom

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


我找到了 Atmel 24C02n一 block 备用板上的 2kb EEPROM,想试一试,看看这个芯片里面有什么样的数据,我是否可以重新使用它。从来没有读过/写过外部存储器。接线很简单 (i2c) 并且工作得很好。

运行 i2cScanner,它在总线上发现了 8 个地址,0x50 .. 0x57。第一个想法:“奇怪,一个设备有 8 个地址。”文档描述有 8x256 字节,好吧,8 个地址用于 8 个 256 字节的页面。

但是,当我想访问另一个页面时,例如 0x51,我得到了相同的数据,而且它似乎写入了相同的内存页面。我在这里错过了什么吗?


这是我使用 wire 库的示例代码:

#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 bits 的 EEPROM,你似乎期望比实际存在的内存多得多 - 你可以存储 256 字节在那个芯片里。

低容量芯片显然使用与高容量芯片相同的地址解码机制,因此当您一遍又一遍地读取相同的字节时,您似乎看到的是一个简单的地址环绕(参见数据表第 10 页关于“翻转”)。

关于您的“对多个 I2C 地址的回答”——您是如何连接 A0、A1、A2 线的?它们需要硬连线才能创 build 备地址。

关于c++ - 可以读/写EEPROM地址但是只能读/写第一个内存页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47823243/

相关文章:

c++ - 用于在非标准项目结构的 header 和实现之间切换的 emacs 函数

c# - C# IL 在调用 C++ DLL 时如何通过 Ref 取回参数

java - 如何判断堆转储中字符串与 char[] 的比率是否表明存在问题?

c - 这是与按钮/操纵杆交互的正确方式吗?

USB编程

c++ - arma::vector 与 std::vector 混淆

c++ - 在输出文件中按类 wfstream 写入波斯语 ( farsi )

c++ - 求解具有大矩阵的稀疏线性系统时的写访问冲突

c - 段错误 11,尽管分配了足够的内存

networking - 嵌入式 IP 堆栈 : is it okay/accepted to have asynchronous sending?