阅读:1025回复:6
1581问题,急、难、烦!!!
最近我也在调1581的通讯,在IN端点出了点问题,不知可否和你们探讨一下?
boyvsgirl9999@yahoo.com.cn 就我知道的1581的枚举过程如下: 不管是全速还是高速,过程一样,只是配置描述符不同: 1、下位机上电后,对1581复位,开始监视1581中断。 2、发现有复位总线复位中断后,下位机对1581复位。 3、检测到高速模式后,设高速标志为true. 4、主机请求设备描述符,1581回复相应的设备描述符(如高速标志为true则发高速的, 否则发全速的)。 5、主机发设置地址描述符,1581设好后回复一个空字节。 6、主机再请求设备描述符,下位机再加复。 7、主机请求配置描述符,9字节的标准配置描述符。下位机回复。 8、主机请求46字节的配置描述符,下位机回复配置+接口+4个端点的描述符和。 9、主机请求字符串描述符,先请求ID0,得到语言ID后,再请求ID1或ID2,得到设备描述字符串。 10、主机重复9一次。 11、主机查找驱动,找到后装入内存,发设置配置描述符。完成枚举过程。 以上过程就是在我这儿实现的,不管高速还是全速,都能枚举通过,但现在IN端点有点问题: 1、每次上电复位后上位机每次总要读64字节(全速)或512字节(高速),以后就正常了,我写几字节就读几字节。 2、就是我读端点长度寄存器,不管我把这个寄存器写入多少,每次读出总是64或512,不知何故。 3、我在IN端点发完一包后立即写一包到IN端点,想连续发来测速度,但行不通,写子程序是调用了,但IN缓冲区没数据,所以没法实现原来的想法,上位机发一包后就再也收不到了,也就是1581收到一包后再也没有成功写一包到IN缓冲区。 以上问题不知哪位大侠能帮我解答一下,不胜感激!!! |
|
|
沙发#
发布于:2003-12-26 17:24
2 端点长度就能设为64,或512,要发送短于最大包长的包,要设置一个其它的寄存器,再看看datasheet吧。
3 要配成双缓存才可以连续写两个包。然后就要等,等一个包发完后 再往里写才行。 |
|
板凳#
发布于:2003-12-27 09:52
1,如果你要发送小于最大包大小的数据,有两种方法,一是把数据量写到数据长度寄存器(DataCount)里,如果一次不行就连续写两次这个寄存器,dma传输的时候好像有这个bug。
二是写完要传输的数据后,往控制功能寄存器里写0x08来强制使端点生效 2,你读的可能是最大包大小寄存器,而不是datacount寄存器。 3,你说的有矛盾,我想应该是你先发一个包的数据到out端点,然后再转移到in端点读到主机。如果像这样做你每次只能发512(双缓冲1024)字节到设备,然后马上开始读,而不能连续发多个再读,要发一个读一个。 如果你的操作是同一个端点,比如ep1in,那么肯定是不行的,你要把数据放到EPnOUT端点再转移到ep1in里才行。 |
|
地板#
发布于:2003-12-28 12:39
多谢楼上二位指点,但还有点不大明白:
1,我用的单片机还做了其它工作,不知是否有冲突导致读1581寄存器出错,但我想也不会,我读1581其它寄存器时都和我上电后配置的一样,只是在读DataCount寄存器时才出问题,问题不管我什么时候去读总传回64(全速)或512(高速),我试着先写30到DataCount马上再读,但出来的还是64或512,不知何故? 2,昨天用前面说的那个方法测速度通过了,就是OUT端点收到一个包后立即送到IN端点. 3,前几天下载周立功公司的那个USBdebug调试软件,它说只支持D12和1581二种器件,我用的就是1581,但打开端口开始读数据后,那个软件在单片机和1581上电复后的头二次总是要读出64个字节,不管是在全速还是在高速下,前几个字节是我写进1581IN 端点的正确数,后面的一些就不知是什么数了,但好像每次上电复位后读出的64个字节是一样.除了前二次外,以后我写 IN 端点几个字节,那软件就读几个字节,达到预期目地,但为什么上电后的前二次会是那样呢? 4,如楼上兄台所说,我在每次写 IN 端点的子程序第一句就是写端点索引,再写DataCount寄存器,再写数据,这样的话也能把我所想要发的数据送到PC机里,最后如再加一个0x08到ControlFuction寄存器里也行,只是那样的话1581在发完一个指定的包后还得发一个0字节的包,则触发二次发送中断. 5,假如DataCount寄存器只能写64或512的话,我昨天写了一个0x0230,因为它是16位的寄存器,只是立即读出来时还是64,我用的是断开总线模式,先读低字节再读高,应该不是硬件冲突吧,我读1581的其它寄存器时没出错啊. |
|
|
地下室#
发布于:2003-12-28 18:29
我用的是通用处理器模式,我一般传输的都是满包,没考虑过不满包的情况,,我觉得写datacount是最好的选择,在枚举时有个get config命令需要收到9个字节的config描述符,我先写了9到datacount寄存器,然后写了10个字节数据到fifo,但上层得到的还是9个字节!这说明datacount寄存器时没有问题的.
对于满包数据,你不需要写0x08到控制功能寄存器的,如果写了就会有一个空包,只需要在不满包的时候写就行. 如果你操作没有问题,那么这也许是一个bug,你可以尝试连续写两次datacount寄存器,然后再读一次试试. |
|
5楼#
发布于:2003-12-29 11:21
多谢楼上老大解憾!
1581的datacounter寄存器工作时的确没问题,只是读该寄存器时有点不对头,还有就是上电复位后头二个包总是读64字节出来,以后就读写都正常了.过几天我再试试通用处理器模式吧... |
|
|
6楼#
发布于:2003-12-29 11:42
那个寄存器在发完数据后,会自动清成最大包长。所以只有在初始化后才是0,往后都会是64或512。datasheet上写过的。仔细看看吧
|
|