封弊账号 发表于 2021-6-17 12:19

GD32F450VET6串口IRDA功能接受数据正确,发送数据错误

本帖最后由 封弊账号 于 2021-6-17 12:24 编辑

硬件连接如上图所示


实际连接单片机串口连接TFD4101,电脑串口连接红外头
软件相关设置
串口1开启irda功能,特殊设置都在下面函数中,正常设置都在gd_eval_com_init中
void all_usart_config(void)
{   
    //config baud rate
    gd_eval_com_init(EVAL_COM1, 9600U);
    gd_eval_com_init(EVAL_COM2, 9600U);
    gd_eval_com_init(EVAL_COM3, 9600U);
    gd_eval_com_init(EVAL_COM4, 9600U);
    gd_eval_com_init(EVAL_COM5, 9600U);
    gd_eval_com_init(EVAL_COM6, 9600U);
    gd_eval_com_init(EVAL_COM7, 9600U);
    //config USART interrupt the pre-emption priority
    nvic_irq_enable(USART0_IRQn, 1, 0); //the pre-emption priority needed to set
    nvic_irq_enable(USART1_IRQn, 0, 1); //the pre-emption priority needed to set
    nvic_irq_enable(USART2_IRQn, 1, 2); //the pre-emption priority needed to set
    nvic_irq_enable(UART3_IRQn, 1, 3);//the pre-emption priority needed to set
    nvic_irq_enable(USART5_IRQn, 1, 4); //the pre-emption priority needed to set
    nvic_irq_enable(UART6_IRQn, 1, 5);//the pre-emption priority needed to set
    nvic_irq_enable(UART7_IRQn, 1, 6);//the pre-emption priority needed to set   
    //enable USART TBE interrupt
    usart_interrupt_enable(USART0, USART_INTEN_RBNEIE);

    //usart_irda_mode_enable(USART1);
    usart_word_length_set(USART1,USART_WL_8BIT);
    usart_data_first_config(USART1, USART_MSBF_MSB);
    //usart_stop_bit_set(USART1, USART_STB_1BIT);
    usart_parity_config(USART1, USART_PM_NONE);
    usart_irda_lowpower_config(USART1,USART_IRLP_NORMAL);
    usart_prescaler_config(USART1,0x01);
    //usart_invert_config(USART1,USART_DINV_DISABLE);   
    usart_irda_mode_enable(USART1);
    usart_lin_mode_disable(USART1);
    usart_synchronous_clock_disable(USART1);
    usart_halfduplex_disable(USART1);
    usart_smartcard_mode_disable(USART1);

    usart_interrupt_enable(USART1, USART_INTEN_RBNEIE);

    usart_interrupt_enable(USART2, USART_INTEN_RBNEIE);
    usart_interrupt_enable(UART3, USART_INTEN_RBNEIE);
    usart_interrupt_enable(USART5, USART_INTEN_RBNEIE);
    usart_interrupt_enable(UART6, USART_INTEN_RBNEIE);
    usart_interrupt_enable(UART7, USART_INTEN_RBNEIE);
}

正常串口初始化,引脚模式、波特率等都在这里
void gd_eval_com_init(uint32_t com, uint32_t baudval)
{
    /* enable GPIO clock */
    uint32_t COM_ID;
    //if(EVAL_COM1 == com)
    //{
    //    COM_ID = 0U;
    //}
    switch(com) //ÔÚÒ»¸ö´®¿ÚµÄ»ù´¡ÉÏÔö¼Ó
    {
      case EVAL_COM1:
            COM_ID = 0U;
            break;
      case EVAL_COM2:
            COM_ID = 1U;
            break;
      case EVAL_COM3:
            COM_ID = 2U;
            break;
      case EVAL_COM4:
            COM_ID = 3U;
            break;
      case EVAL_COM5:
            COM_ID = 4U;
            break;
      case EVAL_COM6:
            COM_ID = 5U;
            break;
      case EVAL_COM7:
            COM_ID = 6U;
            break;         
      default:
            break;         
    }
    //rcu_periph_clock_enable( EVAL_COM_GPIO_CLK);
    rcu_periph_clock_enable(COM_GPIO_CLK);

    /* enable USART clock */
    rcu_periph_clock_enable(COM_CLK);

    /* connect port to USARTx_Tx */
    //gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_TX_PIN);   //set GPIO alternate function
    gpio_af_set(COM_GPIO_PORT, COM_AF, COM_TX_PIN);   //set GPIO alternate function

    /* connect port to USARTx_Rx */
    //gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_RX_PIN);
    gpio_af_set(COM_GPIO_PORT, COM_AF, COM_RX_PIN);

    /* configure USART Tx as alternate function push-pull */
    //gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_TX_PIN);
    gpio_mode_set(COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLDOWN,COM_TX_PIN);
    //gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_TX_PIN);
    gpio_output_options_set(COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_TX_PIN);

    /* configure USART Rx as alternate function push-pull */
    //gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_RX_PIN);
    gpio_mode_set(COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLDOWN,COM_RX_PIN);
    //gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_RX_PIN);
    gpio_output_options_set(COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_RX_PIN);

    /* USART configure */
    usart_deinit(com);
    usart_baudrate_set(com,baudval);
    usart_stop_bit_set(com, USART_STB_1BIT);
    usart_receive_config(com, USART_RECEIVE_ENABLE);
    usart_transmit_config(com, USART_TRANSMIT_ENABLE);

    usart_enable(com);   
}

串口1中断,直接自发自首
void USART1_IRQHandler(void)
{
    uint16_t gd_usart1_receive_data;
    if((RESET != usart_interrupt_flag_get(USART1, USART_INT_RBNEIE)) &&
       (RESET != usart_flag_get(USART1, USART_FLAG_RBNE)))
    {
      /* receive data */
      gd_usart1_receive_data = (usart_data_receive(USART1) & 0xFF);
      usart_data_transmit(USART1,gd_usart1_receive_data);
    }
}

串口1发送函数
void usart_data_transmit(uint32_t usart_periph, uint32_t data)
{
    USART_DATA(usart_periph) = ((uint16_t)USART_DATA_DATA & data);
    while (RESET == usart_flag_get(usart_periph,USART_FLAG_TBE));
}

串口调试界面发送0xeb后回0xeb发送0x90回复0x70有时还0x50

接受全部正常,发送数据错误
页: [1]
查看完整版本: GD32F450VET6串口IRDA功能接受数据正确,发送数据错误