阅读:1200回复:11
metalwing,xxczsy123456,jinghuiren几位大侠,请教啦
大侠们好,小妹最近又遇到麻烦了。
我做host主机读写U盘,目前已经可以正确读写sl811寄存器和外部ram,但是下面这个函数中,用if(SL811Read(IntStatus)来查询设备是否准备好了,每次检测的结果都是设备尚未准备好,然后就不停的检测设备,请指点一下吧,我现在是束手无策。 &USB_RESET) unsigned char speed_detect() { int int0; unsigned char temp; SLAVE_FOUND = FALSE; // Clear USB device found flag FULL_SPEED = TRUE; // Assume full speed device HUB_DEVICE = FALSE; // not HUB device DATA_STOP = FALSE; SL811Write(cSOFcnt,0xAE); // Set SOF high counter, no change D+/D-, host mode SL811Write(CtrlReg,0x08); // Reset USB engine, full-speed setup, suspend disable DelayMs(10); // Delay for HW stablize SL811Write(CtrlReg,0x00); // Set to normal operation SL811Write(IntEna,0x61); temp=SL811Read(IntEna); // USB-A, Insert/Remove, USB_Resume. SL811Write(IntStatus,INT_CLEAR); // Clear Interrupt enable status // SL811Write(IntStatus,0xc1); DelayMs(100); // Delay for HW stablize if(SL811Read(IntStatus)&USB_RESET) { // test for USB reset SL811Write(IntStatus,INT_CLEAR);// Clear Interrupt enable status DelayMs(30); // Blink LED - waiting for slave USB plug-in return 0; // exit speed_detect() } if((SL811Read(IntStatus)&USB_DPLUS)==0) // Checking full or low speed如果不是全速的 { // ** Low Speed is detected ** // SL811Write(cSOFcnt,0xEE); // Set up host and low speed direct and SOF cnt SL811Write(cDATASet,0xE0); // SOF Counter Low = 0xE0; 1ms interval SL811Write(CtrlReg,0x21); // Setup 6MHz and EOP enable FULL_SPEED = FALSE; // low speed device flag } else { // ** Full Speed is detected ** // SL811Write(cSOFcnt,0xAE); // Set up host & full speed direct and SOF cnt SL811Write(cDATASet,0xE0); // SOF Counter Low = 0xE0; 1ms interval SL811Write(CtrlReg,0x05); // Setup 48MHz and SOF enable } SLAVE_FOUND = TRUE; // Set USB device found flag SLAVE_ENUMERATED = FALSE; // no slave device enumeration SL811Write(EP0Status,0x50); // Setup SOF Token, EP0 SL811Write(EP0Counter,0x00); // reset to zero count SL811Write(EP0Control,0x01); // start generate SOF or EOP DelayMs(25); // Hub required approx. 24.1mS SL811Write(IntStatus,INT_CLEAR); // Clear Interrupt status return 0; // exit speed_detect(); } 原理图如下 |
|
|
沙发#
发布于:2004-09-16 12:58
怎么都没有人理会啊。
|
|
|
板凳#
发布于:2004-09-16 16:25
我检测到设备了,但是是低速设备,还是不对的吧,u盘是全速设备的啊!
|
|
|
地板#
发布于:2004-09-16 19:04
这是你的固件程序吧?
|
|
|
地下室#
发布于:2004-09-20 12:13
这两天调试程序,这个问题已经解决了,检测到u盘是全速设备了,但是往下进行又出现问题了,头疼啊。
发送setup包的时候,传入sl811的数据缓冲区中顺利,但是枚举却不成功,getdescripter函数中调用usbXfer函数,读Ep0Statuse寄存器结果是D0,也就是说设备端点被禁止,设备忙,可是我把u盘插上去,是空闲的啊,怎么会这样? |
|
|
5楼#
发布于:2004-09-20 16:26
不理解你说的是什么意思.枚举没成功吗?可你不是说识别设备了吗?
|
|
|
6楼#
发布于:2004-09-22 10:28
只是识别出来是全速设备啊!而且我晕的还多着呢,调用函数的时候,常常会参数传递不过去,行参根本不和实参数值对应起来,而是有几个是对应的,有几个完全不对。
|
|
|
7楼#
发布于:2004-09-22 15:38
我刚把读写u盘做成功不久,也曾遇到过你的问题,请确认你的程序有没有严格按照HOST的启动时的配置?应相关资料不在身边无法帮你查看了,如有需要下次上网帮你解决,并有相关资料可MAIL给你
|
|
8楼#
发布于:2004-09-23 13:05
请确认你的程序有没有严格按照HOST的启动时的配置? 什么意思啊?我不懂啊,能把你的QQ留下吗?这样我好请教 |
|
|
9楼#
发布于:2004-09-23 18:35
我发送的setup包是80,06,0001,0000,1200,
进入usbXfer后发送给u盘,返回的结果是超时。都快把人磨死了, 我用的是12m的无缘晶振,没有办法啊,我没有48m的有缘晶振,请问是这个原因吗?请指教啊。 |
|
|
10楼#
发布于:2004-09-24 08:42
80,06,0001,0000,1200
是0100吧?不记得了. 我用的是12m的无缘晶振,没有办法啊,我没有48m的有缘晶振, 你这个晶振是哪的晶振? |
|
|
11楼#
发布于:2004-09-24 11:21
什么哪儿的晶振啊,我不知道啊,就是普通的那种,上面有12000字样
|
|
|