我通过I2C操作24C08进行读写时,出现了往地址0x01写入数据,覆盖掉别的位置的情况。

我通过I2C操作24C08进行读写时,出现了往地址0x01写入数据,覆盖掉别的位置的情况。
比如我往0x01这个地址写一个数据,过一秒后读取别的位置的数据也是0x01。

一下是我的逻辑分析仪抓取到的图
首先我进行了读操作

img

img

然后我进行了写操作

img

然后我读取了另一个寄存器的值,发现被复写了。我做了尝试读取过别的,只要在写入后,所有的值都会被覆盖。

img

img

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 生成】

问题分析

根据问题描述和逻辑分析仪的数据,发现在进行写入操作后,所有其他位置的数据都被覆盖了。这可能是以下几个原因导致的:

  1. 写入操作没有成功完成,导致出现数据覆盖的情况。
  2. 写入操作导致I2C总线出现错误,从而影响了其他位置的数据读取。

为了确定导致问题的原因,需要进一步分析逻辑分析仪的数据和进行代码审查。请提供相关代码以供分析。

解决方案

由于根据问题描述和逻辑分析仪的数据无法准确确定问题的原因,我建议尝试以下几个方案来解决问题:

1. 仔细检查硬件连接

首先,确保硬件连接正确无误。请检查以下几个方面:

  • 确保I2C总线的引脚连接正确。
  • 确保24C08芯片的供电和地线连接正常。
  • 确保I2C总线的上拉电阻已经正确连接。

如果硬件连接有误,会导致I2C通信出现问题,从而引发数据覆盖的情况。

2. 检查软件配置

检查软件中I2C的配置是否正确。请确认以下几个方面:

  • 确保I2C的时钟频率配置正确。不同的芯片可能对时钟频率有不同的要求。
  • 确保I2C的地址模式配置正确。24C08芯片有可能使用7位或8位地址模式,确认你的配置与芯片的要求一致。
  • 确保I2C的数据传输模式配置正确。24C08芯片支持字节和页写操作,确认你的配置与芯片的要求一致。

3. 使用ACK和NACK信号判断写入是否成功

在写入数据后,通过检测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) {
    // 写入超时
}

通过检测返回的状态,可以确定写入操作是否成功完成。

4. 增加读取操作后的延迟

在进行写入操作后,尝试增加一个延迟,然后再进行其他位置的数据读取。这可以确保数据在写入完成后稳定下来后再进行读取,以避免错误读取到被覆盖的数据。以下是一个示例代码:

// 写入数据
// ...

// 增加一个延迟(具体时间根据实际情况调整)
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) {
    // 读取超时
}

增加延迟可以确保数据稳定性,避免错误读取。

请尝试以上方案并提供相关代码以供分析。如果问题仍然存在,请提供更多的信息以便进一步分析和解决问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^