jacksonjim 发表于 2023-6-30 08:49:50

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

本帖最后由 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);
}






后面注释掉这部分代码能正常发出数据
if (chk)
{
S2CON |= S2TB8;
}
else
{
S2CON &= ~S2TB8;
}目前原因不知道是什么,麻烦帮分析下看下具体是什么原因引起,谢谢

32G12K128 发表于 2023-6-30 13:51:08

附件有范例,测试下看看:

jacksonjim 发表于 2023-6-30 17:41:21

STC32G12K128 发表于 2023-6-30 13:51
附件有范例,测试下看看:

没有关于奇偶校验的发送数据部分,我查看下代码相关的部分,奇偶校验不是要做ACC=dat; S2CON|=S2TB8 之类 的操作嘛,你这个示例中没有对应的,还是说不需要?
页: [1]
查看完整版本: STC32G12K128 Uart2 根据STC8H做奇偶校验时,发数据卡死发送函数