Use DMA for TMP144 communication
This commit is contained in:
@ -69,7 +69,7 @@ HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus) {
|
||||
}
|
||||
|
||||
bus->state = TMP144_RESETTING;
|
||||
CHECK_STATUS(HAL_UART_Receive_IT(bus->handle, bus->rxbuf, 2));
|
||||
CHECK_STATUS(HAL_UART_Receive_DMA(bus->handle, bus->rxbuf, 2));
|
||||
// Keep sending Global Software Reset until it echoes back (as per 7.5.2)
|
||||
int tries = 0;
|
||||
do {
|
||||
@ -77,14 +77,19 @@ HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus) {
|
||||
bus->state = TMP144_ERROR;
|
||||
return HAL_TIMEOUT;
|
||||
}
|
||||
CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_RESET,
|
||||
sizeof(TMP144_SEQ_RESET), 100));
|
||||
HAL_Delay(50);
|
||||
if (bus->handle->RxState == HAL_UART_STATE_READY &&
|
||||
bus->state == TMP144_RESETTING) {
|
||||
HAL_UART_DMAStop(bus->handle);
|
||||
CHECK_STATUS(HAL_UART_Receive_DMA(bus->handle, bus->rxbuf, 2));
|
||||
}
|
||||
CHECK_STATUS(HAL_UART_Transmit_IT(bus->handle, TMP144_SEQ_RESET,
|
||||
sizeof(TMP144_SEQ_RESET)));
|
||||
HAL_Delay(100);
|
||||
tries++;
|
||||
} while (bus->state == TMP144_RESETTING);
|
||||
|
||||
bus->state = TMP144_INITIALIZING;
|
||||
CHECK_STATUS(HAL_UART_Receive_IT(bus->handle, bus->rxbuf, 3));
|
||||
CHECK_STATUS(HAL_UART_Receive_DMA(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));
|
||||
@ -134,8 +139,8 @@ HAL_StatusTypeDef tmp144_send_read_temps(TMP144Bus* bus) {
|
||||
|
||||
bus->state = TMP144_READING_TEMP;
|
||||
CHECK_STATUS(
|
||||
HAL_UART_Receive_IT(bus->handle, bus->rxbuf,
|
||||
sizeof(TMP144_SEQ_READ_TEMPS) + 2 * bus->n_sensors));
|
||||
HAL_UART_Receive_DMA(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));
|
||||
|
||||
@ -60,6 +60,8 @@ UART_HandleTypeDef huart1;
|
||||
UART_HandleTypeDef huart2;
|
||||
UART_HandleTypeDef huart3;
|
||||
UART_HandleTypeDef huart6;
|
||||
DMA_HandleTypeDef hdma_usart1_rx;
|
||||
DMA_HandleTypeDef hdma_usart3_rx;
|
||||
|
||||
/* USER CODE BEGIN PV */
|
||||
uint8_t slave_id;
|
||||
@ -74,8 +76,9 @@ static void MX_I2C1_Init(void);
|
||||
static void MX_USART1_UART_Init(void);
|
||||
static void MX_USART2_UART_Init(void);
|
||||
static void MX_USART3_UART_Init(void);
|
||||
static void MX_USART6_UART_Init(void);
|
||||
static void MX_DMA_Init(void);
|
||||
static void MX_TIM3_Init(void);
|
||||
static void MX_USART6_UART_Init(void);
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
||||
/* USER CODE END PFP */
|
||||
@ -97,25 +100,35 @@ void update_status_leds() {
|
||||
}
|
||||
|
||||
void check_error_conditions() {
|
||||
int error = 0;
|
||||
if (bq_status != BQ_RDY) {
|
||||
ams_can_send_error(AMS_ERROR_BQ, AMS_ERROR_TX_TIMEOUT);
|
||||
error = 1;
|
||||
}
|
||||
tmp144_check_timeouts();
|
||||
if (tmp144_bus_busbar.state == TMP144_ERROR ||
|
||||
tmp144_bus_other.state == TMP144_ERROR) {
|
||||
ams_can_send_error(AMS_ERROR_TMP144, AMS_ERROR_TX_TIMEOUT);
|
||||
error = 1;
|
||||
}
|
||||
if (min_voltage < THRESH_UV) {
|
||||
ams_can_send_error(AMS_ERROR_UV, AMS_ERROR_TX_TIMEOUT);
|
||||
error = 1;
|
||||
}
|
||||
if (max_voltage > THRESH_OV) {
|
||||
ams_can_send_error(AMS_ERROR_OV, AMS_ERROR_TX_TIMEOUT);
|
||||
error = 1;
|
||||
}
|
||||
if (min_temperature < THRESH_UT) {
|
||||
ams_can_send_error(AMS_ERROR_UT, AMS_ERROR_TX_TIMEOUT);
|
||||
error = 1;
|
||||
}
|
||||
if (max_temperature > THRESH_OT) {
|
||||
ams_can_send_error(AMS_ERROR_OT, AMS_ERROR_TX_TIMEOUT);
|
||||
error = 1;
|
||||
}
|
||||
|
||||
if (error) {
|
||||
}
|
||||
}
|
||||
|
||||
@ -164,18 +177,21 @@ int main(void) {
|
||||
MX_CAN1_Init();
|
||||
MX_CAN2_Init();
|
||||
MX_I2C1_Init();
|
||||
MX_DMA_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_USART2_UART_Init();
|
||||
MX_USART3_UART_Init();
|
||||
MX_USART6_UART_Init();
|
||||
MX_TIM3_Init();
|
||||
MX_USART6_UART_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
HAL_GPIO_WritePin(DCDC_CTRL_GPIO_Port, DCDC_CTRL_Pin, GPIO_PIN_SET);
|
||||
HAL_Delay(100);
|
||||
afe_init(&huart2);
|
||||
fan_ctrl_init(&htim3, TIM_CHANNEL_4);
|
||||
eeprom_init(&hi2c1);
|
||||
eeprom_read_random(EEPROM_ADDR_SLAVE_ID, &slave_id);
|
||||
fan_ctrl_init(&htim3, TIM_CHANNEL_4);
|
||||
ams_can_init(&hcan1, &hcan2);
|
||||
HAL_GPIO_WritePin(DCDC_CTRL_GPIO_Port, DCDC_CTRL_Pin, GPIO_PIN_SET);
|
||||
HAL_Delay(100);
|
||||
tmp144_init(&huart1, &huart3);
|
||||
afe_init(&huart2);
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
@ -390,13 +406,13 @@ static void MX_USART1_UART_Init(void) {
|
||||
|
||||
/* USER CODE END USART1_Init 1 */
|
||||
huart1.Instance = USART1;
|
||||
huart1.Init.BaudRate = 115200;
|
||||
huart1.Init.BaudRate = 57600;
|
||||
huart1.Init.WordLength = UART_WORDLENGTH_8B;
|
||||
huart1.Init.StopBits = UART_STOPBITS_1;
|
||||
huart1.Init.Parity = UART_PARITY_NONE;
|
||||
huart1.Init.Mode = UART_MODE_TX_RX;
|
||||
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
||||
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
|
||||
huart1.Init.OverSampling = UART_OVERSAMPLING_8;
|
||||
if (HAL_UART_Init(&huart1) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
@ -495,6 +511,24 @@ static void MX_USART6_UART_Init(void) {
|
||||
/* USER CODE END USART6_Init 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable DMA controller clock
|
||||
*/
|
||||
static void MX_DMA_Init(void) {
|
||||
|
||||
/* DMA controller clock enable */
|
||||
__HAL_RCC_DMA2_CLK_ENABLE();
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
|
||||
/* DMA interrupt init */
|
||||
/* DMA1_Stream1_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
|
||||
/* DMA2_Stream2_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief GPIO Initialization Function
|
||||
* @param None
|
||||
|
||||
@ -23,6 +23,9 @@
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||
|
||||
extern DMA_HandleTypeDef hdma_usart3_rx;
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN TD */
|
||||
@ -390,6 +393,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* USART1 DMA Init */
|
||||
/* USART1_RX Init */
|
||||
hdma_usart1_rx.Instance = DMA2_Stream2;
|
||||
hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
|
||||
hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_usart1_rx.Init.Mode = DMA_NORMAL;
|
||||
hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH;
|
||||
hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx);
|
||||
|
||||
/* USART1 interrupt Init */
|
||||
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(USART1_IRQn);
|
||||
@ -449,6 +471,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* USART3 DMA Init */
|
||||
/* USART3_RX Init */
|
||||
hdma_usart3_rx.Instance = DMA1_Stream1;
|
||||
hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4;
|
||||
hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_usart3_rx.Init.Mode = DMA_NORMAL;
|
||||
hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(huart,hdmarx,hdma_usart3_rx);
|
||||
|
||||
/* USART3 interrupt Init */
|
||||
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(USART3_IRQn);
|
||||
@ -505,6 +546,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10|GPIO_PIN_15);
|
||||
|
||||
/* USART1 DMA DeInit */
|
||||
HAL_DMA_DeInit(huart->hdmarx);
|
||||
|
||||
/* USART1 interrupt DeInit */
|
||||
HAL_NVIC_DisableIRQ(USART1_IRQn);
|
||||
/* USER CODE BEGIN USART1_MspDeInit 1 */
|
||||
@ -545,6 +589,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
|
||||
|
||||
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10);
|
||||
|
||||
/* USART3 DMA DeInit */
|
||||
HAL_DMA_DeInit(huart->hdmarx);
|
||||
|
||||
/* USART3 interrupt DeInit */
|
||||
HAL_NVIC_DisableIRQ(USART3_IRQn);
|
||||
/* USER CODE BEGIN USART3_MspDeInit 1 */
|
||||
|
||||
@ -58,6 +58,8 @@
|
||||
extern CAN_HandleTypeDef hcan1;
|
||||
extern CAN_HandleTypeDef hcan2;
|
||||
extern I2C_HandleTypeDef hi2c1;
|
||||
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||
extern DMA_HandleTypeDef hdma_usart3_rx;
|
||||
extern UART_HandleTypeDef huart1;
|
||||
extern UART_HandleTypeDef huart3;
|
||||
/* USER CODE BEGIN EV */
|
||||
@ -201,6 +203,20 @@ void SysTick_Handler(void)
|
||||
/* please refer to the startup file (startup_stm32f4xx.s). */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 stream1 global interrupt.
|
||||
*/
|
||||
void DMA1_Stream1_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Stream1_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_usart3_rx);
|
||||
/* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Stream1_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles CAN1 RX0 interrupts.
|
||||
*/
|
||||
@ -271,6 +287,20 @@ void USART3_IRQHandler(void)
|
||||
/* USER CODE END USART3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA2 stream2 global interrupt.
|
||||
*/
|
||||
void DMA2_Stream2_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA2_Stream2_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA2_Stream2_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_usart1_rx);
|
||||
/* USER CODE BEGIN DMA2_Stream2_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA2_Stream2_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles CAN2 RX0 interrupts.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user