阅读:3056回复:25
有请sunkai!AN2131QC
应用程序里的DeviceIOControl()函数和固件的TD_POLL()之间的调用是不是就完成了主机与USB设备的数据交换。还有就是发数和取数只在TD_POLL()中编程就可以了,固件的其它部分自己不用太关心是不是呀!
|
|
最新喜欢:![]() |
沙发#
发布于:2002-08-23 21:03
sunkai ezuabw2k.inf你看过好多次吧,把ezmon.sys相关的部分全部当作是ezloader就成了。 [编辑 - 8/23/02 by sunkai] |
|
板凳#
发布于:2002-08-23 20:49
sunkai你能把你的代码让我看看吗?!谢谢你了!我是个新手。所以,比较费力。希望你能帮助我! 1,我不是学生,向你提供源代码有违规定,请谅解。 2,我不是用c51写的,我只会汇编。 3,新手费力那是自然,谁也不是天生熟手。不要操之过急,把技术资料该理解的地方看懂吧,不要说给你听都始终无法理解。没有必要的基础怎么行? 4,我一直在帮助你,前前后后我几乎把自己的东西讲了一遍。缺的应该是大思路,不是小技巧。 |
|
地板#
发布于:2002-08-23 20:30
我还想问问如何提高速度。象你那样读写分开做的话 是不是可以提高速度了。传图象速度要多高? 速度受多方面因素的影响。 1,数据源提供数据的速度(外围硬件的速度) 2,数据进入端点的速度(固件的效率) 3,应用程序的问题(这个问题前面已经讨论过多次,很重要) 向主机方传数据只需考虑如何提高IN的速度,跟OUT何干,不要搅在一起。在firmware中能提高速度的技术本来就有: 1,fast transfer(iso bulk都有)。 2,endpoint pairing(双缓存乒乓使用) 3,autopointer(转移数据快) 至于编程技巧对速度的影响,应该有但不好评估。 速度要多高?你要去问你的图象转换芯片和你的老板。 |
|
地下室#
发布于:2002-08-23 20:07
sunkai 仅仅把firmware.c里的firmware[]的内容删掉,改为你的firmware就可以了。ezloader本身就只需要注意这一个问题,要想做到上电下载固件还有其他几个方面要做。 |
|
5楼#
发布于:2002-08-23 15:35
分开写嘛!这样做速度咋样!
我现在只会在TD_POLL()里做。读写在一起,速度不快。我是想有没有办法提高速度。还要说明的就是我没有用片子上的WR和RD 信号!是自己产生的! |
|
6楼#
发布于:2002-08-23 15:27
我觉得你还是老老实实看看附带的例子里面的代码吧。里面有读写的过程,在isr中写in和out会好一点吧。
|
|
7楼#
发布于:2002-08-23 13:36
sunkai你能把你的代码让我看看吗?!谢谢你了!我是个新手。所以,比较费力。希望你能帮助我!
|
|
8楼#
发布于:2002-08-23 13:35
我还想问问如何提高速度。象你那样读写分开做的话 是不是可以提高速度了。传图象速度要多高?
|
|
9楼#
发布于:2002-08-23 13:20
sunkai
ezloader自动下载固件程序 需要注意哪些方面? |
|
|
10楼#
发布于:2002-08-22 15:44
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白! 这是我的习惯,也是以前那个项目实际要求,我的数据采集设备有两个pipe,一个bulk in,一个bulk out,bulk out用于从主机向设备发送采集,程控放大器模块的控制码,要求数据传到USB后立即发送控制信号到相应的模块,如果在TD_POLL()中的话,其中执行了大量的代码(向主机传输数据--bulk in),可能会有延时,所以就用中断服务程序来做,一接收到数据就在中断服务程序中处理。这样分开来也有利于程序模块化,看起来比较清晰。 |
|
11楼#
发布于:2002-08-22 15:25
敲错了,是isr,中断服务例程,中断处理任务的执行体,恐怕你对单片机也陌生得很。太难为你了。
[编辑 - 8/22/02 by sunkai] |
|
12楼#
发布于:2002-08-22 14:50
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白!
|
|
13楼#
发布于:2002-08-22 14:47
sunkai 我是个新手。在有些地方概念不是很清楚,谢谢帮助我!
|
|
14楼#
发布于:2002-08-22 14:46
谢谢 sunkai 和 CuiMing_73 两位兄弟! 为啥不能在加分了!不好意思!
|
|
15楼#
发布于:2002-08-22 11:41
引用--------- 这是bulk out端点3中断啊,大哥,我真的有点服你了,总是什么都搅在一起,你需要用3就用ISR_Ep3out,如果是用其他的bulk端点也行,只要你在设备描述表中定义了就可以用,主机应用程序决定和哪个端点通讯。 bulkout端点中断服务程序里不外乎压栈出栈,清中断标志,把主机来的数据读取送到该去的地方。对了,这是USB内核中断,跟外部中断,定时器中断等等是两回事,跟硬件无关,设备收到数据就由内核自动产生一个USB中断,USB中断是一个集合,需要分开跳转。 |
|
16楼#
发布于:2002-08-22 10:39
但我现在倾向于使用默认端口
而且也得到了稳定的程序 但固件端我只能用ASM了 对于ASM我太菜了 |
|
|
17楼#
发布于:2002-08-22 10:33
Thank a lot, CuiMing!
|
|
18楼#
发布于:2002-08-22 10:30
感觉和硬件没关系吧?(好象又不是由硬件产生中断)
拜托大家帮忙想些办法! |
|
19楼#
发布于:2002-08-22 10:29
我的说明总是太懒了
IsoStream这个框架只完成IsoIn 所以我的应用是这样组织的 void ISR_Sof(void) interrupt 0 { register BYTE framel = USBFRAMEL; register BYTE frameh = USBFRAMEH; register BYTE i; IN8DATA = framel; IN8DATA = frameh; ///////////////////////////////////////////// // * Put buffer to USB for(i=0;i<50;++i) IN8DATA=buffer; IntFlag=0xFF; ///////////////////////////////////////////// EZUSB_IRQ_CLEAR(); USBIRQ = bmSOF; // Clear SOF IRQ } 其中buffer在我定义的函数中更新 unsigned int busy=0x20; #define MAXDL 24 void TD_PutData(void) { int i; for(i=0;i<MAXDL;++i) { if(i!=MAXDL-1){ OUTB=0x90; //RC=0,启动AD976, OUTB=0x80; //RC上翻393+1且多路开关切至下一路 } else{ OUTB=0x10; //RC=0,启动AD976, OUTB=0x00; } while(PINSB&busy); //等待转换结束 buffer[i*2]=PINSA; //RC=1后的83nS后可读数据BYTE=1(output D15~D8) OUTB=0xc0; //读数据BYTE=0(output D7~D0)!buffer[1]低字节 buffer[i*2+1]=PINSA; } } 变量IntFlag在主函数中 while(TRUE) // Main Loop { if(GotSUD) // Wait for SUDAV { SetupCommand(); // Implement setup command GotSUD = FALSE; // Clear SUDAV flag } // Poll User Device // NOTE: Idle mode stops the processor clock. There are only two // ways out of idle mode, the WAKEUP pin, and detection of the USB // resume state on the USB bus. The timers will stop and the // processor will not wake up on any other interrupts. if (Sleep) { if(TD_Suspend()) { Sleep = FALSE; // Clear the \"go to sleep\" flag. Do it here to prevent any race condition between wakeup and the next sleep. do { EZUSB_Susp(); // Place processor in idle mode. } while(!Rwuen && EZUSB_EXTWAKEUP()); // Must continue to go back into suspend if the host has disabled remote wakeup // *and* the wakeup was caused by the external wakeup pin. // 8051 activity will resume here due to USB bus or Wakeup# pin activity. EZUSB_Resume(); // If source is the Wakeup# pin, signal the host to Resume. TD_Resume(); } } TD_Poll(); ///////////////////////////////////////////// // * Put AD Data to buffer if(IntFlag){ IntFlag=0; TD_PutData(); } ///////////////////////////////////////////// } [编辑 - 8/22/02 by CuiMing_73] |
|
|
上一页
下一页