打印

STM32F207中的SD卡必须使用外部时钟吗?

[复制链接]
4635|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lorelia14|  楼主 | 2012-6-5 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教版主,我在调试STM32F207对SD卡的操作时,发现原先一块电路板上使用外部时钟时,可以对卡片成功地进行初始化,但换了一块电路板,只能使用内部时钟时,则SD_CLK信号出不来。

由于两个板子有关SD接口都是相同的,采用的也是相同版本的程序。因此想问问,SD卡的控制是否一定要使用外部时钟?如果可以使用内部时钟,对内部时钟的配置有啥要求吗?
沙发
lorelia14|  楼主 | 2012-6-5 16:16 | 只看该作者
刚刚用支持外部时钟的电路板试验,将时钟强行配置成使用内部时钟,的确没有看到SD_CLK信号输出,不知道我的内部时钟配置是不是有问题呢?将内部时钟配置的代码贴出来,请高手指点一二吧:
static void SetSysClock(void)
{
/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* 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));

  //因为M3没有连接外部时钟,所以HSEStatus = 0x00
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }

  if (HSEStatus == (uint32_t)0x01)
  {
    /* HCLK = SYSCLK / 1*/
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK / 2*/
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
   
    /* PCLK1 = HCLK / 4*/
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;

    /* Configure the main PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

    /* Enable the main PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till the main PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_3WS;

    /* Select the main PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL;

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }
  }
  else  //因为没有接外部时钟,所以直接跳转到这里进行HSI的配置
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */

         /* Set HSION bit */
         RCC->CR |= (uint32_t)0x00000001;
                 
         /* Reset CFGR register */
         RCC->CFGR = 0x00000000;
                 
         /* Reset HSEON, CSSON and PLLON bits */
         RCC->CR &= (uint32_t)0xFEF6FFFF;
                 
//                 RCC->PLLCFGR = 0x24003010;
                 
         /* Reset PLLCFGR register */
         RCC->PLLCFGR = 0x25003C10;
            
         /* Reset HSEBYP bit */
         RCC->CR &= (uint32_t)0xFFFBFFFF;

  }

}

使用特权

评论回复
板凳
IJK| | 2012-6-5 17:38 | 只看该作者
SD卡的控制不必非要使用外部时钟。
系统时钟来自HSI,或者来自HSI+PLL应该都没有问题的。
当然,对SD卡初始化时SD_CLK 需要低于400kHz,这一点无论用什么时钟都需要遵守。

使用特权

评论回复
地板
lorelia14|  楼主 | 2012-6-6 09:24 | 只看该作者
我专门修改了有关SD卡初始化时的时钟配置,可是还是没有检测到SD_CLK,而且在执行SD_PowerON的程序时,运行下面的代码会因为超时退出,说明整个SDIO模块工作不正常,可又找不到原因。
  /*!< Power ON Sequence -----------------------------------------------------*/
  /*!< Configure the SDIO peripheral */
  /*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_INIT_CLK_DIV) */
  /*!< on STM32F2xx devices, SDIOCLK is fixed to 48MHz */
  /*!< SDIO_CK for initialization should not exceed 400 KHz */  
  SDIO_InitStructure.SDIO_ClockDiv = 0x12C;//SDIO_INIT_CLK_DIV;
  SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
  SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
  SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
  SDIO_Init(&SDIO_InitStructure);

  /*!< Set Power State to ON */
        while(1)
        {
          uint32_t status = SDIO_PowerState_ON;
    SDIO_SetPowerState(status);
                count++;
                if(status == SDIO_GetPowerState())
                        break;
                else if(count >= 0x00800000)
                        break;
        }
        count = 0;
  /*!< Enable SDIO Clock */
  SDIO_ClockCmd(ENABLE);

而在外部时钟下,就一点问题也没有,很奇怪呢。谁能再帮我解释呢?

使用特权

评论回复
5
lorelia14|  楼主 | 2012-6-6 10:28 | 只看该作者
问题解决了,还是和时钟配置有关。因为没有外接晶振,在使用内部晶振时,没有对PLL进行配置,PLL环路没有启动,没有PLL48CK,也就没有SD_CLK信号了。

使用特权

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

本版积分规则

0

主题

27

帖子

0

粉丝