Implement TMP144 timeout
This commit is contained in:
parent
ec1383960b
commit
c8d6894e4b
@ -11,18 +11,22 @@
|
|||||||
#include "common_defs.h"
|
#include "common_defs.h"
|
||||||
|
|
||||||
#include "stm32f4xx_hal.h"
|
#include "stm32f4xx_hal.h"
|
||||||
|
#include "stm32f4xx_hal_def.h"
|
||||||
#include "stm32f4xx_hal_uart.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 temperatures[N_TEMP_SENSORS];
|
||||||
extern volatile uint16_t max_temp;
|
extern volatile uint16_t min_temperature;
|
||||||
|
extern volatile uint16_t max_temperature;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TMP144_IDLE,
|
TMP144_IDLE,
|
||||||
TMP144_RESETTING,
|
TMP144_RESETTING,
|
||||||
TMP144_INITIALIZING,
|
TMP144_INITIALIZING,
|
||||||
TMP144_READING_TEMP
|
TMP144_READING_TEMP,
|
||||||
|
TMP144_ERROR
|
||||||
} TMP144State;
|
} TMP144State;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -32,11 +36,18 @@ typedef struct {
|
|||||||
uint8_t rxbuf[34];
|
uint8_t rxbuf[34];
|
||||||
|
|
||||||
size_t n_sensors;
|
size_t n_sensors;
|
||||||
|
|
||||||
|
uint32_t expected_response_time;
|
||||||
} TMP144Bus;
|
} TMP144Bus;
|
||||||
|
|
||||||
|
extern volatile TMP144Bus tmp144_bus_busbar;
|
||||||
|
extern volatile TMP144Bus tmp144_bus_other;
|
||||||
|
|
||||||
HAL_StatusTypeDef tmp144_init(UART_HandleTypeDef* busbar_side,
|
HAL_StatusTypeDef tmp144_init(UART_HandleTypeDef* busbar_side,
|
||||||
UART_HandleTypeDef* other_side);
|
UART_HandleTypeDef* other_side);
|
||||||
|
|
||||||
|
HAL_StatusTypeDef tmp144_check_timeouts();
|
||||||
|
|
||||||
HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus);
|
HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus);
|
||||||
HAL_StatusTypeDef tmp144_init_post_reset(TMP144Bus* bus);
|
HAL_StatusTypeDef tmp144_init_post_reset(TMP144Bus* bus);
|
||||||
HAL_StatusTypeDef tmp144_init_post_addr(TMP144Bus* bus);
|
HAL_StatusTypeDef tmp144_init_post_addr(TMP144Bus* bus);
|
||||||
|
@ -7,6 +7,10 @@
|
|||||||
|
|
||||||
#include "TMP144.h"
|
#include "TMP144.h"
|
||||||
|
|
||||||
|
#include "stm32f4xx_hal.h"
|
||||||
|
#include "stm32f4xx_hal_def.h"
|
||||||
|
#include "stm32f4xx_hal_uart.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -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_ADDR[] = {0x55, 0x8C, 0x90};
|
||||||
static const uint8_t TMP144_SEQ_READ_TEMPS[] = {0x55, 0xF1};
|
static const uint8_t TMP144_SEQ_READ_TEMPS[] = {0x55, 0xF1};
|
||||||
|
|
||||||
volatile uint16_t temperatures[N_SENSORS];
|
volatile uint16_t temperatures[N_TEMP_SENSORS];
|
||||||
volatile uint16_t max_temp;
|
volatile uint16_t min_temperature;
|
||||||
|
volatile uint16_t max_temperature;
|
||||||
|
|
||||||
static volatile TMP144Bus bus_busbar;
|
volatile TMP144Bus tmp144_bus_busbar;
|
||||||
static volatile TMP144Bus bus_other;
|
volatile TMP144Bus tmp144_bus_other;
|
||||||
|
|
||||||
#define CHECK_STATUS(s) \
|
#define CHECK_STATUS(s) \
|
||||||
{ \
|
{ \
|
||||||
@ -29,22 +34,35 @@ static volatile TMP144Bus bus_other;
|
|||||||
|
|
||||||
HAL_StatusTypeDef tmp144_init(UART_HandleTypeDef* busbar_side,
|
HAL_StatusTypeDef tmp144_init(UART_HandleTypeDef* busbar_side,
|
||||||
UART_HandleTypeDef* other_side) {
|
UART_HandleTypeDef* other_side) {
|
||||||
bus_busbar.handle = busbar_side;
|
tmp144_bus_busbar.handle = busbar_side;
|
||||||
bus_other.handle = other_side;
|
tmp144_bus_other.handle = other_side;
|
||||||
|
|
||||||
bus_busbar.state = TMP144_IDLE;
|
tmp144_bus_busbar.state = TMP144_IDLE;
|
||||||
bus_other.state = TMP144_IDLE;
|
tmp144_bus_other.state = TMP144_IDLE;
|
||||||
|
|
||||||
// TODO: Configure this in EEPROM
|
// TODO: Configure this in EEPROM
|
||||||
bus_busbar.n_sensors = 16;
|
tmp144_bus_busbar.n_sensors = N_TEMP_SENSORS / 2;
|
||||||
bus_other.n_sensors = 16;
|
tmp144_bus_other.n_sensors = N_TEMP_SENSORS / 2;
|
||||||
|
|
||||||
CHECK_STATUS(tmp144_init_reset(&bus_busbar));
|
CHECK_STATUS(tmp144_init_reset(&tmp144_bus_busbar));
|
||||||
CHECK_STATUS(tmp144_init_reset(&bus_other));
|
CHECK_STATUS(tmp144_init_reset(&tmp144_bus_other));
|
||||||
|
|
||||||
return HAL_OK;
|
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) {
|
HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus) {
|
||||||
if (bus->state != TMP144_IDLE) {
|
if (bus->state != TMP144_IDLE) {
|
||||||
return HAL_ERROR;
|
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)
|
// Keep sending Global Software Reset until it echoes back (as per 7.5.2)
|
||||||
int tries = 0;
|
int tries = 0;
|
||||||
do {
|
do {
|
||||||
if (tries > 10) {
|
if (tries > bus->n_sensors) {
|
||||||
|
bus->state = TMP144_ERROR;
|
||||||
return HAL_TIMEOUT;
|
return HAL_TIMEOUT;
|
||||||
}
|
}
|
||||||
CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_RESET,
|
CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_RESET,
|
||||||
sizeof(TMP144_SEQ_RESET), 100));
|
sizeof(TMP144_SEQ_RESET), 100));
|
||||||
HAL_Delay(100);
|
HAL_Delay(50);
|
||||||
tries++;
|
tries++;
|
||||||
} while (bus->state == TMP144_RESETTING);
|
} while (bus->state == TMP144_RESETTING);
|
||||||
|
|
||||||
bus->state = TMP144_INITIALIZING;
|
bus->state = TMP144_INITIALIZING;
|
||||||
CHECK_STATUS(HAL_UART_Receive_IT(bus->handle, bus->rxbuf, 3));
|
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,
|
CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_ADDR,
|
||||||
sizeof(TMP144_SEQ_ADDR), 100));
|
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];
|
uint8_t n_sensors = bus->rxbuf[idx_response] - TMP144_SEQ_ADDR[idx_response];
|
||||||
if (n_sensors != bus->n_sensors) {
|
if (n_sensors != bus->n_sensors) {
|
||||||
|
bus->state = TMP144_ERROR;
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
}
|
}
|
||||||
bus->state = TMP144_IDLE;
|
bus->state = TMP144_IDLE;
|
||||||
@ -100,8 +121,8 @@ HAL_StatusTypeDef tmp144_init_post_addr(TMP144Bus* bus) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HAL_StatusTypeDef tmp144_read_temps() {
|
HAL_StatusTypeDef tmp144_read_temps() {
|
||||||
CHECK_STATUS(tmp144_send_read_temps(&bus_busbar));
|
CHECK_STATUS(tmp144_send_read_temps(&tmp144_bus_busbar));
|
||||||
CHECK_STATUS(tmp144_send_read_temps(&bus_other));
|
CHECK_STATUS(tmp144_send_read_temps(&tmp144_bus_other));
|
||||||
|
|
||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
@ -112,11 +133,10 @@ HAL_StatusTypeDef tmp144_send_read_temps(TMP144Bus* bus) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bus->state = TMP144_READING_TEMP;
|
bus->state = TMP144_READING_TEMP;
|
||||||
// HAL_UART_Receive_IT(bus->handle, bus->rxbuf,
|
|
||||||
// sizeof(TMP144_SEQ_READ_TEMPS) + 2 * bus->n_sensors);
|
|
||||||
CHECK_STATUS(
|
CHECK_STATUS(
|
||||||
HAL_UART_Receive_IT(bus->handle, bus->rxbuf,
|
HAL_UART_Receive_IT(bus->handle, bus->rxbuf,
|
||||||
sizeof(TMP144_SEQ_READ_TEMPS) + 2 * bus->n_sensors));
|
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,
|
CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_READ_TEMPS,
|
||||||
sizeof(TMP144_SEQ_READ_TEMPS), 100));
|
sizeof(TMP144_SEQ_READ_TEMPS), 100));
|
||||||
|
|
||||||
@ -134,7 +154,8 @@ HAL_StatusTypeDef tmp144_recv_temps(TMP144Bus* bus) {
|
|||||||
return HAL_ERROR;
|
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++) {
|
for (size_t i = 0; i < bus->n_sensors; i++) {
|
||||||
size_t buf_offset = headerlen + 2 * i;
|
size_t buf_offset = headerlen + 2 * i;
|
||||||
uint16_t temp =
|
uint16_t temp =
|
||||||
@ -143,27 +164,34 @@ HAL_StatusTypeDef tmp144_recv_temps(TMP144Bus* bus) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint16_t max = temperatures[0];
|
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) {
|
if (temperatures[i] > max) {
|
||||||
max = temperatures[i];
|
max = temperatures[i];
|
||||||
}
|
}
|
||||||
|
if (temperatures[i] < min) {
|
||||||
|
min = temperatures[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
max_temp = max;
|
max_temperature = max;
|
||||||
|
min_temperature = min;
|
||||||
|
|
||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tmp144_handle_rx_cplt(UART_HandleTypeDef* handle) {
|
void tmp144_handle_rx_cplt(UART_HandleTypeDef* handle) {
|
||||||
TMP144Bus* bus;
|
TMP144Bus* bus;
|
||||||
if (handle == bus_busbar.handle) {
|
if (handle == tmp144_bus_busbar.handle) {
|
||||||
bus = &bus_busbar;
|
bus = &tmp144_bus_busbar;
|
||||||
} else if (handle == bus_other.handle) {
|
} else if (handle == tmp144_bus_other.handle) {
|
||||||
bus = &bus_other;
|
bus = &tmp144_bus_other;
|
||||||
} else {
|
} else {
|
||||||
// TODO
|
// TODO
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bus->expected_response_time = 0;
|
||||||
|
|
||||||
switch (bus->state) {
|
switch (bus->state) {
|
||||||
case TMP144_IDLE:
|
case TMP144_IDLE:
|
||||||
// TODO
|
// TODO
|
||||||
|
Loading…
x
Reference in New Issue
Block a user