阅读:2314回复:17
关于USB的读写问题!
各位驱动高手好!
最近我在做一个USB接口的项目,项目的大多内容已经完成! 只留下USB驱动程序接口问题了! 关于USB的固件程序也已经编写好,同时驱动程序是用DRIVER WORK开发的,也可以安装成功了,问题就是,用户如何从固件读到数据? 固件和用户都是通过端点2的BULK方式通讯,固件可以从端点2读到数据,也可以向端点2写入数据。然而用户只可以向固件通过API函数写入数据,固件有个端点2的接收中断,把用户的数据读到固件里,测试很成功。 但是固件里向端点2写的数据,用户通过API函数得不到?固件一直向端点2发数据,而用户如何正确,不丢失地从端点取数据呢? 用户的的读如何和固件的写匹配呢?(用户写和固件读容易完成,因为固件有端点接受中断),他们之间有什么协议吗? 驱动程序是DRIVER WORK开发的,其中的端点2 BULK方式代码写好的,编译通过生成了正确的驱动。 请问通过端点2,用户如何和固件完成大批量的数据传送,通过端点2用户的读如何完成? 小弟先谢谢各位高手了! 如果有精通USB驱动的,也可以和我们联系兼职(最好是上海的,外地也可) 公司:上海软件园。 电话:021-38953681-2 何先生 hework@tom.com |
|
最新喜欢:![]()
|
沙发#
发布于:2003-07-16 10:41
那你创造条件等枚举成功了才让断点生效呀
一般是收到两次set config之后枚举就会结束(我觉得理论上一次就行,可不知道为什么我这里显示的是两次) |
|
板凳#
发布于:2003-07-15 14:27
单步执行时枚举无法成功
|
|
地板#
发布于:2003-07-15 14:17
呵呵,jinghuiren总是很热心哪。
|
|
地下室#
发布于:2003-07-15 09:59
如果你的固件能单步执行的话就跟踪到D12_WriteBuffer函数里看看ADCdata里的数据是不是你期望的,如过是就没什么问题。
|
|
5楼#
发布于:2003-07-15 09:38
void main_txdone(void)reentrant
{ unsigned char len,epstatus; D12_ReadLastTransactionStatus(5); epstatus = D12_ReadEndpointStatus(5);//读取缓存区状 epstatus &=0x60; //发送数据 len = D12_WriteBuffer(5,ADCdata,64); } 其中ADCdata是一个保存有数据的指针,然后在固件的主程序里来调用main_txdone()函数,不知是否正确??? |
|
6楼#
发布于:2003-07-15 09:23
我不是发mail给你了吗?
上班时间打电话不大好,而且还是长途,很贵的 如果写都写不明白的话说更说不明白了 我这人从来都是想得很好,但是说不出来,可是能写出来 :D 所以最好还是mail吧 你可以发信到我的另外一个邮箱 jinghuiren@bit.edu.cn |
|
7楼#
发布于:2003-07-14 19:47
花老大:
电话交流可以吗,021-38953681-25 小何 |
|
|
8楼#
发布于:2003-07-14 09:19
:D
蹭点分 |
|
|
9楼#
发布于:2003-07-12 08:58
呵呵,小猫,你的想法是好的,可是实现起来是比较麻烦的,因为usb设备是不能主动发数据到主机的,所有的传输都要由主机来启动的。对于你的想法,可以有几种方法来实现:
1,用bulk端点,你先用主机发送一个bulk out包给设备,告诉设备你想要都少数据和什么数据,然后在发送bulk in命令,当设备把数据准备好后就会传到主机了。 2,用ep0和bulk端点来完成,用控制传输吧你想要的数据和要什么数据发到设备,然后用bulk in把数据从设备读回 3,直接用ep0来实现,控制传输的数据阶段就是用来传输少量数据的,你可以直接把少量的数据通过控制传输来实现,但是你必须自己定义一些厂商请求来实现这个control传输,格式和标准请求一样。 总之,usb设备工作机理是,你主机想要什么他就给你什么,你不要的话就什么也没有,如果你想实现设备“主动”发一些数据然后在主机判断时候是你想要的数据的话,一般情况下是不可能实现的。 |
|
10楼#
发布于:2003-07-11 20:09
不用ep0的话,只好自己定义驱动和epn通讯的协议。不过,我决定用ep0好了 :D
|
|
|
11楼#
发布于:2003-07-11 20:07
:D :D :D
dear 花大佬,你说的是如何连续不断得从in端点得buffer里到数据,我说的是,我要韧件给我发送我想要得数据,不一定是该in端点里面现有的数据,可能要让mcu自己放置一些我想要得数据到in端点buffer,因此我收到bulk in数据后 ,我要判断数据是不是我想要得 :D 你和贴主说的意思是,怎么从ep in 连续不断的读数据,我说的意思是,怎么通过ep0以外的端点,让驱动和韧件通讯 :D |
|
|
12楼#
发布于:2003-07-11 19:22
再回答小猫的问题:
1,你的想法是对的,其实驱动向设备申请数据就是通过这个机制来实现的,提供一个buffer,然后把要申请的数据数量传到设备。驱动程序返回的时候数据自然就同时得到了。 2,这个情况你的想法就有点欠妥了,其实在读取设备方的数据时,驱动需要做的是和情况1是一样的,就是提供一个buffer和要读取的数据量,然后usb 主机控制器就会不断的发送in令牌(token)到设备方看设备的端点里是否有数据,如果有数据,设备方的收发器会把数据放在in令牌之后返回到主机,如果没有就不断的发in令牌询问,直到超时返回。 而固件方的任务就是把数据不断的填充到端点里,仅此而已。 再说的详细一点,如果设备端没有数据,那么回发送nak给主机,这个nak会同是为设备端的mcu产生中断,你可以在这个中断里填充数据到端点;当主机成功收到数据后,会发送ack给设备,他也会产生中断,你在这个中断里也可以网端点里填充数据,你可以是情况而定 我说的你满意吗? |
|
13楼#
发布于:2003-07-11 19:09
先回答搂主的问题:
首先,我不知道你用的什么片子,如果你的端点2只有一个,那么肯定不能同时实现读和写,因为1个interface里一个bulk端点只能有一种方式,要么是in,要么是out,不可能既是in有是out。 如果你的ep2有两个,一个是ep2in 一个是ep2out,那么就可以实现同时读写了。我们知道,usb设备是个从设备,因此所有的数据传输都是有主机端发起的,当然包括从设备读数据。 具体流程如下: 1,在主机端要不断的用deviceiocontrol()或者readfile()向设备申请数据,可是用一个循环来实现 2,在固件方,不断地往ep2in里面填数据,在ep2in中断里只需要做一件事,就是清除中断寄存器。这样就能实现连续不断的从设备获得数据了。 你觉得我的回答对你有帮助吗? |
|
14楼#
发布于:2003-07-11 18:55
可爱的小猫
你都想知道些什么 让我来告诉你 :D |
|
15楼#
发布于:2003-07-11 16:21
我也正在做这方面的工作,希望高手门多多指教,谢谢!!!!duanjong@163.com
|
|
16楼#
发布于:2003-07-11 16:07
灌壶水,凑个200贴 :D
|
|
|
17楼#
发布于:2003-07-11 15:58
我也是碰到这样的问题,就是如何让驱动和韧件通讯(set和get)
我设计两种方案: 1。通过控制端点。driver get某个信息的时候,发一个读命令下去,并且提供一个buffer,命令返回时就有数据了 2。通过EP2。driver get 某个信息的时候,发一个bulk out,带上 一个数值。(这个数值让韧件知道你要get什么,韧件就知道把数据写到端点buffer里面,顺便把那个数值也写进去) 接着驱动再发一个bulk in等着接收数据,接收时候检查最后那个数值,是不是你想要得,不是的话,再发bulk in 我是这样设计的,还没开始做,有经验的大虾请指教 :D |
|
|