// Call eep_write_buffer function static void save_joy_data (void) { sys_cfg.prop_valid = prop_valid; eep_write_buffer((uint8_t *)&sys_cfg.prop_valid, offsetof(sys_cfg_t, prop_valid), sizeof(sys_cfg.prop_valid)); sys_cfg.prop_valid_inv = ~sys_cfg.prop_valid; eep_write_buffer((uint8_t *)&sys_cfg.prop_valid_inv, offsetof(sys_cfg_t, prop_valid_inv), sizeof(sys_cfg.prop_valid_inv)); uint8_t *src_ptr, chksum; for (uint8_t i = 0; i < ADC_LENGTH; i++) { src_ptr = (uint8_t *)&sys_cfg.joy_cal[i]; chksum = 0; for (uint8_t j = 0; j < (sizeof(joy_cal_t) - 1); j++) { chksum += *src_ptr++; } sys_cfg.joy_cal[i].chksum = ~chksum + 1; eep_write_buffer((uint8_t *)&sys_cfg.joy_cal[i], offsetof(sys_cfg_t, joy_cal) + (sizeof(joy_cal_t) * i), sizeof(joy_cal_t)); } } // Call eep_i2c_write_page function HAL_StatusTypeDef eep_write_buffer (uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite) { uint16_t dataNum; dataNum = EEPROM_PAGESIZE - (WriteAddr % EEPROM_PAGESIZE); if (dataNum > NumByteToWrite) { dataNum = NumByteToWrite; } eep_i2c_write_page(pBuffer, WriteAddr, dataNum); WriteAddr += dataNum; pBuffer += dataNum; NumByteToWrite -= dataNum; while (NumByteToWrite) { dataNum = EEPROM_PAGESIZE; if (NumByteToWrite < EEPROM_PAGESIZE) { dataNum = NumByteToWrite; } eep_i2c_write_page(pBuffer, WriteAddr, dataNum); WriteAddr += EEPROM_PAGESIZE; pBuffer += EEPROM_PAGESIZE; NumByteToWrite -= dataNum; } return HAL_OK; } // Call HAL_I2C_Mem_Write function static HAL_StatusTypeDef eep_i2c_write_page (uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite) { uint32_t timeout; if (HAL_I2C_Mem_Write(&EEP_HANDLE, (uint16_t)EEPROM_ADDRESS | ((WriteAddr >> 7) & 0x0E), WriteAddr & 0x00FF, I2C_MEMADD_SIZE_8BIT, pBuffer, NumByteToWrite, I2Cx_TIMEOUT_MAX) != HAL_OK) { eep_error_callback(); return HAL_ERROR; } // Check if the EEPROM is ready for a new operation timeout = I2Cx_TIMEOUT_MAX; while (HAL_I2C_IsDeviceReady(&EEP_HANDLE, EEPROM_ADDRESS, EEPROM_MAX_TRIALS, I2Cx_TIMEOUT_MAX) == HAL_TIMEOUT) { if ((timeout--) == 0) { eep_error_callback(); return HAL_ERROR; } } // Wait for the end of the transfer timeout = I2Cx_TIMEOUT_MAX; while (HAL_I2C_GetState(&EEP_HANDLE) != HAL_I2C_STATE_READY) { if ((timeout--) == 0) { eep_error_callback(); return HAL_ERROR; } } return HAL_OK; }