Ex: (YAT configurado corretamente, pois funciona em um projeto mais antigo)
- enviando do YAT para o uC 55h eu recebo b5h
- enviando do uC para o YAT 55h eu recebo valores variados (95h, D5h, B5h juntamente com a mensagem XXh [Warning: RX FRAMING ERROR]). Quando, com auxílio de uma pinça, eu coloco RX e TX em loop, no YAT eu recebo sempre D5h. Parece que o uC sempre coloca 0x80 nos 4 bits mais significativos do byte recebido 55h + 80h = D5h (isto vale para alguns outros valores também) ou o TX manda dados antes do RX estar pronto ou algo do tipo...
Testes realizados:
- BaudRate de 115200 para 9600 em ambos os lados (uC e YAT);
- WordLength de 8 e 9 bits;
- StopBits 1 e 2 em ambos os lados (uC e YAT);
- Parity nenhum e Odd;
- ClockPrescaler para vários valores; e
- Uso oscilador interno, então usei PCLK de 3MHz até 12MHz e o erro persiste.
- Como comentado acima, colocando RX e TX em loop na placa, o sinal transmitido e recebido em modo debug é perfeito (envio 55h e recebo 55h).
O sinal elétrico está perfeito, muito bem definido e com ausência de rings e/ou ruídos.
Alguém já viu algo do tipo ou pode ajudar na solução do problema?
Configuração do uC:
- Código: Selecionar todos
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.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
Config. MspInit:
- Código: Selecionar todos
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(huart->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/** Initializes the peripherals clocks
*/
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
/* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA0 ------> USART1_TX
PA1 ------> USART1_RX
*/
GPIO_InitStruct.Pin = uC_USART1_TX_Pin|uC_USART1_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
}
}