Я пытаюсь получить некоторые данные с помощью USART в режиме IrDA на плате STM32H7 с драйверами HAL.
Я получаю ответ, как и ожидал, на выводе gpio (скорость передачи, логика и время в порядке), но по какой-то причине данные никогда не перемещаются в регистр RDR USART, и когда я пытаюсьпрочитав его, я просто получаю нули с первой попытки и время ожидания после этого (режим опроса).
После заполнения структуры дескриптора IRDA я вызываю HAL_IRDA_DeInit()
и HAL_IRDA_Init()
.Я настраиваю GPIO в HAL_IRDA_MSP_Init()
и отправляю первое сообщение, которое достигает цели (с HAL_IRDA_Transmit()
).Затем цель отправляет ответ, который я могу проверить на контакте UART_RX.И здесь что-то происходит .. или лучше не бываетЕсли я читаю UART с HAL_IRDA_Receive()
(1 байт за раз), я получаю только ноль, а затем таймауты.
IRDA_HandleTypeDef hirda4;
void vIrdaInit(void)
{
hirda.Instance = USART3;
hirda.Init.BaudRate = 60100;
hirda.Init.WordLength = IRDA_WORDLENGTH_9B;
hirda.Init.Parity = IRDA_PARITY_NONE;
hirda.Init.Mode = IRDA_MODE_TX_RX;
hirda.Init.Prescaler = 1;
hirda.Init.PowerMode = IRDA_POWERMODE_NORMAL;
/* Initialize the IRDA registers. Here also HAL_IRDA_MspInit() will be called */
if (HAL_IRDA_Init(&hirda4) != HAL_OK)
{
Error_Handler();
}
}
/* Initialize IrDA low level resources. This function is called by HAL_IRDA_Init() */
void HAL_IRDA_MspInit(IRDA_HandleTypeDef* irdaHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(irdaHandle->Instance==USART3)
{
/* UART4 clock enable */
__HAL_RCC_USART3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**UART4 GPIO Configuration
PB10 ------> USART3_RX
PB11 ------> USART3_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_UART3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
здесь вызов HAL_IRDA_Transmit () / HAL_IRDA_Receive ():
if(HAL_IRDA_Transmit(&hirda (uint8_t*)TxBuf, sizeof(RxBuf), 5000)!= HAL_OK)
{
Error_Handler();
}
memset(RxBuf, '\0', sizeof(RxBuf));
for (i = 0; i < 8; i++)
{
// blocks here until timeout or data
if(HAL_IRDA_Receive(&hirda, (uint8_t*)RxBuf, 1, 500)!= HAL_OK)
{
Error_Handler();
}
}
В первый раз в цикле у меня поднят флаг RXNE, но в RDR есть только 0. Следующие итерации всегда приводят к таймауту (с IRDA_WaitOnFlagUntilTimeout()
).Я понятия не имею, где искать ... Импульсы, которые я получаю, превышают 3/16 периода, уровни в порядке, но кажется, что я не могу получить сообщение через декодер приема SIR и в регистр данных.
ОБНОВЛЕНИЕ: вот снимок экрана с полученным сигналом:
Скорость передачи данных в порядке, присутствуют начальный и конечный биты, и сообщение (9 бит) - это то, что я естьв ожидании.Но не распознается декодером и передается в UART.