我通过I2C操作24C08进行读写时,出现了往地址0x01写入数据,覆盖掉别的位置的情况。
比如我往0x01这个地址写一个数据,过一秒后读取别的位置的数据也是0x01。
一下是我的逻辑分析仪抓取到的图
首先我进行了读操作
然后我进行了写操作
然后我读取了另一个寄存器的值,发现被复写了。我做了尝试读取过别的,只要在写入后,所有的值都会被覆盖。
24C08 地址是 8 位的,你的读写时序好像都是按 16 位两字节的方式。
我刚才又看了 24C08 的手册,没看见 16 位的地址寻址方式。
AT24C0X 为 8bit address 存取
Page1:
0xA0 0x00 0x01 <stop> 0xA1
命令效果: Write [ ADDR 0x00 = DATA 0x01], 内部地址, 自动累增= 0x01
Page2
<re-start> 0xA1 0xAA <stop>
命令效果: READ DATA = 0xAA (ADDR:0x01) 内部地址, 自动累增= 0x02
Page3
0xA0 0x00 0x01 0xBB 内部地址, 自动累增 0x02
命令效果: Write [ADDR 0x00 = 0x01] , [ADDR 0x01 = 0xBB ]
Page4
<restart> 0xA0 0x00 0x0B <restart> 0xA1
命令效果: Write [ADDR 0x00 = 0x0B], 内部地址, 自动累增= 0x01
Page 5
<restart> 0xA1 0xBB <stop>
命令效果: Read [ADDR 0x01 , DATA = 0xBB ], 内部地址, 自动累增= 0x02
完全没毛病!
AT24C02 为 8bit address 存取 <<< 这应该是你的盲点
【以下回答由 GPT 生成】
根据问题描述和逻辑分析仪的数据,发现在进行写入操作后,所有其他位置的数据都被覆盖了。这可能是以下几个原因导致的:
为了确定导致问题的原因,需要进一步分析逻辑分析仪的数据和进行代码审查。请提供相关代码以供分析。
由于根据问题描述和逻辑分析仪的数据无法准确确定问题的原因,我建议尝试以下几个方案来解决问题:
首先,确保硬件连接正确无误。请检查以下几个方面:
如果硬件连接有误,会导致I2C通信出现问题,从而引发数据覆盖的情况。
检查软件中I2C的配置是否正确。请确认以下几个方面:
在写入数据后,通过检测ACK和NACK信号来判断写入操作是否成功。如果写入操作出现错误,可能会导致ACK信号为NACK,从而引发数据覆盖的情况。
以下是一个使用I2C库函数的示例代码,显示了如何使用ACK和NACK信号来判断写入是否成功:
// 初始化I2C模块
// ...
// 写入数据
uint8_t addr = 0x01;
uint8_t data = 0x55;
HAL_StatusTypeDef status;
status = HAL_I2C_Mem_Write(&hi2c1, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
if (status == HAL_OK) {
// 写入成功
} else if (status == HAL_ERROR) {
// 写入错误
} else if (status == HAL_TIMEOUT) {
// 写入超时
}
通过检测返回的状态,可以确定写入操作是否成功完成。
在进行写入操作后,尝试增加一个延迟,然后再进行其他位置的数据读取。这可以确保数据在写入完成后稳定下来后再进行读取,以避免错误读取到被覆盖的数据。以下是一个示例代码:
// 写入数据
// ...
// 增加一个延迟(具体时间根据实际情况调整)
HAL_Delay(1000);
// 读取其他位置的数据
uint8_t readAddr = 0x02;
uint8_t readData;
status = HAL_I2C_Mem_Read(&hi2c1, 0xA0, readAddr, I2C_MEMADD_SIZE_8BIT, &readData, 1, HAL_MAX_DELAY);
if (status == HAL_OK) {
// 读取成功
} else if (status == HAL_ERROR) {
// 读取错误
} else if (status == HAL_TIMEOUT) {
// 读取超时
}
增加延迟可以确保数据稳定性,避免错误读取。
请尝试以上方案并提供相关代码以供分析。如果问题仍然存在,请提供更多的信息以便进一步分析和解决问题。
【相关推荐】