Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3057回复:25

有请sunkai!AN2131QC

楼主#
更多 发布于:2002-08-21 15:17
应用程序里的DeviceIOControl()函数和固件的TD_POLL()之间的调用是不是就完成了主机与USB设备的数据交换。还有就是发数和取数只在TD_POLL()中编程就可以了,固件的其它部分自己不用太关心是不是呀!

最新喜欢:

yuri69yuri69
CuiMing_73
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-21 15:26
应用程序里的DeviceIOControl()函数和固件的TD_POLL()之间的调用是不是就完成了主机与USB设备的数据交换。还有就是发数和取数只在TD_POLL()中编程就可以了,固件的其它部分自己不用太关心是不是呀!


我不是这样认为的,如IsoStream这个例子
我把数据交换写在
void ISR_Sof(void) interrupt 0

其他部分我一行业没有动
cuiming73@263.net 10101973@sina.com
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-21 15:52
咱们的工作方式不一样吧!是不是?不敢肯定!
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-22 10:04
引用---------
  发数和取数你愿意放在那里都可以,我喜欢out放在ist里,in放在poll()里,也有全部放在poll()中的情况。

----------
你说的OUT放在IST 是不是些错了 应该是void ISR_Ep3out(void) interrupt 0  这个函数里了, 还有这是外中断0。“3”表示啥意思了。
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-22 10:11
CuiMing_73 这位兄弟  你用是啥传输方式!还有你能不能把
void ISR_Sof(void) interrupt 0 这部分你的程序代码如果你愿意的话可以让我看看吗?研究一下。谢谢你了!
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-22 10:20
sunkai 刚才还忘了说。如果像你说的那样,硬件如何定义(管脚)!
CuiMing_73
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
cuiming73@263.net 10101973@sina.com
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-22 10:30
感觉和硬件没关系吧?(好象又不是由硬件产生中断)
拜托大家帮忙想些办法!
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-22 10:33
Thank a lot, CuiMing!
CuiMing_73
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-22 10:39
但我现在倾向于使用默认端口
而且也得到了稳定的程序
但固件端我只能用ASM了
对于ASM我太菜了
cuiming73@263.net 10101973@sina.com
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-22 11:41
引用---------
  发数和取数你愿意放在那里都可以,我喜欢out放在ist里,in放在poll()里,也有全部放在poll()中的情况。

----------
你说的OUT放在IST 是不是些错了 应该是void ISR_Ep3out(void) interrupt 0  这个函数里了, 还有这是外中断0。“3”表示啥意思了。

这是bulk out端点3中断啊,大哥,我真的有点服你了,总是什么都搅在一起,你需要用3就用ISR_Ep3out,如果是用其他的bulk端点也行,只要你在设备描述表中定义了就可以用,主机应用程序决定和哪个端点通讯。 bulkout端点中断服务程序里不外乎压栈出栈,清中断标志,把主机来的数据读取送到该去的地方。对了,这是USB内核中断,跟外部中断,定时器中断等等是两回事,跟硬件无关,设备收到数据就由内核自动产生一个USB中断,USB中断是一个集合,需要分开跳转。
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-22 14:46
谢谢 sunkai 和 CuiMing_73  两位兄弟! 为啥不能在加分了!不好意思!
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-08-22 14:47
sunkai 我是个新手。在有些地方概念不是很清楚,谢谢帮助我!
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-08-22 14:50
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白!
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-08-22 15:25
敲错了,是isr,中断服务例程,中断处理任务的执行体,恐怕你对单片机也陌生得很。太难为你了。

[编辑 -  8/22/02 by  sunkai]
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-08-22 15:44
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白!

这是我的习惯,也是以前那个项目实际要求,我的数据采集设备有两个pipe,一个bulk in,一个bulk out,bulk out用于从主机向设备发送采集,程控放大器模块的控制码,要求数据传到USB后立即发送控制信号到相应的模块,如果在TD_POLL()中的话,其中执行了大量的代码(向主机传输数据--bulk in),可能会有延时,所以就用中断服务程序来做,一接收到数据就在中断服务程序中处理。这样分开来也有利于程序模块化,看起来比较清晰。
CuiMing_73
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-08-23 13:20
sunkai
ezloader自动下载固件程序
需要注意哪些方面?
cuiming73@263.net 10101973@sina.com
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-08-23 13:35
我还想问问如何提高速度。象你那样读写分开做的话 是不是可以提高速度了。传图象速度要多高?
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-08-23 13:36
sunkai你能把你的代码让我看看吗?!谢谢你了!我是个新手。所以,比较费力。希望你能帮助我!
上一页
游客

返回顶部