lee8871 发表于 2024-10-30 01:36

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);


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

以上。

应该如何解决这个问题?








lee8871 发表于 2024-10-30 15:25

怎么好像,一直在审核?

lee8871 发表于 2024-10-30 16:54


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

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接到数据后取反发出来的,也能被上位机正常接收。

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

lee8871 发表于 2024-10-31 16:50

谢谢!
我按你的方式,确认了寄存器和库函数两种写法,发现配置寄存器的值完全一致。但是寄存器法配置完成后,确实就立即收到了错误的数据,但库函数没有。

lee8871 发表于 2024-10-31 16:52

两种方式的调试现象如下

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

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

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

lee8871 发表于 2024-10-31 16:53

两种方式的调试现象如下

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

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);         ///<系统中断使能
页: [1]
查看完整版本: HC32L190 LPUART0无法收到数据