打印

STM32F105 USB HOST

[复制链接]
8978|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wpcyd|  楼主 | 2013-5-13 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用105 的host做读写U盘,能够识别U盘,可是在枚举的时候总是不成功,用的ST的官方例程库stm32_f105-07_f2_f4_usb-host-device_lib,用的8MHz晶振,在获取前8位描述符时,退出进入
case HOST_CTRL_XFER:
    /* process control transfer state machine */
    USBH_HandleControl(pdev, phost);   
    break;
然后就一直在这里循环,我看帖子中好多说只要修改时钟就可以,我的系统时钟已经修改成了72MHz,请问USB的时钟在哪里修改,高手指教,小女子不胜感激。
沙发
cjhk| | 2013-5-13 20:00 | 只看该作者
这一块不是很了解   楼主  帮你顶一个  看看有没有高手能解决这个问题  

使用特权

评论回复
板凳
gurong60| | 2013-5-13 20:05 | 只看该作者
需要修改俩个地方,第一是系统定义的外部时钟由25000000改为8000000
还有个是,在定义72M时,有个/5*8的运算,修改成/2*10

使用特权

评论回复
地板
gurong60| | 2013-5-13 20:06 | 只看该作者
如果能识别U盘,说明枚举成功,晶振也没问题

使用特权

评论回复
5
wpcyd|  楼主 | 2013-5-13 20:45 | 只看该作者
gurong60 发表于 2013-5-13 20:05
需要修改俩个地方,第一是系统定义的外部时钟由25000000改为8000000
还有个是,在定义72M时,有个/5*8的运 ...

你说的这两个地方我都改了,我贴个代码吧
//#define SYSCLK_FREQ_HSE    HSE_VALUE
//#define SYSCLK_FREQ_24MHz  24000000
//#define SYSCLK_FREQ_36MHz  36000000
//#define SYSCLK_FREQ_48MHz  48000000
//#define SYSCLK_FREQ_56MHz  56000000
#define SYSCLK_FREQ_72MHz  72000000


static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

    /* Configure PLLs ------------------------------------------------------*/
    ///* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
   
   
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
}
#endif
那个外部时钟我也改了
#if !defined  HSE_VALUE
// #ifdef STM32F10X_CL   
  //#define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
//#else
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
// #endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

使用特权

评论回复
6
wpcyd|  楼主 | 2013-5-13 20:55 | 只看该作者
gurong60 发表于 2013-5-13 20:06
如果能识别U盘,说明枚举成功,晶振也没问题

就是说现在插上U盘能够检测进入HOST_DEV_ATTACHED,之后也能够进入枚举,然后在获取前8位描述符不成功,跳出程序进入
case HOST_CTRL_XFER:
    /* process control transfer state machine */
    USBH_HandleControl(pdev, phost);   
    break;
就是什么设置地址,配置描述符还都没进行。
我看很多人说USB需要配置成48MHz,这个需要在哪里改啊?系统时钟72MHz我已经配置好了

使用特权

评论回复
7
jiangrf| | 2013-5-14 17:50 | 只看该作者
试试用附件中的文件更新一下lib里的文件

stm32_usb.zip

8.95 KB

使用特权

评论回复
8
cjhk| | 2013-5-14 18:53 | 只看该作者
还是楼主 给力  不错   顶一个   呵呵   不错的例程

使用特权

评论回复
9
wpcyd|  楼主 | 2013-5-14 21:38 | 只看该作者
jiangrf 发表于 2013-5-14 17:50
试试用附件中的文件更新一下lib里的文件

不行啊,就是枚举不成功,能够检测U盘在全速状态,就是获取不了描述符。跳出程序进入
case HOST_CTRL_XFER:
    /* process control transfer state machine */
    USBH_HandleControl(pdev, phost);   
    break;
一直里面循环。

使用特权

评论回复
10
jiangrf| | 2013-5-15 11:04 | 只看该作者
那就换个型号的U盘试试,有些U盘不支持初始化时的bulk only transfer reset而造成死循环,我给的代码应该解决了这个问题

使用特权

评论回复
11
wpcyd|  楼主 | 2013-5-15 11:15 | 只看该作者
jiangrf 发表于 2013-5-15 11:04
那就换个型号的U盘试试,有些U盘不支持初始化时的bulk only transfer reset而造成死循环,我给的代码应该解 ...

我现在都糊涂了,我是需要直接向U盘里写东西,我怎么看很多资料都是用的MINI接口,这样的话怎么能够插U盘呢,还有我用了好2种U盘,爱国者的2G,金士顿的4G,效果一样,我怀疑是不是硬件有问题啊

使用特权

评论回复
12
jiangrf| | 2013-5-16 15:23 | 只看该作者
你用的时钟是外部的,还是内部的?

使用特权

评论回复
13
香水城| | 2013-5-16 17:41 | 只看该作者
USB FS OTG模块的时钟要求是48MHz,为了确保LZ产生了正确时钟,那么根据STM32F1用户手册中,章节8.2中的时钟树框图,你可以通过MCO引脚(PA8)输出PLLCLK/2信号,来确定PLLCLK的频率,然后检查RCC_CFGR寄存器的第22位“OTGFSPRE“,以此计算框图中的OTGFSCLK是否是48MHz。

因此LZ需要动用示波器看MCO输出波形的频率,以及调试时检查如上寄存器的配置位

使用特权

评论回复
14
grasswolfs| | 2013-5-16 18:28 | 只看该作者
看到香版主回复就顿觉楼主离成功应该很近了

使用特权

评论回复
15
cjhk| | 2013-5-16 18:46 | 只看该作者
学习帖子   需要好好消化一下   看到版主的回答   感觉版主   很给力    我还需要好好磨练磨练

使用特权

评论回复
16
wpcyd|  楼主 | 2013-5-20 16:04 | 只看该作者
总结一下,是因为在焊东西的时候有一块锡弄在了USB底座上面,所以造成一直循环,现在是枚举成功了
继续下一步的进展。

使用特权

评论回复
17
sf116| | 2014-9-23 22:18 | 只看该作者
标记下

使用特权

评论回复
18
jack123465| | 2015-4-29 16:33 | 只看该作者
wpcyd 发表于 2013-5-20 16:04
总结一下,是因为在焊东西的时候有一块锡弄在了USB底座上面,所以造成一直循环,现在是枚举成功了
继续下一 ...

楼主的问题解决了?在好几个帖子上面都发现了楼主的脚印,我也是遇到这个问题了,方不方便讨论一下具体的解决方法?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

25

帖子

0

粉丝