diff --git a/Core/Inc/TMP144.h b/Core/Inc/TMP144.h index f7ac363..2ce2c39 100644 --- a/Core/Inc/TMP144.h +++ b/Core/Inc/TMP144.h @@ -11,18 +11,22 @@ #include "common_defs.h" #include "stm32f4xx_hal.h" +#include "stm32f4xx_hal_def.h" #include "stm32f4xx_hal_uart.h" -#define N_SENSORS 32 +#define N_TEMP_SENSORS 32 +#define TMP144_RESPONSE_TIMEOUT 100 /* ms */ -extern volatile uint16_t temperatures[N_SENSORS]; -extern volatile uint16_t max_temp; +extern volatile uint16_t temperatures[N_TEMP_SENSORS]; +extern volatile uint16_t min_temperature; +extern volatile uint16_t max_temperature; typedef enum { TMP144_IDLE, TMP144_RESETTING, TMP144_INITIALIZING, - TMP144_READING_TEMP + TMP144_READING_TEMP, + TMP144_ERROR } TMP144State; typedef struct { @@ -32,11 +36,18 @@ typedef struct { uint8_t rxbuf[34]; size_t n_sensors; + + uint32_t expected_response_time; } TMP144Bus; +extern volatile TMP144Bus tmp144_bus_busbar; +extern volatile TMP144Bus tmp144_bus_other; + HAL_StatusTypeDef tmp144_init(UART_HandleTypeDef* busbar_side, UART_HandleTypeDef* other_side); +HAL_StatusTypeDef tmp144_check_timeouts(); + HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus); HAL_StatusTypeDef tmp144_init_post_reset(TMP144Bus* bus); HAL_StatusTypeDef tmp144_init_post_addr(TMP144Bus* bus); diff --git a/Core/Src/TMP144.c b/Core/Src/TMP144.c index 57141b5..e6723ed 100644 --- a/Core/Src/TMP144.c +++ b/Core/Src/TMP144.c @@ -7,6 +7,10 @@ #include "TMP144.h" +#include "stm32f4xx_hal.h" +#include "stm32f4xx_hal_def.h" +#include "stm32f4xx_hal_uart.h" + #include #include @@ -14,11 +18,12 @@ static const uint8_t TMP144_SEQ_RESET[] = {0x55, 0xB4}; static const uint8_t TMP144_SEQ_ADDR[] = {0x55, 0x8C, 0x90}; static const uint8_t TMP144_SEQ_READ_TEMPS[] = {0x55, 0xF1}; -volatile uint16_t temperatures[N_SENSORS]; -volatile uint16_t max_temp; +volatile uint16_t temperatures[N_TEMP_SENSORS]; +volatile uint16_t min_temperature; +volatile uint16_t max_temperature; -static volatile TMP144Bus bus_busbar; -static volatile TMP144Bus bus_other; +volatile TMP144Bus tmp144_bus_busbar; +volatile TMP144Bus tmp144_bus_other; #define CHECK_STATUS(s) \ { \ @@ -29,22 +34,35 @@ static volatile TMP144Bus bus_other; HAL_StatusTypeDef tmp144_init(UART_HandleTypeDef* busbar_side, UART_HandleTypeDef* other_side) { - bus_busbar.handle = busbar_side; - bus_other.handle = other_side; + tmp144_bus_busbar.handle = busbar_side; + tmp144_bus_other.handle = other_side; - bus_busbar.state = TMP144_IDLE; - bus_other.state = TMP144_IDLE; + tmp144_bus_busbar.state = TMP144_IDLE; + tmp144_bus_other.state = TMP144_IDLE; // TODO: Configure this in EEPROM - bus_busbar.n_sensors = 16; - bus_other.n_sensors = 16; + tmp144_bus_busbar.n_sensors = N_TEMP_SENSORS / 2; + tmp144_bus_other.n_sensors = N_TEMP_SENSORS / 2; - CHECK_STATUS(tmp144_init_reset(&bus_busbar)); - CHECK_STATUS(tmp144_init_reset(&bus_other)); + CHECK_STATUS(tmp144_init_reset(&tmp144_bus_busbar)); + CHECK_STATUS(tmp144_init_reset(&tmp144_bus_other)); return HAL_OK; } +HAL_StatusTypeDef tmp144_check_timeouts() { + uint32_t now = HAL_GetTick(); + uint32_t t1 = tmp144_bus_busbar.expected_response_time; + uint32_t t2 = tmp144_bus_other.expected_response_time; + if (t1 != 0 && t1 < now) { + tmp144_bus_busbar.state = TMP144_ERROR; + } + if (t2 != 0 && t2 < now) { + tmp144_bus_other.state = TMP144_ERROR; + } + return HAL_OK; +} + HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus) { if (bus->state != TMP144_IDLE) { return HAL_ERROR; @@ -55,17 +73,19 @@ HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus) { // Keep sending Global Software Reset until it echoes back (as per 7.5.2) int tries = 0; do { - if (tries > 10) { + if (tries > bus->n_sensors) { + bus->state = TMP144_ERROR; return HAL_TIMEOUT; } CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_RESET, sizeof(TMP144_SEQ_RESET), 100)); - HAL_Delay(100); + HAL_Delay(50); tries++; } while (bus->state == TMP144_RESETTING); bus->state = TMP144_INITIALIZING; CHECK_STATUS(HAL_UART_Receive_IT(bus->handle, bus->rxbuf, 3)); + bus->expected_response_time = HAL_GetTick() + 100; CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_ADDR, sizeof(TMP144_SEQ_ADDR), 100)); @@ -92,6 +112,7 @@ HAL_StatusTypeDef tmp144_init_post_addr(TMP144Bus* bus) { uint8_t n_sensors = bus->rxbuf[idx_response] - TMP144_SEQ_ADDR[idx_response]; if (n_sensors != bus->n_sensors) { + bus->state = TMP144_ERROR; return HAL_ERROR; } bus->state = TMP144_IDLE; @@ -100,8 +121,8 @@ HAL_StatusTypeDef tmp144_init_post_addr(TMP144Bus* bus) { } HAL_StatusTypeDef tmp144_read_temps() { - CHECK_STATUS(tmp144_send_read_temps(&bus_busbar)); - CHECK_STATUS(tmp144_send_read_temps(&bus_other)); + CHECK_STATUS(tmp144_send_read_temps(&tmp144_bus_busbar)); + CHECK_STATUS(tmp144_send_read_temps(&tmp144_bus_other)); return HAL_OK; } @@ -112,11 +133,10 @@ HAL_StatusTypeDef tmp144_send_read_temps(TMP144Bus* bus) { } bus->state = TMP144_READING_TEMP; - // HAL_UART_Receive_IT(bus->handle, bus->rxbuf, - // sizeof(TMP144_SEQ_READ_TEMPS) + 2 * bus->n_sensors); CHECK_STATUS( HAL_UART_Receive_IT(bus->handle, bus->rxbuf, sizeof(TMP144_SEQ_READ_TEMPS) + 2 * bus->n_sensors)); + bus->expected_response_time = HAL_GetTick() + TMP144_RESPONSE_TIMEOUT; CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_READ_TEMPS, sizeof(TMP144_SEQ_READ_TEMPS), 100)); @@ -134,7 +154,8 @@ HAL_StatusTypeDef tmp144_recv_temps(TMP144Bus* bus) { return HAL_ERROR; } - size_t temperatures_offset = (bus == &bus_busbar) ? 0 : N_SENSORS / 2; + size_t temperatures_offset = + (bus == &tmp144_bus_busbar) ? 0 : N_TEMP_SENSORS / 2; for (size_t i = 0; i < bus->n_sensors; i++) { size_t buf_offset = headerlen + 2 * i; uint16_t temp = @@ -143,27 +164,34 @@ HAL_StatusTypeDef tmp144_recv_temps(TMP144Bus* bus) { } uint16_t max = temperatures[0]; - for (size_t i = 1; i < N_SENSORS; i++) { + uint16_t min = temperatures[0]; + for (size_t i = 1; i < N_TEMP_SENSORS; i++) { if (temperatures[i] > max) { max = temperatures[i]; } + if (temperatures[i] < min) { + min = temperatures[i]; + } } - max_temp = max; + max_temperature = max; + min_temperature = min; return HAL_OK; } void tmp144_handle_rx_cplt(UART_HandleTypeDef* handle) { TMP144Bus* bus; - if (handle == bus_busbar.handle) { - bus = &bus_busbar; - } else if (handle == bus_other.handle) { - bus = &bus_other; + if (handle == tmp144_bus_busbar.handle) { + bus = &tmp144_bus_busbar; + } else if (handle == tmp144_bus_other.handle) { + bus = &tmp144_bus_other; } else { // TODO Error_Handler(); } + bus->expected_response_time = 0; + switch (bus->state) { case TMP144_IDLE: // TODO