Bikky
驱动牛犊
驱动牛犊
  • 注册日期2003-12-01
  • 最后登录2017-02-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望11点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1128回复:1

ISP1581问题....

楼主#
更多 发布于:2004-11-13 11:36
关于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应如何配置并如何写数据发送?
百克
liulin
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2009-06-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-15 11:28
写完32字节1581不会自动发出去的,因为不是最大包长。要自己使能,或者事先写好包长
游客

返回顶部