首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在IrDA上接收STM32H7消息

在IrDA上接收STM32H7消息
EN

Stack Overflow用户
提问于 2019-03-26 13:03:26
回答 1查看 865关注 0票数 0

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

我得到的答复,正如我希望它在gpio引脚(波特率,逻辑和时间是可以的),但由于某种原因,数据从来没有移动到美国it的RDR寄存器,当我试图读取它时,我只是得到零的第一次尝试和超时(轮询模式)。

填充完IRDA句柄结构后,我称之为HAL_IRDA_DeInit()HAL_IRDA_Init()。我在HAL_IRDA_MSP_Init()中配置GPIO,并发送到达目标的第一条消息(使用HAL_IRDA_Transmit() )。然后,目标是发送一个答复,我可以检查UART_RX引脚。这里发生了一些事情..。否则最好不会发生。如果我用HAL_IRDA_Receive() (每次1字节)读取UART,则只得到0,然后超时。

代码语言:javascript
复制
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();
    }

}
代码语言:javascript
复制
/* 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():

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-09 13:23:00

在调用init函数之后添加一个1字节的虚拟读取,使我能够成功地读取一次而不超时。问题是,在此之后,Receive()函数将再次开始返回超时。我能找到的唯一解决办法是在调用Receive()函数之前重新插入UART。这允许我检索完整的消息。这是草率的,但它的工作。

我试图找到改变的寄存器,但我无法分离是什么导致了问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55357876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档