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;
}目前原因不知道是什么,麻烦帮分析下看下具体是什么原因引起,谢谢 附件有范例,测试下看看:
STC32G12K128 发表于 2023-6-30 13:51
附件有范例,测试下看看:
没有关于奇偶校验的发送数据部分,我查看下代码相关的部分,奇偶校验不是要做ACC=dat; S2CON|=S2TB8 之类 的操作嘛,你这个示例中没有对应的,还是说不需要?
页:
[1]