写入/读取I2C EEPROM + STM32F0发现时出错

时间:2017-02-23 15:33:06

标签: hal eeprom stm32f0

我正在努力写入或读取AT24C256 I2C EEPROM。我正在使用STM32F0发现板来读/写EEPROM。

我使用HAL库和CUBEMX作为基本结构。我编写了一些小代码来测试读写函数。在调试时,Test的值始终为'2',如果它成功写入内存则应为'1'。这是: -

  #define ADDR_24LCxx_Write 0x50
  #define ADDR_24LCxx_Read 0x50
  #define BufferSize 5
  uint8_t WriteBuffer[BufferSize],ReadBuffer[BufferSize],Test;
  uint16_t i;

  I2C_HandleTypeDef hi2c1;

  int main(void)
  {

   HAL_Init();

   /* Configure the system clock */
   SystemClock_Config();

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_I2C1_Init();

   for(i=0; i<5; i++)
    {
            WriteBuffer[i]=i; 
    }

    if(HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT,WriteBuffer,BufferSize, 0x10) == HAL_OK)
    {
            Test = 1;
    }

    else
    {
            Test = 2;
    }

    HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize, 0x10);

    if(memcmp(WriteBuffer,ReadBuffer,BufferSize) == 0 ) /* check date */
    {
            Test = 3;
    }

    else
    {
            Test = 4;
    }

   }

1 个答案:

答案 0 :(得分:0)

您应该单步执行函数HAL_I2C_Mem_Write以了解它为什么不返回HAL_OK。更具体地说,你应该检查它究竟返回什么,它会对你有所帮助。 看看你的代码,我相信问题在于I2C地址。在AT24C256数据表中,他们说I2C地址是:

  

1 0 1 0 0 A1 A2 R / W

假设您将引脚A1和A2连接到GND,则I2C地址为:

  

1 0 1 0 0 0 0 R / W

十六进制,I2C地址为0xA0。因此,请按以下方式更改地址定义:

 #define ADDR_24LCxx 0xA0

在HAL功能中:

HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx, 0, I2C_MEMADD_SIZE_8BIT,WriteBuffer,BufferSize, 100)
HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize, 100)

请注意我也将超时时间增加到100毫秒。对于测试,你真的不想有超时问题......