2016-10-22 7 views
2

나는 구조체 저장해야 I2C의 EEPROM에 구조체 :STM32F0 I2C HAL 저장

HAL_StatusTypeDef HAL_I2C_Mem_Write (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t * pData, uint16_t Size, uint32_t Timeout) 

당신이 나에게 올바른 방법을

를 제안 할 수 기능을 사용하여 외부의 I2C EEPROM에

struct { 
    uint16_t value; 
    uint16_t flag; 
} status; 

을 이것을하기 위해?

답변

2

모든 데이터 형식을 닫으면 간단한 바이트가 저장됩니다. 차이점은 바이트가 해석되는 방식입니다.

기본적으로 버퍼에 대한 포인터 및 전송할 바이트 수 (uint16_t Size)가 uint8_t* pData이어야합니다. 그래서 struct 포인터를 uint8_t*으로 캐스팅하고 sizeof()을 사용하여 크기를 가져옵니다.

여기 시뮬레이션 결과입니다. 가난한 테스트 환경 (intunsigned char 초)을 용서해주십시오.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    int value; 
    int flag; 
} status; 

int main(void) { 

    status stat; 
    stat.value = 15; 
    stat.flag = 1; 

    int size = sizeof(status);       // number of bytes to be sent 
    unsigned char* pData;         // (uint8_t*) unsigned char* pointer to data 

    unsigned char eeprom[size];       // simulated EEPROM 
    unsigned char pDataReceived[size];     // for read back from EEPROM test 
    status* read_back;         // for read back from EEPROM test 

    printf("%d %d\n", stat.value, stat.flag);    // verify data in original format 

    pData = (unsigned char*)(&stat);      // cast data pointer to (uint8_t*) unsigned char* 
    printf("%d %d\n", ((status*)pData)->value, ((status*)pData)->flag); // verify data after cast 

    memcpy(eeprom, pData, size);       // I2C write bytes simulation 
    printf("%d %d\n", ((status*)eeprom)->value, ((status*)eeprom)->flag); // verify data in simulated EEPROM 

    memcpy(pDataReceived, eeprom, size);     // I2C read bytes simulation 
    read_back = (status*)(pDataReceived);     // cast back to struct type 
    printf("%d %d\n", read_back->value, read_back->flag); // verify received data in original format 

    return 0; 
} 

쓰기 예 :

struct status stat; 
// operations on the struct 
uint8_t* addressOfStruct= (uint8_t*)(&stat); 
uint16_t sizeOfStruct = sizeof(status); 

HAL_StatusTypeDef HAL_I2C_Mem_Write (&hi2c, DevAddress, MemAddress, MemAddSize, addressOfStruct, sizeOfStruct, 100); 

읽기 예 :

struct status* read; 
uint16_t sizeOfBuffer = sizeof(status); 
uint8_t receiveBuffer[sizeOfBuffer]; 

HAL_StatusTypeDef HAL_I2C_Mem_Read (&hi2c, DevAddress, MemAddress, MemAddSize, receiveBuffer, sizeOfBuffer, 100); 

read = (status*)(receiveBuffer); // or copy or move the data 
+0

@danstm 당신이 일을 얻을 관리나요? –

+0

예! 고맙습니다. – danstm