I2C Eeprom 可以有两个地址吗?
Can an I2C Eeprom have two addresses?
我拥有一个 EEPROM module with the P24C256 芯片。 (不是 AT24C256)。
扫描可用的 I2C 设备后,我收到了两个设备的响应。
Scanning...
I2C device found at address 0x50 !
I2C device found at address 0x58 !
done
我查看了数据表,但找不到任何其他信息。
我以为该设备有两个存储库,但事实并非如此。
这怎么可能?断开模块后,报无I2C设备
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
可能是EEPROM地址位的问题,如果是浮动状态,没有接好,请您检查一下这些地址位的连接情况好吗?尝试将它们连接到与您的微控制器相同的地面,但是,是的,如上所述,非常需要原理图。
是的,他们可以。
根据 i2C EEPROM 的大小和内存块的组织方式,您可以有 2 个或更多设备地址。例如,ST24/25x04 EEPROM 是 4 Kbit 电可擦除可编程存储器,组织为 2 个 256 x8 位块。这意味着 I2C 为您提供了两个设备地址(上面内存中的 0x50 和 0x51),它们将访问具有 1 个字节地址的每个块。
该行为并不暗示。数据表说地址应该只有一个(但可以选择它的三个低位)。
电路板的原理图显示拨码开关仅选择了两位(A0、A1),A2 接地。
我在代码中看到没有初始化。 TWI 总线的工作频率是多少?此外,在模块的图片中,它具有未焊接的上拉电阻的跳线,即使焊接了跳线,它也具有 10kOhm 的上拉电阻 - 这可能太高了。
可能你的问题只是因为线没有足够快地返回到高电平。
- 检查上拉电阻是否接合(跳线焊接在板上)
- 尝试在 SCL、SDA 上添加额外的上拉电阻(约 4.7k)
- 尝试设置较低的频率,例如
Wire.setClock(50000);
我拥有一个 EEPROM module with the P24C256 芯片。 (不是 AT24C256)。
扫描可用的 I2C 设备后,我收到了两个设备的响应。
Scanning...
I2C device found at address 0x50 !
I2C device found at address 0x58 !
done
我查看了数据表,但找不到任何其他信息。 我以为该设备有两个存储库,但事实并非如此。
这怎么可能?断开模块后,报无I2C设备
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
可能是EEPROM地址位的问题,如果是浮动状态,没有接好,请您检查一下这些地址位的连接情况好吗?尝试将它们连接到与您的微控制器相同的地面,但是,是的,如上所述,非常需要原理图。
是的,他们可以。
根据 i2C EEPROM 的大小和内存块的组织方式,您可以有 2 个或更多设备地址。例如,ST24/25x04 EEPROM 是 4 Kbit 电可擦除可编程存储器,组织为 2 个 256 x8 位块。这意味着 I2C 为您提供了两个设备地址(上面内存中的 0x50 和 0x51),它们将访问具有 1 个字节地址的每个块。
该行为并不暗示。数据表说地址应该只有一个(但可以选择它的三个低位)。
电路板的原理图显示拨码开关仅选择了两位(A0、A1),A2 接地。
我在代码中看到没有初始化。 TWI 总线的工作频率是多少?此外,在模块的图片中,它具有未焊接的上拉电阻的跳线,即使焊接了跳线,它也具有 10kOhm 的上拉电阻 - 这可能太高了。
可能你的问题只是因为线没有足够快地返回到高电平。
- 检查上拉电阻是否接合(跳线焊接在板上)
- 尝试在 SCL、SDA 上添加额外的上拉电阻(约 4.7k)
- 尝试设置较低的频率,例如
Wire.setClock(50000);