阅读:1128回复:1
ISP1581问题....
关于ISP1581的Bulk_IN端点,不知如何配置并使用,我把我的方法列出来,请高手指点一二:
上电后,配置好1581,再配置各端点,先将索引为5的端点,其中要用的Bulk_IN端点用如下方法配置: ISP1581_ENDPT_INDEX = 5; //端索引 ISP1581_ENDPT_MAXPKTSIZE = 0x0040; // 最大包64字节 ,USB1.1 ISP1581_ENDPT_TYPE = 0x0012; //单缓冲,Bulk传输,缓冲区禁用 ISP1581_ENDPT_TYPE |= 0x0008; //缓冲区使能 以上搞法后,再用一个写函数实现数据上传,如下: void ISP1581_WriteEndPoint2(uint8 endp,uint16 len,uint8* buf) { uint16 i; if(len>64) len=64; ISP1581_ENDPT_INDEX = endp; for(i=0;i<len;i++) //写缓冲区数据,到数目后自动使能。 ISP1581_DATA_PORT=*(buf++); if(len<64) ISP1581_CONTROL_FUNCTION |= 0x08; //使短包有效 } (一) 而驱动程序是我自己写的,现在的问题是,上电后,驱动启动了,枚举成功了,然后驱动程序里有一个自动数据采集线程开启了, 我再通过串口给单片机发命令,往1581里写一帧32个数据,此时串口返回有发送中断了,也就是说1581发完了一个数据包到PC机了 ,但PC机上的BusHound没显示收到数据,应用程序从驱动程序里取数也没收到,说明的确没收到数据,但为何1581说有一个发送中断了呢?是不是发的是一个零字节的空包? 然后,我再通过串口发命令给单片机,往1581里再写一帧32个字节的数据发送,马上串口就返回说有一个发送中断产生,此时BusHound也显示收到了32字节,就是我刚才写的第二帧的那32个数据,但每一帧的那些数据哪儿去了呢? 也就是说如果驱动程序先开线程读,再1581才发送,此时每一个包的长度就是0,而不是我写入的32字节。 (二) 再有一个现象,我上电后先通过串口发命令给1581写一帧32字节,让它发送,此时由于驱动程序没开读线程,则串口没返回发送中断,此正常。然后我再开驱动程序里的采集线程,则第一帧数据能收到,不像上面那样每一帧没有了,但却是64字节。 也就是说如果先发送一帧再采集的话,那么第一帧数据长度就是最大包长度,也不是我写入的32字节。 以上好像都与1581数据手册上的说法不一样,如果做数据采集卡的话却是不问题,第一帧可不要,但若做U盘的话可能就不行了,每帧错了后PC机马上就ReSet总线了,这样Bulk_Only传输协议永远无法正常握手了。 哪位仁兄用过1581的,请指点一下啊,Bulk_IN应如何配置并如何写数据发送? |
|
|
沙发#
发布于:2004-11-15 11:28
写完32字节1581不会自动发出去的,因为不是最大包长。要自己使能,或者事先写好包长
|
|