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

有请sunkai!AN2131QC

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

最新喜欢:

yuri69yuri69
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-23 21:03
sunkai
ezloader自动下载固件程序
需要注意哪些方面?

ezuabw2k.inf你看过好多次吧,把ezmon.sys相关的部分全部当作是ezloader就成了。

[编辑 -  8/23/02 by  sunkai]
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-23 20:49
sunkai你能把你的代码让我看看吗?!谢谢你了!我是个新手。所以,比较费力。希望你能帮助我!

1,我不是学生,向你提供源代码有违规定,请谅解。
2,我不是用c51写的,我只会汇编。
3,新手费力那是自然,谁也不是天生熟手。不要操之过急,把技术资料该理解的地方看懂吧,不要说给你听都始终无法理解。没有必要的基础怎么行?
4,我一直在帮助你,前前后后我几乎把自己的东西讲了一遍。缺的应该是大思路,不是小技巧。
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-23 20:30
我还想问问如何提高速度。象你那样读写分开做的话 是不是可以提高速度了。传图象速度要多高?

速度受多方面因素的影响。
1,数据源提供数据的速度(外围硬件的速度)
2,数据进入端点的速度(固件的效率)
3,应用程序的问题(这个问题前面已经讨论过多次,很重要)
向主机方传数据只需考虑如何提高IN的速度,跟OUT何干,不要搅在一起。在firmware中能提高速度的技术本来就有:
1,fast transfer(iso bulk都有)。
2,endpoint pairing(双缓存乒乓使用)
3,autopointer(转移数据快)
至于编程技巧对速度的影响,应该有但不好评估。
速度要多高?你要去问你的图象转换芯片和你的老板。
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-23 20:07
sunkai
ezloader自动下载固件程序
需要注意哪些方面?

仅仅把firmware.c里的firmware[]的内容删掉,改为你的firmware就可以了。ezloader本身就只需要注意这一个问题,要想做到上电下载固件还有其他几个方面要做。
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-23 15:35
分开写嘛!这样做速度咋样!
我现在只会在TD_POLL()里做。读写在一起,速度不快。我是想有没有办法提高速度。还要说明的就是我没有用片子上的WR和RD 信号!是自己产生的!
algafly
驱动牛犊
驱动牛犊
  • 注册日期2001-11-27
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-08-23 15:27
我觉得你还是老老实实看看附带的例子里面的代码吧。里面有读写的过程,在isr中写in和out会好一点吧。
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-23 13:36
sunkai你能把你的代码让我看看吗?!谢谢你了!我是个新手。所以,比较费力。希望你能帮助我!
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-23 13:35
我还想问问如何提高速度。象你那样读写分开做的话 是不是可以提高速度了。传图象速度要多高?
CuiMing_73
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-23 13:20
sunkai
ezloader自动下载固件程序
需要注意哪些方面?
cuiming73@263.net 10101973@sina.com
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-22 15:44
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白!

这是我的习惯,也是以前那个项目实际要求,我的数据采集设备有两个pipe,一个bulk in,一个bulk out,bulk out用于从主机向设备发送采集,程控放大器模块的控制码,要求数据传到USB后立即发送控制信号到相应的模块,如果在TD_POLL()中的话,其中执行了大量的代码(向主机传输数据--bulk in),可能会有延时,所以就用中断服务程序来做,一接收到数据就在中断服务程序中处理。这样分开来也有利于程序模块化,看起来比较清晰。
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-22 15:25
敲错了,是isr,中断服务例程,中断处理任务的执行体,恐怕你对单片机也陌生得很。太难为你了。

[编辑 -  8/22/02 by  sunkai]
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-22 14:50
你说的ist 是啥意思?为啥把OUT 放在IST里。不太明白!
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:46
谢谢 sunkai 和 CuiMing_73  两位兄弟! 为啥不能在加分了!不好意思!
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于: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中断是一个集合,需要分开跳转。
CuiMing_73
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-08-22 10:39
但我现在倾向于使用默认端口
而且也得到了稳定的程序
但固件端我只能用ASM了
对于ASM我太菜了
cuiming73@263.net 10101973@sina.com
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-08-22 10:33
Thank a lot, CuiMing!
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-08-22 10:30
感觉和硬件没关系吧?(好象又不是由硬件产生中断)
拜托大家帮忙想些办法!
CuiMing_73
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
cuiming73@263.net 10101973@sina.com
上一页
游客

返回顶部