我正在使用连接到 AT24CS32 的 Microchip dsPIC33EP 构建嵌入式系统。我正在尝试读取 AT24 的序列号,但失败了。我的主板上有 SOT23 封装部分,因此 [A2:A0] 接地并且逻辑为 0。根据数据表的第 6.1 节,我应该使用设备地址
0x58
来读取序列号。每当我在虚拟写入中使用此地址来设置 eeprom 地址时,我都会在代码和逻辑分析仪上收到 NACK。
我可以使用相同的代码成功地读取和写入主eeprom内存区域,使用设备地址0x50。
为了尝试调试此问题,我还尝试将所需的序列号内存地址(0x0800)写入主设备类型标识符地址。虚拟写入成功,但我总是从数据读取中收到
0xFF
。这对我来说很有意义,因为 0x0800 在主 eeprom 数组的有效范围内。
作为参考,这是我用来设置读取序列号的代码:
I2C1_MESSAGE_STATUS status;
// Serial number 7-bit device type identifier: 0b1011xxx
uint8_t ser_addr = 0x58;
// Word address specified in table 6-2
uint8_t addr_buf[2] = {0x08, 0x00};
I2C1_MasterWrite(addr_buf, 2, ser_addr, &status);
while (status == I2C1_MESSAGE_PENDING) {
__delay32(9000);
}
// Only ever see I2C1_DATA_NO_ACK here, never see the address word make it to the wire
if(status != I2C1_MESSAGE_COMPLETE) {
return false;
}
我的问题是,当尝试从这部分读取序列号时,有人能看到我做错了什么吗?我想我一定是误解了数据表的某些内容,但据我所知,我的逻辑分析仪跟踪看起来与数据表示例相同。
你把这个排序了吗? 我有同样的问题。 我认为根本原因是序列号位于设备的安全寄存器区域,要访问该区域,您必须使用不同的设备 ID。这是书中描述它的部分 - 10.2 安全寄存器中的读操作- 安全寄存器的随机读取和顺序读取操作要求将设备类型设置为“1011b”(Bh),并将硬件客户端地址位(A2、A1、A0)与其相应的设备地址相匹配 输入引脚。
不幸的是,它没有给出示例。