阅读:3057回复:25
有请sunkai!AN2131QC
应用程序里的DeviceIOControl()函数和固件的TD_POLL()之间的调用是不是就完成了主机与USB设备的数据交换。还有就是发数和取数只在TD_POLL()中编程就可以了,固件的其它部分自己不用太关心是不是呀!
|
|
最新喜欢:![]() |
沙发#
发布于:2002-08-21 15:26
应用程序里的DeviceIOControl()函数和固件的TD_POLL()之间的调用是不是就完成了主机与USB设备的数据交换。还有就是发数和取数只在TD_POLL()中编程就可以了,固件的其它部分自己不用太关心是不是呀! 我不是这样认为的,如IsoStream这个例子 我把数据交换写在 void ISR_Sof(void) interrupt 0 中 其他部分我一行业没有动 |
|
|
板凳#
发布于:2002-08-21 15:52
咱们的工作方式不一样吧!是不是?不敢肯定!
|
|
地板#
发布于:2002-08-21 21:58
CuiMing_73兄说的有他的道理。你要分析那些函数都是做什么的,可以用isr,也可以用查询方法做。poll()在框架中放在一个主循环体内,可以看成是一个任务分派主体,完成查询和控制功能。比如CuiMing_73兄说的,sof发生时,可以在它的isr中处理事务,也可以在poll()中查询sof中断标志位后处理,当然在响应时间上是有些区别。发数和取数你愿意放在那里都可以,我喜欢out放在isr里,in放在poll()里,也有全部放在poll()中的情况。
[编辑 - 8/22/02 by sunkai] |
|
地下室#
发布于:2002-08-22 10:04
引用---------
发数和取数你愿意放在那里都可以,我喜欢out放在ist里,in放在poll()里,也有全部放在poll()中的情况。 ---------- 你说的OUT放在IST 是不是些错了 应该是void ISR_Ep3out(void) interrupt 0 这个函数里了, 还有这是外中断0。“3”表示啥意思了。 |
|
5楼#
发布于:2002-08-22 10:11
CuiMing_73 这位兄弟 你用是啥传输方式!还有你能不能把
void ISR_Sof(void) interrupt 0 这部分你的程序代码如果你愿意的话可以让我看看吗?研究一下。谢谢你了! |
|
6楼#
发布于:2002-08-22 10:20
sunkai 刚才还忘了说。如果像你说的那样,硬件如何定义(管脚)!
|
|
7楼#
发布于: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] |
|
|
8楼#
发布于:2002-08-22 10:30
感觉和硬件没关系吧?(好象又不是由硬件产生中断)
拜托大家帮忙想些办法! |
|
9楼#
发布于:2002-08-22 10:33
Thank a lot, CuiMing!
|
|
10楼#
发布于:2002-08-22 10:39
但我现在倾向于使用默认端口
而且也得到了稳定的程序 但固件端我只能用ASM了 对于ASM我太菜了 |
|
|
11楼#
发布于:2002-08-22 11:41
引用--------- 这是bulk out端点3中断啊,大哥,我真的有点服你了,总是什么都搅在一起,你需要用3就用ISR_Ep3out,如果是用其他的bulk端点也行,只要你在设备描述表中定义了就可以用,主机应用程序决定和哪个端点通讯。 bulkout端点中断服务程序里不外乎压栈出栈,清中断标志,把主机来的数据读取送到该去的地方。对了,这是USB内核中断,跟外部中断,定时器中断等等是两回事,跟硬件无关,设备收到数据就由内核自动产生一个USB中断,USB中断是一个集合,需要分开跳转。 |
|
12楼#
发布于:2002-08-22 14:46
谢谢 sunkai 和 CuiMing_73 两位兄弟! 为啥不能在加分了!不好意思!
|
|
13楼#
发布于:2002-08-22 14:47
sunkai 我是个新手。在有些地方概念不是很清楚,谢谢帮助我!
|
|
14楼#
发布于:2002-08-22 14:50
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白!
|
|
15楼#
发布于:2002-08-22 15:25
敲错了,是isr,中断服务例程,中断处理任务的执行体,恐怕你对单片机也陌生得很。太难为你了。
[编辑 - 8/22/02 by sunkai] |
|
16楼#
发布于:2002-08-22 15:44
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白! 这是我的习惯,也是以前那个项目实际要求,我的数据采集设备有两个pipe,一个bulk in,一个bulk out,bulk out用于从主机向设备发送采集,程控放大器模块的控制码,要求数据传到USB后立即发送控制信号到相应的模块,如果在TD_POLL()中的话,其中执行了大量的代码(向主机传输数据--bulk in),可能会有延时,所以就用中断服务程序来做,一接收到数据就在中断服务程序中处理。这样分开来也有利于程序模块化,看起来比较清晰。 |
|
17楼#
发布于:2002-08-23 13:20
sunkai
ezloader自动下载固件程序 需要注意哪些方面? |
|
|
18楼#
发布于:2002-08-23 13:35
我还想问问如何提高速度。象你那样读写分开做的话 是不是可以提高速度了。传图象速度要多高?
|
|
19楼#
发布于:2002-08-23 13:36
sunkai你能把你的代码让我看看吗?!谢谢你了!我是个新手。所以,比较费力。希望你能帮助我!
|
|
上一页
下一页