2017-02-23 123 views
0

我正在努力写入或读取AT24C256 I2C EEPROM。我正在使用STM32F0发现板读/写EEPROM。在写入/读取到I2C EEPROM + STM32F0时发生错误Discovery

我使用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; 
    } 

    } 

回答

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。因此,如下更改ADRESS定义:

#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) 

请注意,我还增加了超时为100ms。对于测试,你并不是真的想要超时问题....