#include "E22.h" #include #define E22_AUX_TIMEOUT_MS 5000U static UART_HandleTypeDef *e22_uart; uint8_t E22_WaitAux(uint32_t timeout_ms) { uint32_t tick_start = HAL_GetTick(); while (HAL_GPIO_ReadPin(E22_AUX_GPIO_Port, E22_AUX_Pin) == GPIO_PIN_RESET) { if ((HAL_GetTick() - tick_start) >= timeout_ms) { return 0; } } return 1; } HAL_StatusTypeDef E22_Init(UART_HandleTypeDef *huart) { e22_uart = huart; HAL_GPIO_WritePin(E22_M0_GPIO_Port, E22_M0_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(E22_M1_GPIO_Port, E22_M1_Pin, GPIO_PIN_RESET); if (E22_WaitAux(E22_AUX_TIMEOUT_MS) == 0U) { return HAL_TIMEOUT; } return HAL_OK; } HAL_StatusTypeDef E22_ReadConfiguration(uint8_t config[9]) { static const uint8_t command[3] = {0xC1U, 0x00U, 0x09U}; uint8_t response[12] = {0U}; HAL_StatusTypeDef status; if ((e22_uart == 0) || (config == 0)) { return HAL_ERROR; } HAL_GPIO_WritePin(E22_M0_GPIO_Port, E22_M0_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(E22_M1_GPIO_Port, E22_M1_Pin, GPIO_PIN_SET); HAL_Delay(50U); if (E22_WaitAux(E22_AUX_TIMEOUT_MS) == 0U) { status = HAL_TIMEOUT; goto restore_normal_mode; } __HAL_UART_CLEAR_OREFLAG(e22_uart); __HAL_UART_FLUSH_DRREGISTER(e22_uart); status = HAL_UART_Transmit(e22_uart, (uint8_t *)command, sizeof(command), 500U); if (status != HAL_OK) { goto restore_normal_mode; } status = HAL_UART_Receive(e22_uart, response, sizeof(response), 1500U); if (status != HAL_OK) { goto restore_normal_mode; } if ((response[0] != 0xC1U) || (response[1] != 0x00U) || (response[2] != 0x09U)) { status = HAL_ERROR; goto restore_normal_mode; } memcpy(config, &response[3], 9U); restore_normal_mode: HAL_GPIO_WritePin(E22_M0_GPIO_Port, E22_M0_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(E22_M1_GPIO_Port, E22_M1_Pin, GPIO_PIN_RESET); HAL_Delay(50U); (void)E22_WaitAux(E22_AUX_TIMEOUT_MS); return status; } HAL_StatusTypeDef E22_Send(uint8_t *data, uint16_t len) { if (e22_uart == 0) { return HAL_ERROR; } if (E22_WaitAux(E22_AUX_TIMEOUT_MS) == 0U) { return HAL_TIMEOUT; } HAL_StatusTypeDef status = HAL_UART_Transmit(e22_uart, data, len, 1000); if (status != HAL_OK) { return status; } if (E22_WaitAux(E22_AUX_TIMEOUT_MS) == 0U) { return HAL_TIMEOUT; } return HAL_OK; } HAL_StatusTypeDef E22_Receive(uint8_t *data, uint16_t len, uint32_t timeout_ms) { if (e22_uart == 0) { return HAL_ERROR; } return HAL_UART_Receive(e22_uart, data, len, timeout_ms); }