0

我正在努力写入或读取 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;
    }

   }
4

1 回答 1

0

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

1 0 1 0 0 A1 A2 读/写

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

1 0 1 0 0 0 0 读/写

在十六进制中,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 毫秒。对于测试,你真的不想遇到超时问题......

于 2017-02-27T12:54:25.803 回答