Получение сообщения IrDA на STM32H7 - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь получить некоторые данные с помощью 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 и в регистр данных.

ОБНОВЛЕНИЕ: вот снимок экрана с полученным сигналом: IrDA_RX

Скорость передачи данных в порядке, присутствуют начальный и конечный биты, и сообщение (9 бит) - это то, что я естьв ожидании.Но не распознается декодером и передается в UART.

1 Ответ

0 голосов
/ 09 апреля 2019

Добавление фиктивного чтения в 1 байт сразу после вызова функции init позволило мне успешно выполнить чтение без тайм-аутов.Проблема в том, что после этого функция Receive() снова запускается, чтобы вернуть тайм-ауты.Единственный обходной путь, который я смог найти, - это повторно запустить UART непосредственно перед вызовом функции Receive().Это позволяет мне получить полное сообщение.Это небрежно, но это работает.

Я пытался найти регистры, которые меняются, но мне не удалось определить причину проблемы.

...