cancel
Showing results for 
Search instead for 
Did you mean: 

Should HAL_UART_Transmit work with RS485 or is there a different send function?

SPren
Associate II

I'm running absolutely bog standard STM32CubeMx code on NUCLEO-F091RC to get RS485 working (NOPs added for debugging).

If I scope the USART2_TX line (PA2) I see no data.

There is data on the USART1_TX line (PA9) and the RS485 enable line (USART_DE PA1).

I've used digital analyser (image attached I hope) and standard oscilloscope but I see nothing.

The USART2_DE line stays set for 9.5ms so it makes me think it is doing something and stepping through the code it does put data into the USART Transmit Data register in HAL_UART_Transmit

huart->Instance->TDR = (*pData++ & (uint8_t)0xFFU

What blindingly obvious thing have I missed?

/* USER CODE BEGIN PFP */
 
/* Size of Trasmission buffer */
#define TXBUFFERSIZE                      (COUNTOF(aTxBuffer) - 1)
/* Size of Reception buffer */
#define RXBUFFERSIZE                      TXBUFFERSIZE
 
#define COUNTOF(__BUFFER__)   (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
	
/* Buffer used for transmission */
uint8_t aTxBuffer[] = " **** UART_TwoBoards_ComPolling ****  **** UART_TwoBoards_ComPolling ****  **** UART_TwoBoards_ComPolling **** ";
 
/* Buffer used for reception */
uint8_t aRxBuffer[RXBUFFERSIZE];
 
/* USER CODE END PFP */
 
/************************************************************************/
 
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
  
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		__NOP();
		if(HAL_UART_Transmit(&huart2, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000)!= HAL_OK)
		{
		__NOP();
			Error_Handler();   
		}
		__NOP();
		
 
		__NOP();
		if(HAL_UART_Transmit(&huart1, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000)!= HAL_OK)
		{
		__NOP();
			Error_Handler();   
		}
		__NOP();
		
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
 
/************************************************************************/
 
/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART1_UART_Init(void)
{
 
  /* USER CODE BEGIN USART1_Init 0 */
 
  /* USER CODE END USART1_Init 0 */
 
  /* USER CODE BEGIN USART1_Init 1 */
 
  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  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.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */
 
  /* USER CODE END USART1_Init 2 */
 
}
 
/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART2_UART_Init(void)
{
 
  /* USER CODE BEGIN USART2_Init 0 */
 
  /* USER CODE END USART2_Init 0 */
 
  /* USER CODE BEGIN USART2_Init 1 */
 
  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  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_RS485Ex_Init(&huart2, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */
 
  /* USER CODE END USART2_Init 2 */
 
}
 
/**************************************************/
 

0690X000009YwapQAC.png

1 REPLY 1
SPren
Associate II

Looks like it is a feature of the NUCLEO-F091RC dev board.

Solder Bridges (SB63, SB62) not fitted to take PA2 and PA3 out to headers.

Solder Bridges (SB14, SB13) fitted to get debug serial through programming usb cable.

I can therefore either:-

  • fit SB63/SB62 and remove SB14/SB13 to get PA2/PA3 on external header
  • dig into HAL code to change standard pin selection to use other pins

Not fitted

0690X000009YyElQAK.png

Fitted

0690X000009YyF0QAK.png