打印
[技术问答]

HC32L190 LPUART0无法收到数据

[复制链接]
360|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;
    }




可以看到调试断点命中。
在使能中断后,会立即跳入串口中断:
使用逻辑分析仪观察串口线,可见,完全没有任何信号,串口线始终为高电平。

观察寄存器可以看到,确实收到了一个数据:

为什么会收到这个数据?


我尝试接收数据,由外部设备发送数据给我:

可以看到,中断命中,但是发生了帧错误。


多次尝试,都会发生这一问题。
可以进入中断,但是不能收到正确的数据。


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


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

以上。

应该如何解决这个问题?








8561867210e902d61c.png (44.37 KB )

8561867210e902d61c.png

185536721104711f45.png (83.14 KB )

185536721104711f45.png

4165267211b60d9835.png (159.56 KB )

4165267211b60d9835.png

使用特权

评论回复
沙发
lee8871|  楼主 | 2024-10-30 15:25 | 只看该作者
怎么好像,一直在审核?

使用特权

评论回复
板凳
lee8871|  楼主 | 2024-10-30 16:54 | 只看该作者

根据发帖中的scon值读取寄存器,也没有发现问题。

使用特权

评论回复
地板
wubangmi| | 2024-10-31 09:59 | 只看该作者
改成mode1,也就是SM寄存器改成01,SM=3是带校验的

使用特权

评论回复
5
lee8871|  楼主 | 2024-10-31 13:48 | 只看该作者
wubangmi 发表于 2024-10-31 09:59
改成mode1,也就是SM寄存器改成01,SM=3是带校验的

我要9bit模式。必须用SM=3

使用特权

评论回复
6
wubangmi| | 2024-10-31 14:44 | 只看该作者
lee8871 发表于 2024-10-31 13:48
我要9bit模式。必须用SM=3

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

综上,你不能收数据要么是你硬件不对,要么是你代码哪里有问题。

1.jpg (415.91 KB )

1.jpg

使用特权

评论回复
7
lee8871|  楼主 | 2024-10-31 16:50 | 只看该作者
谢谢!
我按你的方式,确认了寄存器和库函数两种写法,发现配置寄存器的值完全一致。但是寄存器法配置完成后,确实就立即收到了错误的数据,但库函数没有。

使用特权

评论回复
8
lee8871|  楼主 | 2024-10-31 16:52 | 只看该作者
两种方式的调试现象如下

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

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

看起来这两种操作的本质应该是有差别的,比如初始化必须分步进行。具体原因我正在研究

99559672344d85c176.png (378.15 KB )

99559672344d85c176.png

使用特权

评论回复
9
lee8871|  楼主 | 2024-10-31 16:53 | 只看该作者
两种方式的调试现象如下

看起来这两种操作的本质应该是有差别的,比如初始化必须分步进行。具体原因我正在研究

使用特权

评论回复
10
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);         ///<系统中断使能

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

25

帖子

0

粉丝