HC32L190 LPUART0无法收到数据
如题,HC32L190 LPUART0无法收到数据。这是初始化程序:static void Uartinit(void){
M0P_SYSCTRL->PERI_CLKEN0_f.LPUART0 = 1;
M0P_LPUART0->SCNT_f.SCNT = 32;
M0P_LPUART0->ICR = 0;//清除全部中断
M0P_LPUART0->SCON_f={
.RCIE = 1,//接收中断使能
.REN = 1,//接收使能
.SM = 3,//9位数据位
.OVER = 2,//4 采样分频
.HDSEL = 1,//半双工,<--注意这里采用了半双工模式,接收线和发送线是同一根线
};
EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE); ///<系统中断使能
} //串口引脚配置
static void PortInit(void) {
M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 1;
M0P_GPIO->PBDIR_f.PB00 = 0;
M0P_GPIO->PBADS_f.PB00 = 0;
M0P_GPIO->PBDR_f.PB00 = 1;
M0P_GPIO->PBOD_f.PB00 = 1;//od,并且外接了上拉电阻
M0P_GPIO->PBPU_f.PB00 = 1;
M0P_GPIO->PB00_SEL = 3;
M0P_GPIO->PBDIR_f.PB01 = 0;
M0P_GPIO->PBADS_f.PB01 = 0;
M0P_GPIO->PBDR_f.PB01 = 1;
M0P_GPIO->PBBCLR = 1<<1;
}
可以看到调试断点命中。
在使能中断后,会立即跳入串口中断:
使用逻辑分析仪观察串口线,可见,完全没有任何信号,串口线始终为高电平。
观察寄存器可以看到,确实收到了一个数据:
为什么会收到这个数据?
我尝试接收数据,由外部设备发送数据给我:
可以看到,中断命中,但是发生了帧错误。
多次尝试,都会发生这一问题。
可以进入中断,但是不能收到正确的数据。
为了确认波特率正确,我使用这个串口发送一些数据:
sbuf[0] = 0xaa;
sbuf[1] = 0x11;
sbuf[2] = 0x22;
sbuf[3] = 0x44;
Rs485::sendDatas(sbuf, 4);
可以看到,发送出的数据波特率正确,并被逻辑分析仪捕获。
以上。
应该如何解决这个问题?
怎么好像,一直在审核?
根据发帖中的scon值读取寄存器,也没有发现问题。
改成mode1,也就是SM寄存器改成01,SM=3是带校验的 wubangmi 发表于 2024-10-31 09:59
改成mode1,也就是SM寄存器改成01,SM=3是带校验的
我要9bit模式。必须用SM=3 lee8871 发表于 2024-10-31 13:48
我要9bit模式。必须用SM=3
按照你所说的在例程上改了一处,来验证,详见图片。
没什么问题,能收能发。但是由于TX和RX是短接的,所以PC上位机串口软件发一个数据会收到两个数据。
一个是上位机发出的直接被接收,另外一个是MCU接到数据后取反发出来的,也能被上位机正常接收。
综上,你不能收数据要么是你硬件不对,要么是你代码哪里有问题。
谢谢!
我按你的方式,确认了寄存器和库函数两种写法,发现配置寄存器的值完全一致。但是寄存器法配置完成后,确实就立即收到了错误的数据,但库函数没有。
两种方式的调试现象如下
!(assets/image-20241031165544-ftyxwjl.png)
!(assets/image-20241031165630-23b09n6.png)
看起来这两种操作的本质应该是有差别的,比如初始化必须分步进行。具体原因我正在研究 两种方式的调试现象如下
看起来这两种操作的本质应该是有差别的,比如初始化必须分步进行。具体原因我正在研究 wubangmi 发表于 2024-10-31 14:44
按照你所说的在例程上改了一处,来验证,详见图片。
没什么问题,能收能发。但是由于TX和RX是短接的,所 ...
现在的问题是写寄存器和调库函数的寄存器内容,完全一致。
但是出来效果,就是寄存器**出问题,库函数没问题。这也说明硬件没有异常。
我还看了 M0P_SYSCTRL->PERI_CLKEN0_f.LPUART0 = 1; 这个寄存器,值也是一致的。
在初始化顺序方面有特别要注意的地方吗?
==================================================
我按照库函数法的顺序,进行写寄存器,也不正常。
M0P_SYSCTRL->PERI_CLKEN0_f.LPUART0 = 1;
delayMs(1);
M0P_LPUART0->SCON_f={
.SM = 3,//9位数据位
.OVER = 2,//4 采样分频
};
delayMs(1);
M0P_LPUART0->SCNT_f.SCNT = 6;
delayMs(1);
M0P_LPUART0->SCON_f={
.REN = 1,//接收使能
.SM = 3,//9位数据位
.OVER = 2,//4 采样分频
};
delayMs(1);
M0P_LPUART0->ICR = 0;//清除全部中断
delayMs(1);
M0P_LPUART0->SCON_f={
.RCIE = 1,//接收中断使能
.REN = 1,//接收使能
.SM = 3,//9位数据位
.OVER = 2,//4 采样分频
};
delayMs(1);
EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE); ///<系统中断使能
页:
[1]