关于USB寄存器INMAXP的问题
在USB全速协议中,BULK传输一次的数据包最多为64字节,所以按道理应将USB IN端点的最大数据包大小值设置为8。按照此理解,程序如果向IN端点的FIFO写入大于64字节的数据包,硬件可以自动将数据包裁剪为64字节。
但是在USB例程中,每次向端点填入数据包的长度却限制为64,等待当次包发送完后再填入下一段64字节。
实际操作中,如果向IN端点一次写入超过64字节长度的数据,实际硬件的确会发送超过64字节长度的数据包,
会触发主机的错误机制,下发端点复位指令。
那这个寄存器的功能是不是理解错了呢?
在USB全速协议中,寄存器(如INMAXP)的作用是用于缓存和存储数据,以减少数据传输的时间和空间消耗。寄存器的大小设置直接影响数据传输的效率和稳定性。
1. 寄存器的作用
寄存器(如INMAXP)是一个临时的缓存区域,用于存储读写操作中的数据。在USB全速协议中,通常会使用寄存器来缓存数据,以减少数据传输的开销。
2. 最大数据包大小的设置
在USB全速协议中,BULK传输是指一次性传输多个数据字节,通常用于优化传输效率。寄存器的最大数据包大小设置为64字节,是因为:
数据传输效率:如果寄存器的最大大小设置为64字节,可以确保数据传输的效率,避免不必要的数据溢出。
数据缓存能力:寄存器的大小决定了数据缓存的能力,64字节的大小提供了足够的缓存能力以应对正常的数据传输需求。
3. 寄存器的实际功能
寄存器实际上是一个大小固定为64字节的临时缓存区域。当读写操作完成后,寄存器的内容会自动裁剪为64字节,以保持大小恒定。
4. 错误机制的处理
在USB全速协议中,当寄存器的内容读入超过64字节时,寄存器会自动裁剪为64字节。然而,如果寄存器的实际大小小于64字节,例如设置为8字节,读入超过8字节的数据时,寄存器会自动裁剪为8字节,导致数据丢失。此外,当寄存器的内容读入超过64字节时,寄存器会发送错误包,导致主机错误机制发回还原指令。
5. 如何调整寄存器的大小
如果寄存器的实际大小小于64字节,可以考虑增加寄存器的大小,以避免数据溢出或丢失。例如,设置寄存器的大小为64字节,可以确保数据传输的效率和稳定性。
6. 总结
寄存器的大小设置为64字节是正确的,以确保数据传输的效率和稳定性。如果寄存器的实际大小小于64字节,需要调整大小以避免数据溢出或丢失。错误机制的处理同样重要,确保寄存器的内容不会被错误地裁剪或发回还原指令。
[本文内容由国芯人工智能辅助生成,仅供参考] 没有自动裁剪,需要代码确认发送状态。和wMaxPacketSize保持匹配 是软件拆分数据包的 ercircle 发表于 2025-5-23 12:20
没有自动裁剪,需要代码确认发送状态。和wMaxPacketSize保持匹配
那这样的话这个寄存器有什么作用呢?如果不能自动裁剪的话,FIFO剩余的空间也用不了呀 rm543 发表于 2025-5-23 14:06
那这样的话这个寄存器有什么作用呢?如果不能自动裁剪的话,FIFO剩余的空间也用不了呀 ...
你可以配到最大值呀,只要和你描述符和代码逻辑匹配就行 ercircle 发表于 2025-5-23 14:11
你可以配到最大值呀,只要和你描述符和代码逻辑匹配就行
我的意思是:本来有128字节的FIFO,按照BULK数据包的限制每次只能写入64字节,要等这次包发完了,才能填入下一个64字节,这个128字节的FIFO不就浪费了?
收OUT包的时候,主机一次多发几个64字节的包,能存入FIFO,然后再取缓存,反过来发IN包就没这个功能了。
rm543 发表于 2025-5-23 14:26
我的意思是:本来有128字节的FIFO,按照BULK数据包的限制每次只能写入64字节,要等这次包发完了,才能填 ...
发必须一包一包发,不能直接连续写64*N,至于芯片内部有没有用闲置FIFO空间做缓存功能就不知道了。 DebugLab 发表于 2025-5-23 12:27
是软件拆分数据包的
那就是这个寄存器只用作 AUTOSET 的自动置位IPRDY用了,没用到这个功能就不需要管这个寄存器?
页:
[1]