UART on STM32F091 stops receiving data even if they're sent

125 views Asked by At

So, I'm having strange behavior regarding the serial number of my board with an STM32F091.

I have a Python software that sends a packet on the serial port every 100 ms. I have initialized the serial port on the ucontroller with the same settings as are set in the Python software to transmit.

/* USART2 init function */
static void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 38400;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  
  HAL_UART_Receive_IT(&huart2, &cdr2, 1);
}

I'm using the RX callback to manage the RX on the serial port

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  /* Set transmission flag: trasfer complete*/
  if (UartHandle->Instance == USART2)
  { 
    rx2[puwrrx2] = cdr2;
    
    if( puwrrx2 < ( RX2_LEN - 1 ) )      
      puwrrx2++;                   
    else
      puwrrx2 = 0;
    
    HAL_UART_Receive_IT(&huart2, &cdr2, 1);
  }
}

and the TX callback to put back the serial in RX

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  /* Set transmission flag: trasfer complete*/
  if (UartHandle->Instance == USART2)
    DE_RS485_LOW;
}

with

#define DE_RS485_HIGH             HAL_GPIO_WritePin(RS485_En2_uC_GPIO_Port, RS485_En2_uC_Pin, GPIO_PIN_SET)
#define DE_RS485_LOW              HAL_GPIO_WritePin(RS485_En2_uC_GPIO_Port, RS485_En2_uC_Pin, GPIO_PIN_RESET)

I trasmit every 100 ms with a function that calls

DE_RS485_HIGH;
HAL_UART_Transmit_IT(&huart2, tx2, packet_lenght);

For some reason, I still have to understand why, at a certain point, the serial stops receiving data or, at least, the rx2[] buffer stays empty even if I'm sending data.

Is there a way to check if the UART goes in error and, at least, reset it to make it work again?

UPDATE

After some investigation, I found out that the main issue is that RxXferCount goes to zero for some reason. This put the RxState to HUAL_UART_STATE_READY instead of putting the state back to BUSY RX.

The CR1 register has also the bit 2 RE: Receiver enable set to 0 and the ISR register shows both FE: Framing error and NF: START bit Noise detection flag.

The main issue is that when everything I've just described happens, the HAL_UART_ErrorCallback is not called

Staying in debug I've noticed that the only callback my code enters in is the USART3_8_IRQhandler

From what I understand is that with RxXferCount=0 the micro do not automatically clear the errors and goes back to the RX mode, but stays stuck in the situation I've just described

0

There are 0 answers