GD32F4 USB HOST 与 CH340通信,主机端多次接收时接收数据不全。

目前在做GD32F4主机端与CH340通信的项目,实现数据的稳定收发就行。目前枚举成功,USB通信一发一收没啥问题,但涉及到多收的时候出现问题。包长为32字节

主机端现象为:接收到前两次数据(前两次传输的字节数均小于32字节),但再接收第三次传输时(第三传输约为170字节),基本只接收到第三次传输的第一包数据,后续一直没收到。(接收数据图如下:其中167表示后面有167个字节)。

想了解:啥原因造成了主机接收数据不全,有无可能是CH340那端数据丢失了导致主机端数据没收全,或者是其它原因等

邮箱:个人信息保护,已隐藏        谢谢

QQ图片20230418143157.jpg

您好,如上现象大概率是因为USB从批量端点读取串口数据的时候,DATA0和DATA1没有翻转导致。您可以先检查下此部分代码。


你好,昨天你所说的可能为DATA0和DATA1翻转,我检查了这部分代码,猜测应该不是这原因。

理由1:数据PID的翻转,我把翻转代码写在了ACK中断里面,当触发ACK中断时,数据PID翻转。

理由2:在只进行一对一收发调试的时候,数据接收和发送是没出错的。


我对第一条消息我再补充一些现象(最近测的)

  1. 在传输完成中断(TF)处打断点,在接收第三次传输时,只能接收传输的第一包32字节数据

  2. 在传输完成中断(TF)不处打断点,可以接收完整的第三次传输数据(182字节),但主机不会触发接收完成中断

  3. 如果我把接收的前两次传输的数据从buff中清除(即收到就清除),再接收第三次传输的数据,完整接收且可以触发接收完成中断。


望再看看,期待回复,感谢


你好,给你的邮箱发送了一个我们CH32F103操作CH340的例程,我实测了一下多包接收没有问题,你这边可以对比看一下。


好的,感谢,已收到


你好,想问下当CH340有数据需要发送的时候,主机端是不是应该及时的接收?

          想问下 CH340的USB缓存区大小和USART缓存区大小?


测试过程:先把数据发给CH340,之后再调用主机端的接收函数,让主机发送IN包,从CH340接收数据。

现象:当数据少于64字节时,主机可以完成接收。当数据超过64字节时,主机最多接收到64字节,之后CH340一直返回NAK。


猜测:CH340的USB数据缓存区大小是不是64字节且当缓存区满的时候会阻塞。第三次数据传输数据没收全的原因可能是主机端没能及时的接收,测得当主机接收无干扰的时候,三次传输的数据都能接收完成


谢谢


您好,对于CH340的数据端点的读取是需要一直循环读取的,因为不确定UART数据是什么时候会到来。最好是创建一个独立的接收缓冲区用于缓存该USB数据,然后业务上需要读取时,从该缓冲区去取。


您好,目前我这边项目遇到一些问题,GD主机端与CH340通讯的过程中,经常会出现主机端接收不到数据或者主机端数据没发出去的现象,问题点目前还没找到。想问一些问题,如下:

    1.想问有无F4操作CH340的例程,或者适合移植到F4的主机端操作CH340的例程,有的话能否发我,谢谢。

    2.想问下USB主机端接收函数能不能不用轮询方式接收,而使用中断的方式去接收?


感谢。


您好,目前提供的F103操作的例程是可以参考的,逻辑上都是类似的。有条件的话可以抓取下USB通讯过程(USB或逻辑分析仪),这样逻辑上会清楚些。


您好,F103例程我看了,使用的是DMA进行数据的搬运,而在GD的例程中使用的是FIFO主机通道进行数据的传输。两种传输应该是有些区别的,在GD中需要使能通道才能触发通道中断,而且每次传输完都会通道除能,下次传输还需再次使能通道,而在F103中我看到的是直接操作寄存器,就可以知道数据传输的状况,无GD的使能除能这些步骤。(见解有限,如不对,请见谅)。

    想问有无主机通道的例程,谢谢。


您好,F103例程我看了,使用的是DMA进行数据的搬运,而在GD的例程中使用的是FIFO主机通道进行数据的传输。两种传输应该是有些区别的,在GD中需要使能通道才能触发通道中断,而且每次传输完都会通道除能,下次传输还需再次使能通道,而在F103中我看到的是直接操作寄存器,就可以知道数据传输的状况,无GD的使能除能这些步骤。(见解有限,如不对,请见谅)。

    想问有无主机通道的例程,谢谢。


您好,F103例程我看了,使用的是DMA进行数据的搬运,而在GD的例程中使用的是FIFO主机通道进行数据的传输。两种传输应该是有些区别的,在GD中需要使能通道才能触发通道中断,而且每次传输完都会通道除能,下次传输还需再次使能通道,而在F103中我看到的是直接操作寄存器,就可以知道数据传输的状况,无GD的使能除能这些步骤。(见解有限,如不对,请见谅)。

    想问有无主机通道的例程,谢谢。


您好,F103例程我看了,使用的是DMA进行数据的搬运,而在GD的例程中使用的是FIFO主机通道进行数据的传输。两种传输应该是有些区别的,在GD中需要使能通道才能触发通道中断,而且每次传输完都会通道除能,下次传输还需再次使能通道,而在F103中我看到的是直接操作寄存器,就可以知道数据传输的状况,无GD的使能除能这些步骤。(见解有限,如不对,请见谅)。

    想问有无主机通道的例程,谢谢。


您好,F103例程我看了,使用的是DMA进行数据的搬运,而在GD的例程中使用的是FIFO主机通道进行数据的传输。两种传输应该是有些区别的,在GD中需要使能通道才能触发通道中断,而且每次传输完都会通道除能,下次传输还需再次使能通道,而在F103中我看到的是直接操作寄存器,就可以知道数据传输的状况,无GD的使能除能这些步骤。(见解有限,如不对,请见谅)。

    想问有无主机通道的例程,谢谢。


您好,F103例程我看了,使用的是DMA进行数据的搬运,而在GD的例程中使用的是FIFO主机通道进行数据的传输。两种传输应该是有些区别的,在GD中需要使能通道才能触发通道中断,而且每次传输完都会通道除能,下次传输还需再次使能通道,而在F103中我看到的是直接操作寄存器,就可以知道数据传输的状况,无GD的使能除能这些步骤。(见解有限,如不对,请见谅)。

    想问有无主机通道的例程,谢谢。


您好,F103例程我看了,使用的是DMA进行数据的搬运,而在GD的例程中使用的是FIFO主机通道进行数据的传输。两种传输应该是有些区别的,在GD中需要使能通道才能触发通道中断,而且每次传输完都会通道除能,下次传输还需再次使能通道,而在F103中我看到的是直接操作寄存器,就可以知道数据传输的状况,无GD的使能除能这些步骤。(见解有限,如不对,请见谅)。

    想问有无主机通道的例程,谢谢。


只有登录才能回复,可以选择微信账号登录