2017-02-23 4 views
0

AT24C256 I2C EEPROM에 쓰거나 읽으려고 힘듭니다. 나는 STM32F0 발견 보드를 사용하여 EEPROM을 읽거나 쓰려고한다.I2C EEPROM + STM32F0 쓰기/읽기 오류

기본 구조는 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_OK를 반환하지 않는 이유를 이해하기 위해 기능 HAL_I2C_Mem_Write에 단계를해야한다. 특히, 정확히 무엇이 반환되는지 확인해야합니다. 그러면 도움이 될 것입니다. 코드를 보면 문제가 I2C 주소와 관련 있다고 확신합니다. AT24C256 데이터 시트, 그들은 I2C 어드레스가 있음을 말한다 :

1 0 1 0 0 A1 A2 R/

는 GND의 핀 A1과 A2를 연결된다고 가정 W의 I2C 어드레스 이다

1 0 1 0 0 0 0 R/W 헥사

의 I2C 어드레스 내지 0xA0이다.

#define ADDR_24LCxx 0xA0 

을 그리고 HAL 기능에 : 그래서, 다음과 같이 ADRESS 정의를 변경

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로 제한 시간을 증가 있습니다. 테스트를 위해 시간 초과 문제를 실제로 가지고 싶지는 않습니다 ...