打印

GD32E230F4串口与RS485的相关配置问题

[复制链接]
392|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yelvlab|  楼主 | 2025-4-2 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学习32系MCU编程,在学习中遇到了一些问题,就是gd32e230的rs485问题。
原本硬件上使用了一颗自动换向RS485PHY,就是RE和DE脚直接拉高就行了,现在新硬件换回了常规的需要控制方向的RS485 PHY,然后我看了固件库使用指南,发现有个rs485 driver的相关代码。但是串口一直没有数据发送
自动换向的代码:
void rs485_config(void) {
    rcu_periph_clock_enable(RS485_GPIO_RCU);
    rcu_periph_clock_enable(RS485_RCU);

    gpio_af_set(RS485_GPIO_PORT, GPIO_AF_1, RS485_TX_PIN | RS485_RX_PIN);

    /* configure USART Tx&Rx as alternate function push-pull */
    gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, RS485_TX_PIN | RS485_RX_PIN);
    gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, RS485_TX_PIN | RS485_RX_PIN);

    /* configure RS485 EN Pin */
    gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, RS485_EN_PIN);
    gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RS485_EN_PIN);
    gpio_bit_write(RS485_GPIO_PORT, RS485_EN_PIN, RESET);

    /* USART configure */
    usart_deinit(RS485_PHY);
    usart_baudrate_set(RS485_PHY, RS485_BAUDRATE);
    usart_parity_config(RS485_PHY, USART_PM_NONE);
    usart_word_length_set(RS485_PHY, USART_WL_8BIT);
    usart_stop_bit_set(RS485_PHY, USART_STB_1BIT);
    usart_receive_config(RS485_PHY, USART_RECEIVE_ENABLE);
    usart_transmit_config(RS485_PHY, USART_TRANSMIT_ENABLE);

    // usart_driver_assertime_config(RS485_PHY, 0x01);
    // usart_driver_deassertime_config(RS485_PHY, 0x01);

    // usart_depolarity_config(USART0, USART_DEP_HIGH);
    // usart_depolarity_config(USART0, USART_DEP_LOW);

    usart_enable(RS485_PHY);
    // usart_rs485_driver_enable(RS485_PHY);

    nvic_irq_enable(USART0_IRQn, 0);
    usart_interrupt_enable(RS485_PHY, USART_INT_RBNE);
    usart_interrupt_enable(RS485_PHY, USART_INT_IDLE);
}


然后尝试了使用usart_rs485_driver_enable(RS485_PHY);来使能rs485 driver,具体代码如下
void rs485_config(void) {
    rcu_periph_clock_enable(RS485_GPIO_RCU);
    rcu_periph_clock_enable(RS485_RCU);

    gpio_af_set(RS485_GPIO_PORT, GPIO_AF_1, RS485_TX_PIN | RS485_RX_PIN | RS485_EN_PIN);

    /* configure USART Tx&Rx as alternate function push-pull */
    gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, RS485_TX_PIN | RS485_RX_PIN);
    gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, RS485_TX_PIN | RS485_RX_PIN);

    /* configure RS485 EN Pin */
    gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, RS485_EN_PIN);
    gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RS485_EN_PIN);
    // gpio_bit_write(RS485_GPIO_PORT, RS485_EN_PIN, RESET);

    /* USART configure */
    usart_deinit(RS485_PHY);
    usart_baudrate_set(RS485_PHY, RS485_BAUDRATE);
    usart_parity_config(RS485_PHY, USART_PM_NONE);
    usart_word_length_set(RS485_PHY, USART_WL_8BIT);
    usart_stop_bit_set(RS485_PHY, USART_STB_1BIT);
    usart_receive_config(RS485_PHY, USART_RECEIVE_ENABLE);
    usart_transmit_config(RS485_PHY, USART_TRANSMIT_ENABLE);

    usart_driver_assertime_config(RS485_PHY, 0x01);
    usart_driver_deassertime_config(RS485_PHY, 0x01);

    usart_depolarity_config(USART0, USART_DEP_HIGH);
    // usart_depolarity_config(USART0, USART_DEP_LOW);

    // usart_enable(RS485_PHY);
    usart_rs485_driver_enable(RS485_PHY);

    nvic_irq_enable(USART0_IRQn, 0);
    usart_interrupt_enable(RS485_PHY, USART_INT_RBNE);
    usart_interrupt_enable(RS485_PHY, USART_INT_IDLE);
}


让后串口没有一点输出,用示波器看了tx,什么都没有

还有,只要加入了usart_rs485_driver_enable(RS485_PHY);这一行就tx就没有输出,不管rs485 driver的配置相关的其他代码是否在,只要一开driver_enable就不行。

实在没理解哪里配置有问题,麻烦大佬们指点一二

使用特权

评论回复
沙发
yelvlab|  楼主 | 2025-4-3 01:03 | 只看该作者
已经解决,找到了问题所在,通过debug发现usart_enable寄存器没置位
其实如果详细观察也能发现

[mw_shl_code=c,true]/*!
    \brief      enable RS485 driver
    \param[in]  usart_periph: USARTx(x=0,1)
    \param[out] none
    \retval     none
*/
void usart_rs485_driver_enable(uint32_t usart_periph)
{
    /* disable USART */
    USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN);

    USART_CTL2(usart_periph) |= USART_CTL2_DEM;
}[/mw_shl_code]

这里usart_rs485_driver_enable函数里面第一句就是usart的使能寄存器复位,应该把
[mw_shl_code=c,true]    usart_enable(RS485_PHY);
    usart_rs485_driver_enable(RS485_PHY);[/mw_shl_code]
这两句换一下顺序,就好了
[mw_shl_code=c,true]usart_rs485_driver_enable(RS485_PHY);
    usart_enable(RS485_PHY);[/mw_shl_code]

解决!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝