zhangzhuoliang
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望42点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1156回复:2

那位大哥帮帮忙,都两天了还没调通!

楼主#
更多 发布于:2004-02-28 10:56
读贴的兄弟,你好!我在上位机读数时遇到了问题,我已经调了两天了,可还是调不通
,希望你帮我看看!我的驱动是philops提供的那个!我的上位机程序就是用vb调用周立功的EasyD12.dll动态连接库
的ReadPport1()和WritePort1()!在调用WritePort1()函数时正常vb能写进单篇机!
但调用ReadPport1()时总是在出问题,固件程序没有向缓冲中写进去数!现在我有几个问题没弄明白!
(1)调用ReadPport1()函数是不是只产生in包而不产生端点1的in中断,因为书上说端点1,2的in中断是在发完数(发送成功)
时才产生的(不像out,是有out包就产生out中断)那么我怎样向缓冲中写数呢?“发送的数据写到缓冲”这段代码是不是就不能放在中断中呢?
(2)按照上面的理解我是把“发送的数据写到缓冲”这段代码放在了主循环中具体是:
设备启动后先把缓冲区空标志置1,设备有数据产生时判断这个标志,为1就先把端点填满,
然后清标志,数据发走后会有中断,在中断服务程序中把缓冲区空标志置1,问题是现在根本不产生in中断!
(3)我分析不产生中断的原因可能是我在掉ReadPport1()之前,固件程序已经完成写缓冲了且使缓冲有效(Fah)
这时我才调用ReadPport1()函数产生in包!是不是使缓冲有效(Fah)和in包之间的时间间隔太长才使发送无效呢?
有没有这种可能!
(4)与(3)有关,在写数时,写完后,当发送使缓冲有效(Fah)
命令时,是不是必须在一定的严格时间间隔呢收到in包,才算发送成功,产生中断呢?还是写完使缓冲有效(Fah)
命令后等待in包,只要in包来了就发送,然后产生中断!
拜托!拜托!
谢谢了!


zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-29 00:28
我想我可以帮到你。
虽然我没有使用过EasyD12.dll,但根据你的描述来答复你。
1。你说的前半段完全正确:in中断是在发完数(发送成功)时才产生的(不像out,是有out包就产生out中断)。这有点像单片里的串口发送中断,发完之后才给你中断,表明你可以发送下一字节,否则你会Overlap(重叠)。D12也考虑了这方面,但它更关心的是速度问题。也就是说假设你要上传给PC大量数据,显然需要多次IN包,那么这种中断机制会保证你能几乎不间断把数据放到总线上。所以好的代码应该是把?“发送的数据写到缓冲”这段代码放在中断中。别急,往下看。
2。你已经理解了in中断不会无缘无故产生,这已经非常好。事实的情况是,如果你不采用适当的机制,in中断永远由于上次发送完成产生。这就是说,它不会由于PC发送in包而产生。
3。好了,事情已经清楚了,让我们看一下Read的流程吧!
第一步:PC发送Read请求(这不是In包)。这可以通过控制管道或任何可以完成Out操作的管道。设备端要能理解该请求。亦即设备端能从该请求中知道PC要读他的数据,如果有必要还应指明要读数据的偏移量,长度等信息。
第二步:设备端理解了该请求后,将该数据写道D12的缓冲区,如果数据超长,会如前面所述通过多次in中断完成。这里千万要注意的是:发出的数据包一定要和PC的in包要求的长度一致,否则会出校验错误。
第三步:PC发出in包(这里说是第三步是不公平的,其实PC可能早已发出了in包,只是设备端无数据给它,它会不停反复地发送in包,你看到的应该是程序等在那里,傻在那里),当设备端操作D12命令FAH后,PC终于得到了它的数据,可以返回了。

问题的关键:D12帮你完成了很多USB低层操作,甚至协议。但是如果你的上层协议不能恰当指挥低层协议,则系统是玩不转的。

给你一个爽一点的办法:
1。上层软件读写USB设备采用固定长度,如:64bytes.
2。在固件中只要收到PC的写数据,在out中断中立即回送数据,可以是收到数据的适当改变:如每个字节乘以2。in中断的代码只完成清中断的动作。
3。在上层软件中采用先写后读的模式,你会发现一切OK。

当然,这只是帮你调通它而已。是懒人的办法。有意义的办法你可以自己想得到的。正所谓举一反三...
A strong man can save himself. A great man can save another.
zhangzhuoliang
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望42点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-29 10:41
老兄你真是好人啊!热心啊!我要是学会了也向你学习!像你致敬!不光因为你回答了我的帖子,还因为你写的如此清楚
游客

返回顶部