CH559L USB_RX_LEN 读取到超过64的值

测试中发现只读寄存器 USB_RX_LEN 会偶然出现值超过64的情况,按理说接收buffer只有64字节,这种现象正常吗?如果正常,如何解读该长度值?


另外该寄存器读取后好像不会自动清0,它在何时会被置0?谢谢。


I am not sure about that but maybe the reason lies on that aditional 2 Bytes for the buffers. In fact the datasheets are not very clear on that and the examples dont show extra gaps in buffer layout. For USB1.1 one out transfer can contain 64 bytes max but can be shorter (flag USBD_SHORT_TRANSFER_OK). I think its save to ignore that extra bytes.


Wy should the register be cleared after reading? Its updated on every out transfer which means when a usb out irq happens the value is valid. Outside of the irq function it might be meaning less. I am saving the length in some static var when i need it outside of the irq function.


结合你的两个问题:1、长度出现超过64字节 2、读取后不变为0

应该是你在非必要读取USB_RX_LEN的时候去读取了这个寄存器。


USB_RX_LEN我们只在“必须读取”的时候才去读他的值:产生USB中断,且中断原因是成功完成了一次OUT、SETUP事务,也就是成功收到一包数据的时候。这在代码中是有体现,这个寄存器只在USB中断函数中,事务为OUT、SETUP的switch-case分支中被读取,这个时候USB_RX_LEN应该总是小于或等于端点描述符中指示的端点长度。


感谢回复。目前看该问题可能和USB没有关系。


使用同一电脑的其他USB口测试发现没有问题,后来测试供电电压,发现芯片脚在使用有问题的USB口时,只有3.1V,芯片工作在56MHz,从而导致芯片内部寄存器/内存数据时不时出现混乱,并且偶然出现自重启现象,通过打印PCON中的bRST_FLAG0/1发现是检测到电压低导致复位。


采用其他USB口供电,有问题的USB口只接数据D+/D-,测试芯片脚电压3.3V,未再出现问题。后使用两片3V3 LDO并联,同时使用有问题的USB口供电,测量芯片管脚供电3.3V,继续测试也没有出现问题,这基本交叉验证了该问题是USB口供电不足导致的。


手册中只提供了Fsys=12MHz 时的Vpot电压大约在2.7V,所以理论上讲3.1V的电压应该不会导致芯片内部寄存器错乱,并复位。芯片工作在 56MHz 时,是否有相关数据?谢谢


@usbman. Thank you for your warm heart as well.



两种USB口,出现IO电压低的时候的VBUS电压都是多少的?

还有要注意芯片供电电路的接法,5V供电和3.3V供电的电路有所不同,可能也是其中一个原因。(电路设计5V供电,某一时刻外部供电过低,低于3.6V,就会涉及到供电方式这一问题)


3V3供电,不使用芯片自带的LDO。有问题的USB口VBUS在4.85V左右,正常的USB口VBUS在5.1V左右。

但是因为当前的USB线缆质量参差不齐,如果使用较长的USB延长线,也是可能降低到该电压的。如果能有56MHz的数据就能更好地解释该现象了。


刚刚又测试了不同批次的芯片都有此现象。


可以用示波器监控下板上LDO的输出,示波器用触发去抓取,触发阈值就设定在3V.
相反的,也可以尝试降低主频,来判断是否是电压和频率之间影响的。


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