edit: 我对位和字节,文档指定位,而不是字节,而不是字节读取littes。这解释了我的错误。为什么制造商使用位代替字节来指定容量?有点令人困惑。; - )
我在备用板上找到了ATMEL 24C02N 2KB EEPROM,并想尝试一下该芯片中有什么样的数据,以及是否可以重复使用。从未完成阅读/编写外部记忆。接线很容易(I2C),而且效果很好。
运行I2CSCANNER,并在总线上找到了8个地址,0x50 .. 0x57。首先想到:"奇怪的是,一个设备的8个地址。"该文档描述了有8x256字节,所以好的,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() {
}
一旦写出" 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的内存容量通常在 bits 中表达,而不是您似乎假设的 bytes 。
因此,您指的是Eeprom的8 x 256 位,您似乎期望的记忆比实际上更多 - 您可以存储256 bytes 在那个芯片中。
低容量的芯片显然使用相同的地址解码机制,而不是容量较高的芯片,因此,您似乎看到的是一个简单的地址包裹,而您一遍又一遍地阅读相同的字节(请参阅"滚动"的数据表的第10页。
关于您的"对一个以上I2C地址的答案" - 您是如何连接A0,A1,A2行的?他们需要用力界线才能创建设备的地址。