关于GD32IrDA问题
最近因为项目涉及到国产化,所以用到了兆易的GD32F450单片机。
其中用到了串行IrDA(SIR),折腾了几天时间,为了避免大家踩坑,所以总结一下我遇到的问题。
项目中用到红外收发数据,使用的TFBS4652 收发器。
一开始我先初始化串口,确保能够正常收发数据之后,然后调用了usart_irda_mode_enable(com);函数使能红外。初始化之后 我用 USB转IrDA 工具,通过我主控板收发数据,发现数据能够正确发送,但是不能接收(进入不了接收中断,RXNE标志位也没有置位)问题就出现再这里,我以为是红外模块部分有问题,所以通过查询资料,利用示波器,发现模块也没有问题,那么问题应该就是在单片机初始化上。
对照初始化函数,发现有一个IrDA时钟初始化的函数没有调用,调用之后能够正确接收。
代码如下:
void gd_eval_com_init(uint32_t com)
{
/* enable GPIO clock */
uint32_t COM_ID;
if(EVAL_COM1 == com)
{
COM_ID = 0U;
}
rcu_periph_clock_enable( EVAL_COM_GPIO_CLK);
/* enable USART clock */
rcu_periph_clock_enable(COM_CLK[COM_ID]);
/* connect port to USARTx_Tx */
gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_TX_PIN[COM_ID]);
/* connect port to USARTx_Rx */
gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_RX_PIN[COM_ID]);
/* configure USART Tx as alternate function push-pull */
gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_TX_PIN[COM_ID]);
gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_TX_PIN[COM_ID]);
/* configure USART Rx as alternate function push-pull */
gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_RX_PIN[COM_ID]);
gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_RX_PIN[COM_ID]);
/* USART configure */
usart_deinit(com);
usart_baudrate_set(com,9600U);
usart_stop_bit_set(com, USART_STB_1BIT);
usart_receive_config(com, USART_RECEIVE_ENABLE);
usart_transmit_config(com, USART_TRANSMIT_ENABLE);
usart_irda_lowpower_config(com, USART_IRLP_NORMAL);
/* 这一句一定要加 */
usart_prescaler_config(com, 0x01);
usart_irda_mode_enable(com);
usart_enable(com);
/* USART interrupt configuration */
nvic_irq_enable(UART3_IRQn, 1, 1);
/* enable USART0 receive interrupt */
usart_interrupt_enable(UART3, USART_INTEN_RBNEIE);
// /* enable USART0 transmit interrupt */
// usart_interrupt_enable(USART0, USART_INTEN_TBEIE);
}
第一次发文章,有点啰嗦,希望文章对大家有用,减少大家开发时间。谢谢!