zhaoyao164
驱动牛犊
驱动牛犊
  • 注册日期2008-04-15
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1363回复:5

求助关于sl811驱动,目前不能枚举通过

楼主#
更多 发布于:2008-04-16 19:27
我使用的是LPC2134+SL811HST。现在问题是枚举不能通过,具体情况如下:

1。晶振试过12M和48M的有源晶振,并且相应调整过CM的电平,都不能通过

2。除了前面16个功能寄存器,后面的200多个寄存器读写是正确的。

3。u盘插上后,有时候能识别到,有时候识别不到,无盘时,中断状态一直是0x40。

插着U盘不拔,复位cpu后,可以看到IntStatus是0x00,这时候就可以进入识别到U盘了。

4。由于 中断状态是0x00,所以下面语句没有执行。应该是没有产生SOF信号。

 i=SL811Read(IntStatus);
 if(i&0x80)
 {  
   SL811Write(cDATASet,0xe0);
  SL811Write(cSOFcnt,0xae);
  SL811Write(CtrlReg,0x01);//devide whether it is a full speed device.zhshy old 0x05
 }

但是,即使我在此处设置端点,改掉i的值,强制进去开启SOF。

也一样不能产生SOF信号。D+上面没有测到脉冲。


5。枚举传输数据后,有时候是传输超时,有时候就一直不能跳出以下的条件判断。
如果强制要求产生sof信号,就出现传输超时,否则就是一直等不到传输完成。

   intr = SL811Read(IntStatus);      // wait for interrupt to be done, and
   if((intr & USB_RESET) || (intr & INSERT_REMOVE)) // proceed to parse result from slave
   {             // device.
    USB_Control.DATA_STOP = TRUE;     // if device is removed, set DATA_STOP
    return FALSE;         // flag true, so that main loop will
   }             // know tis condition and exit gracefully
   if(intr & USB_A_DONE)        
    break;           // interrupt done !!!


6。我的U盘不是朗克的,但是已经尝试了至少3种U盘,测试的结果都如上面所述。

现在猜测出现问题的可能原因:
1。 晶振
2。 U盘
3。 难道是LPC2134????
4。 。。。。。。。。。。。。。。。
实在不知道问题出现在哪里了,各位做过的xdjm来帮帮忙亚!
jtyytj
驱动牛犊
驱动牛犊
  • 注册日期2008-03-31
  • 最后登录2009-06-23
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-21 22:02
试试容量较小的U盘(Full Speed).
yyouking
驱动老牛
驱动老牛
  • 注册日期2003-12-18
  • 最后登录2020-04-28
  • 粉丝0
  • 关注0
  • 积分967分
  • 威望114点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2008-04-22 08:56
1。晶振用48M的有源晶振,设置
void SL811_Init(void)
{
    SL811Write(cDATASet,0xe0);
    SL811Write(cSOFcnt,0xae);
    SL811Write(CtrlReg,0x5);
            
    SL811Write(EP0Status,0x50);
    SL811Write(EP0Counter,0);
    SL811Write(EP0Control,0x01);
            
    
    SL811Write(IntEna,0x20);              // USB-A, Insert/Remove, USB_Resume.
    SL811Write(IntStatus,INT_CLEAR);    // Clear Interrupt enable status
}
2、把U盘格式化为FAT16格式的试试,最好是完全格式化。
提供: AT89S52+D12开发套件 W78E54+Sl811HST单片机读写U盘套件 PL2303HX-串口转USB 网站http://www.devking.cn 联系 sl811hs@yahoo.com.cn QQ:14441292
zhaoyao164
驱动牛犊
驱动牛犊
  • 注册日期2008-04-15
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-04-23 18:13
x 谢谢两位大哥,我试一下格式化FAT16,然后改一下init函数,再试,消息随时汇报
zhaoyao164
驱动牛犊
驱动牛犊
  • 注册日期2008-04-15
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-30 11:38
目前的情况:
1.关于48M有源晶振,
更换上以后,我用示波器测量晶振的输出。
测到波形是不对的,5V的晶振,结果波幅峰值大概2.2V,谷值1.6V左右吧,频率也不对。
由于示波器测量范围是最高25MHz的,所以频率不正确可以理解,但是波幅为什么
不正确呢。
但是,我更换为12M有源晶振时候,波幅频率都是正确的。
因此,最终选择的是12M有源晶振。

2.关于不能辨认到U盘插入和拔出。
发现原因在于SL811的初始化。
如果初始化为全速模式,即SL811Write(CtrlReg,0x5);
则不能辨认到U盘。
而如果初始化为低速模式,即SL811Write(CtrlReg,0x20);
则能辨认到U盘插拔。
因此我初始化为低速模式。

3. 辨认到u盘后,继续进行枚举。
发送80 06 00 01 00 00 12 00.
结果一直不能等到传输完成,或者传输超时的中断标志。
就是等待在以下代码处。
  intr = SL811Read(IntStatus);      // wait for interrupt to be done, and
  if((intr & USB_RESET) || (intr & INSERT_REMOVE)) // proceed to parse result from slave
  {            // device.
    USB_Control.DATA_STOP = TRUE;    // if device is removed, set DATA_STOP
    return FALSE;        // flag true, so that main loop will
  }            // know tis condition and exit gracefully
  if(intr & USB_A_DONE)        
    break;          // interrupt done !!!

4.在测试过程中,我在D+线上面没有测量到任何脉冲。即SOF
JJADKT
驱动牛犊
驱动牛犊
  • 注册日期2007-11-30
  • 最后登录2009-05-25
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望46点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-06-10 10:39
SL811Write(EP0Control,0x01); 这里就没开启SOF吧。那当然就测不到了。
游客

返回顶部