找回密码
 立即注册
查看: 442|回复: 2

STC32G12K128 Uart2 根据STC8H做奇偶校验时,发数据卡死发送函数

[复制链接]
  • TA的每日心情
    慵懒
    2024-4-16 10:25
  • 签到天数: 31 天

    [LV.5]常住居民I

    8

    主题

    31

    回帖

    282

    积分

    中级会员

    积分
    282
    发表于 2023-6-30 08:49:50 | 显示全部楼层 |阅读模式
    本帖最后由 jacksonjim 于 2023-6-30 08:57 编辑

    STC32G12K128 Uart2 根据STC8H示例做奇偶校验时,发数据卡死发送函数;中断接收正常
    测试uart参数为 偶校验,115200

    主要关键代码如下


    #define UART2_EVEN


    void Uart2_init(u8 mode, u32 baudRate)
    {
        u32 brt = 0;
        S2CON = (S2CON & 0x3f) | mode; // 模式设置
    #if defined(UART2_EVEN) || defined(UART2_ODD)
        S2CON |= (1 << 7); // 1位起始位, 8位数据, 1位校验位, 1位停止位
    #endif
        if (mode == UART_9bit_BRTx || mode == UART_8bit_BRTx)
        {
            brt = UART_BAUD_RATE(baudRate);
            T2R = 0;   // Timer stop
            S1BRT = 1; // S1 BRT Use Timer2;
            T2_CT = 0; // Timer2 set As Timer
            T2x12 = 1; // Timer2 set as 1T mode
            T2H = (u8)(brt >> 8);
            T2L = (u8)brt;
            T2R = 1; // Timer run enable

            UART2_RxEnable(ENABLE); // UART接收使能
        }
    }



    void UART2_ISR_Handler(void) INTERRUPT(UART2_VECTOR)
    {
        BYTE dat;

        if (S2TI)
        {
            CLR_TI2();
            Uart2_TX_busy = 0;
        }

        if (S2RI)
        {
            CLR_RI2();
            dat = S2BUF;
    #if defined(UART2_EVEN) || defined(UART2_ODD)
            if (S2CON & S2RB8)
                B_RxParity2 = 1;
            else
                B_RxParity2 = 0;
    #endif
            uart2_buf[uart2_RxWptr = dat;
            uart2_time = UART_TIME;

        }
    }

    void UART2_send(const u8 dat)
    {
        bit chk = 0;
        Uart2_TX_busy = 1;
    #if defined(UART2_EVEN) || defined(UART2_ODD)
        ACC = dat;
    #ifdef UART2_ODD // 奇校验
        chk = P;
    #endif // UART2_ODD

    #ifdef UART2_EVEN
        chk = !P; // 偶校验
    #endif        // UART2_EVEN
        if (chk)
        {
            S2CON |= S2TB8;
        }
        else
        {
             S2CON &= ~S2TB8;
        }

    #endif // UART2_EVEN UART2_ODD
        S2BUF = dat;
        while (Uart2_TX_busy)
            ;
    }



    void main()
    {
        sys_init();
        Uart2_init(UART_8bit_BRTx, 115200);
    }






    后面注释掉这部分代码能正常发出数据
    1. if (chk)
    2. {
    3. S2CON |= S2TB8;
    4. }
    5. else
    6. {
    7. S2CON &= ~S2TB8;
    8. }
    复制代码
    目前原因不知道是什么,麻烦帮分析下看下具体是什么原因引起,谢谢
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-5 13:56
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    12

    主题

    256

    回帖

    1578

    积分

    超级版主

    积分
    1578
    发表于 2023-6-30 13:51:08 | 显示全部楼层
    附件有范例,测试下看看:

    11-串口2中断模式与电脑收发测试.rar

    16.97 KB, 下载次数: 25

    电话:0513-55012946 QQ:2195591714  微信:  19952583740
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-16 10:25
  • 签到天数: 31 天

    [LV.5]常住居民I

    8

    主题

    31

    回帖

    282

    积分

    中级会员

    积分
    282
     楼主| 发表于 2023-6-30 17:41:21 | 显示全部楼层
    STC32G12K128 发表于 2023-6-30 13:51
    附件有范例,测试下看看:

    没有关于奇偶校验的发送数据部分,我查看下代码相关的部分,奇偶校验不是要做ACC=dat; S2CON|=S2TB8 之类 的操作嘛,你这个示例中没有对应的,还是说不需要?
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-15 03:03 , Processed in 0.059006 second(s), 39 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表