EEPROM 读取到数据全是0xff 解决方法

在使用M24C64存储器芯片时遇到读取数据全为0xff的现象。通过检查SDK代码和I2C时序,发现24c64的地址是16bit,而非默认的8bit。修改I2C内存地址宽度参数为I2C_MEM_ADDR_WIDIH_16后,读写数据恢复正常。附上了正确的读写时序图。
摘要由CSDN通过智能技术生成

型号

M24C64-RMN6TP SOIC-8 存储器芯片 EEPROM

现象

读取到的数据全是0xff

测试方法

sdk 代码

  if((i2c_status = i2c_memory_write(&hi2cx, I2C_MEM_ADDR_WIDIH_16, I2Cx_ADDRESS, 0x10, tx_buf1, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK)
    {
      error_handler(i2c_status);
    }

    delay_ms(5);

    /* read data from memory device */
    if((i2c_status = i2c_memory_read(&hi2cx, I2C_MEM_ADDR_WIDIH_16, I2Cx_ADDRESS, 0x10, rx_buf1, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK)
    {
      error_handler(i2c_status);
    }

    /* write data to memory device */
    if((i2c_status = i2c_memory_write_int(&hi2cx, I2C_MEM_ADDR_WIDIH_8, I2Cx_ADDRESS, 0x00, tx_buf2, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK)
    {
      error_handler(i2c_status);
    }

问题分析

上示波器,通过I2C解码功能看数据

与24c02的时序完全对上。

但是我使用的是24c64,下面是它的写字节时序

 可以看到它的地址是16bit。

解决方法

将 I2C_MEM_ADDR_WIDIH_8 改为 I2C_MEM_ADDR_WIDIH_16

读写数据正常。

调试正常时序图

读时序

写时序

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用以下代码来读写32k数据到AT24C64的EEPROM: #include "stm32f2xx_hal.h" #include "i2c.h" #define EEPROM_ADDRESS 0xA0 void EEPROM_Write(uint16_t address, uint8_t* data, uint16_t size) { uint8_t buffer[32]; uint16_t i; for (i = 0; i < size; i += 32) { uint16_t chunk_size = size - i; if (chunk_size > 32) { chunk_size = 32; } buffer[0] = address >> 8; buffer[1] = address & 0xFF; memcpy(&buffer[2], &data[i], chunk_size); HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, buffer, chunk_size + 2, HAL_MAX_DELAY); HAL_Delay(10); address += chunk_size; } } void EEPROM_Read(uint16_t address, uint8_t* data, uint16_t size) { uint8_t buffer[2]; buffer[0] = address >> 8; buffer[1] = address & 0xFF; HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, buffer, 2, HAL_MAX_DELAY); HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDRESS, data, size, HAL_MAX_DELAY); } 在这个代码中,我们使用了STM32F2xx的HAL库来读写EEPROM。我们首先定义了EEPROM的地址,然后定义了两个函数:EEPROM_Write和EEPROM_Read。EEPROM_Write函数用于将数据写入EEPROM,而EEPROM_Read函数用于从EEPROM中读取数据。 在EEPROM_Write函数中,我们首先定义了一个32字节的缓冲区,然后使用循环来将数据写入EEPROM。在每次循环中,我们将要写入的数据复制到缓冲区中,并将地址信息添加到缓冲区的前两个字节中。然后,我们使用HAL_I2C_Master_Transmit函数将缓冲区中的数据发送到EEPROM中。最后,我们使用HAL_Delay函数来等待一段时间,以确保EEPROM有足够的时间来处理数据。 在EEPROM_Read函数中,我们首先发送要读取地址信息到EEPROM中,然后使用HAL_I2C_Master_Receive函数从EEPROM中读取数据。 这就是如何使用STM32F2xx的HAL库读写32k数据到AT24C64的EEPROM的方法
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值