从 AT24CS32 读取序列号

问题描述 投票:0回答:1

我正在使用连接到 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;
}

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

c embedded i2c microchip
1个回答
0
投票

你把这个排序了吗? 我有同样的问题。 我认为根本原因是序列号位于设备的安全寄存器区域,要访问该区域,您必须使用不同的设备 ID。这是书中描述它的部分 - 10.2 安全寄存器中的读操作- 安全寄存器的随机读取和顺序读取操作要求将设备类型设置为“1011b”(Bh),并将硬件客户端地址位(A2、A1、A0)与其相应的设备地址相匹配 输入引脚。

不幸的是,它没有给出示例。

© www.soinside.com 2019 - 2024. All rights reserved.