【问题标题】:Receiving IrDA message on STM32H7在 STM32H7 上接收 IrDA 消息
【发布时间】:2019-08-16 21:06:15
【问题描述】:

我正在尝试在带有 HAL 驱动程序的 STM32H7 板上使用 IrDA 模式下的 USART 接收一些数据。

我在 gpio 引脚上得到了预期的回复(波特率、逻辑和时序都可以),但由于某种原因,数据从未移动到 USART 的 RDR 寄存器,当我尝试读取它时,我只需在第一次尝试时获得零,然后超时(轮询模式)。

填写完 IRDA 句柄结构后,我调用 HAL_IRDA_DeInit()HAL_IRDA_Init()。我在HAL_IRDA_MSP_Init() 中配置GPIO 并发送到达目标的第一条消息(使用HAL_IRDA_Transmit())。然后目标发送一个回复,我可以在 UART_RX 引脚上检查该回复。这里发生了一些事情......或者更好的事情没有发生。如果我使用 HAL_IRDA_Receive()(一次 1 个字节)读取 UART,我只会得到零,然后超时。

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。

【问题讨论】:

    标签: c stm32 cortex-m infrared usart


    【解决方案1】:

    在调用 init 函数后添加一个 1 字节的虚拟读取允许我成功读取一次而没有超时。问题是在那之后,Receive() 函数再次开始返回超时。我能找到的唯一解决方法是在调用 Receive() 函数之前重新初始化 UART。这使我可以检索完整的消息。这是草率的,但它的工作原理。

    我试图找到发生变化的寄存器,但我无法找出导致问题的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2011-11-19
      • 2016-03-05
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      相关资源
      最近更新 更多