从AT24CS32读取序列号

Reading Serial Number from AT24CS32

提问人:thebeekeeper 提问时间:11/13/2023 更新时间:11/13/2023 访问量:75

问:

我正在使用连接到AT24CS32的 Microchip dsPIC33EP 构建嵌入式系统。我正在尝试从 AT24 读取序列号但失败。我的电路板上有 SOT23 封装部件,因此 [A2:A0] 接地并且逻辑为 0。根据数据表的第 6.1 节,我应该使用设备地址来读取序列号。每当我在虚拟写入中使用此地址来设置 eeprom 地址时,我都会在代码和逻辑分析仪上得到一个 NACK。0x58

以下是序列号读取虚拟写入的数据表示例:enter image description here

下面是我尝试写入序列号读取地址的逻辑分析仪迹线:enter image description here

以下是设置主内存区域读取的相同代码编写:enter image description here

我可以用相同的代码成功地读取和写入主 eeprom 存储区 uisng 设备地址0x50。

为了尝试调试这一点,我还尝试将所需的序列号内存地址 (0x0800) 写入主设备类型标识符地址。虚拟写入成功,但我总是从读取的数据中接收。这对我来说是有道理的,因为0x0800在主 eeprom 数组的有效范围内。0xFF

作为参考,以下是我用于设置序列号的代码:

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;
}

我的问题是,当试图从这部分读取序列号时,有人能看到我做错了什么吗?我想我一定是误解了数据表的某些内容,但据我所知,我的逻辑分析仪迹线看起来与数据表示例相同。

C 嵌入式 I2C 微芯片

评论

0赞 the busybee 11/13/2023
到目前为止,除了 NAK 的事实之外,LA 跟踪看起来还不错。数据表在第 7.3 章中提到了确认轮询,您是否考虑到了这一点?您是否遵守了所有其他时序要求,是否使用了I²C硬件模块,或者是否咬牙切齿?
0赞 thebeekeeper 11/13/2023
我还没有完全实现 ACK 轮询,但我尝试添加手动延迟并在调试期间关闭所有其他 i2c 访问。将进一步研究时序要求,但由于主阵列读取和写入正在工作,我认为时序很好。我正在使用 PIC I2C 硬件模块。
1赞 the busybee 11/13/2023
编辑您的问题,并在那里为下一位访问者添加说明。我们不希望在评论中出现这种情况,这不是一个论坛。;-)
0赞 BitBank 11/14/2023
如果芯片的 EEPROM 侧工作正常,则无需调整 I2C 时序。可能是文档不正确或芯片故障。

答: 暂无答案