[技术问答] HC32L190 LPUART0无法收到数据

[复制链接]
2749|9
 楼主| lee8871 发表于 2024-10-30 01:36 | 显示全部楼层 |阅读模式
如题,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;
    }

4104167210c9ca13ff.png

187767210cd2588f0.png
可以看到调试断点命中。
在使能中断后,会立即跳入串口中断:
6466367210d5b808d7.png 使用逻辑分析仪观察串口线,可见,完全没有任何信号,串口线始终为高电平。
6176667210e2100124.png
观察寄存器可以看到,确实收到了一个数据:
7221667210ed0e6d45.png
为什么会收到这个数据?


我尝试接收数据,由外部设备发送数据给我:
4190667211a53a1725.png
可以看到,中断命中,但是发生了帧错误。
6390167211a8a376c7.png
329956721106c611eb.png
多次尝试,都会发生这一问题。
可以进入中断,但是不能收到正确的数据。


为了确认波特率正确,我使用这个串口发送一些数据:
        sbuf[0] = 0xaa;
        sbuf[1] = 0x11;
        sbuf[2] = 0x22;
        sbuf[3] = 0x44;
        Rs485::sendDatas(sbuf, 4);

2131067211c2429d2b.png
可以看到,发送出的数据波特率正确,并被逻辑分析仪捕获。

以上。

应该如何解决这个问题?








8561867210e902d61c.png
185536721104711f45.png
4165267211b60d9835.png
 楼主| lee8871 发表于 2024-10-30 15:25 | 显示全部楼层
怎么好像,一直在审核?
 楼主| lee8871 发表于 2024-10-30 16:54 | 显示全部楼层
319476721f3cc6d720.png 52686721f4148b3e6.png
根据发帖中的scon值读取寄存器,也没有发现问题。
87186721f3e94429a.png
wubangmi 发表于 2024-10-31 09:59 | 显示全部楼层
改成mode1,也就是SM寄存器改成01,SM=3是带校验的
 楼主| lee8871 发表于 2024-10-31 13:48 | 显示全部楼层
wubangmi 发表于 2024-10-31 09:59
改成mode1,也就是SM寄存器改成01,SM=3是带校验的

我要9bit模式。必须用SM=3
wubangmi 发表于 2024-10-31 14:44 | 显示全部楼层
lee8871 发表于 2024-10-31 13:48
我要9bit模式。必须用SM=3

按照你所说的在例程上改了一处,来验证,详见图片。
没什么问题,能收能发。但是由于TX和RX是短接的,所以PC上位机串口软件发一个数据会收到两个数据。
一个是上位机发出的直接被接收,另外一个是MCU接到数据后取反发出来的,也能被上位机正常接收。

综上,你不能收数据要么是你硬件不对,要么是你代码哪里有问题。
1.jpg
 楼主| lee8871 发表于 2024-10-31 16:50 | 显示全部楼层
谢谢!
我按你的方式,确认了寄存器和库函数两种写法,发现配置寄存器的值完全一致。但是寄存器法配置完成后,确实就立即收到了错误的数据,但库函数没有。
 楼主| lee8871 发表于 2024-10-31 16:52 | 显示全部楼层
两种方式的调试现象如下

![image](assets/image-20241031165544-ftyxwjl.png)

![image](assets/image-20241031165630-23b09n6.png)

看起来这两种操作的本质应该是有差别的,比如初始化必须分步进行。具体原因我正在研究
99559672344d85c176.png
 楼主| lee8871 发表于 2024-10-31 16:53 | 显示全部楼层
两种方式的调试现象如下
215596723456fe1d5d.png
看起来这两种操作的本质应该是有差别的,比如初始化必须分步进行。具体原因我正在研究
 楼主| lee8871 发表于 2024-10-31 17:19 | 显示全部楼层
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);         ///<系统中断使能
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

60

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部