日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月19日(星期六)

2018年07月19日 | 基于STM32的SDIO用4位總線24MHZDMA模式操作SHDC卡

發(fā)布者:快樂心跳 來源: eefocus關(guān)鍵字:STM32  SDIO  SHDC卡 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

發(fā)現(xiàn)網(wǎng)上很多所謂的SDIO操作SHDC無意例外都是官方的那個爛玩意,完全沒有修改過,所以很多時候根本無法初始化SHDC,我也在網(wǎng)上看到很多人關(guān)于這部分的疑問,雖然STM32的SDIO的確是可以這樣操作。但是很佩服那群人,什么都沒改就發(fā)上來,把哥我害慘了。。。。
經(jīng)過查資料,追蹤,最后運氣可佳。我發(fā)現(xiàn)自己的金士頓4GSD卡(class4)不能初始化跟用4位總線dma操作的原因。。各位也可以上網(wǎng)去找別人的試試,很多人都說不能用4位總線操作,而且用1位總線也只能是在低速率以及開啟流控的情況下。而且經(jīng)常出錯。而4位總線總是提示沒有檢測到起始位。
但是他們都只會問,都沒有去想象為什么,我也是。。但是后來發(fā)現(xiàn)。STM32的SDIO是完全沒問題的,可以讀寫SHDC,用4位總線24MHZ工作在DMA模式,大家看我修改出來的例程就知道了。看我改過的地方,對比下官方的。
首先:
在配置的時候, 一開始的時候sd卡需要有至少發(fā)74個時鐘使它自己初始話,這是2.0規(guī)范要求的,但是你們自己看看官方的,完全沒有這個,我一直追蹤,發(fā)先在電源初始化那里就已經(jīng)卡住了- -|||。

于是我在那里面加入了一個發(fā)送74個時鐘的小代碼。

SD_Error SD_PowerON(void)
{
  SD_Error errorstatus = SD_OK;
  uint32_t response = 0, count = 0;
  bool validvoltage = FALSE;
  uint32_t SDType = SD_STD_CAPACITY;
  int16_t i = 0;
  /* Power ON Sequence -------------------------------------------------------*/
  /* Configure the SDIO peripheral */
  SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; /* HCLK = 72MHz, SDIOCLK = 72MHz, SDIO_CK = HCLK/(178 + 2) = 400 KHz */
  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 */
  SDIO_SetPowerState(SDIO_PowerState_ON);

  /* Enable SDIO Clock */
  SDIO_ClockCmd(ENABLE);

  /* CMD0: GO_IDLE_STATE -------------------------------------------------------*/
  /* No CMD response required */
  SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_GO_IDLE_STATE;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  for(;i < 74; i++)
  {
    SDIO_SendCommand(&SDIO_CmdInitStructure);
  CmdError();
 }

看到?jīng)]有,就是畫線的那個,這個用37也可以了。但是規(guī)范點用74、

接下來,自己初始化可以通過了,因為上電正確一般是可以初始化正常的,這個沒什么問題,到了這個函數(shù)就開始有問題了。

status = SD_SelectDeselect((u32) (SDCardInfo.RCA << 16));
  if (status != SD_OK) 
  {
   rt_kprintf("SD_SelectDeselect is  error./n");
   goto __return;
  }
  rt_kprintf("SD set to transfer mode./n");
  status = SD_EnableWideBusOperation(SDIO_BusWide_4b);

就是這個函數(shù),使能四位總線模式的函數(shù)。事實上,在經(jīng)過上一次的操作后,配置總線的時候我是這么配置的:

  SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV +5 ;
  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_Enable;
  SDIO_Init(&SDIO_InitStructure);

我發(fā)現(xiàn)加入流控是必須 的,避免出現(xiàn)數(shù)據(jù)出錯,因為這個模式很不穩(wěn)定,很多時候會出現(xiàn)overrun的錯誤,或者crc錯誤。這時候我們可以先不要調(diào)用SD_EnableWideBusOperation(SDIO_BusWide_4b);

這樣的話,其實我們是可以直接操作讀寫SHDC的,但是會發(fā)現(xiàn)不僅速度低,而且經(jīng)常出錯。這就是我為什么拼命要搞出四位總線的原因。

所以首先要SD_SelectDeselect((u32) (SDCardInfo.RCA << 16));命令選擇SD為傳送模式后,要再調(diào)用SD_EnableWideBusOperation(SDIO_BusWide_4b)配置總線為四位總線模式;這是為了能夠以更快的速度讀取SHDC卡。事實上這個函數(shù)是有問題的。傳送是命令是沒有問題的,但是判斷依據(jù)問題不小。

大家看我的代碼

SD_Error SD_EnableWideBusOperation(u32 WideMode)
{
  SD_Error errorstatus = SD_OK;

  /* MMC Card doesn't support this feature */
  if (SDIO_MULTIMEDIA_CARD == CardType)
  {
    errorstatus = SD_UNSUPPORTED_FEATURE;
 rt_kprintf("SD unsupported feature./n");
    return(errorstatus);
  }
  else if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
  {
    if (SDIO_BusWide_8b == WideMode)
    {
      errorstatus = SD_UNSUPPORTED_FEATURE;
   rt_kprintf("SD unsupported feature./n");
      return(errorstatus);
    }
    else if (SDIO_BusWide_4b == WideMode)
    {
      errorstatus = SDEnWideBus(ENABLE);

      if (SD_OK == errorstatus)
      {
        /* Configure the SDIO peripheral */
        SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_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_4b;
        SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
        SDIO_Init(&SDIO_InitStructure);
      }
   else 
    rt_kprintf("SD enable wide bus fail./n");
    }
    else
    {
      errorstatus = SDEnWideBus(DISABLE);

      if (SD_OK == errorstatus)
      {
        /* Configure the SDIO peripheral */
        SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_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);
      }
   else 
    rt_kprintf("SD disable wide bus fail./n");
    }
  }

  return(errorstatus);
}

注意到這個函數(shù)SDEnWideBus(ENABLE);

 

static SD_Error SDEnWideBus(FunctionalState NewState)
{
  SD_Error errorstatus = SD_OK;

  uint32_t scr[2] = {0, 0};

    

  if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  {
    errorstatus = SD_LOCK_UNLOCK_FAILED;
 rt_kprintf("sd locke unlock faile:in line 2537./n");
    return(errorstatus);
  }

  /* Get SCR Register */
  errorstatus = FindSCR(RCA, scr);

/*首先注意到這個函數(shù)這個函數(shù)會卡到。*/

  if (errorstatus != SD_OK)
  {
   rt_kprintf("get scr register error:in line4 2547./n");
    return(errorstatus);
  }

  /* If wide bus operation to be enabled */
  if (NewState == ENABLE)
  {
    /* If requested card supports wide bus operation */
  //  if ((scr[1] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO)
  //  {
      /* Send CMD55 APP_CMD with argument as card's RCA.*/
      SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp1Error(SDIO_APP_CMD);

      if (errorstatus != SD_OK)
      {
    rt_kprintf("send card rca fail: in line 2568./n");
        return(errorstatus);
      }

      /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
      SDIO_CmdInitStructure.SDIO_Argument = 0x2;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_SD_SET_BUSWIDTH;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp1Error(SDIO_APP_SD_SET_BUSWIDTH);

      if (errorstatus != SD_OK)
      {
    rt_kprintf("send wide bus mode fail: in line 2586./n");
        return(errorstatus);
  
      }
      return(errorstatus);
   // }
  //  else
 //   {
 //     errorstatus = SD_REQUEST_NOT_APPLICABLE;
//   rt_kprintf("sd reques no applicable : in line 2592./n");
//      return(errorstatus);
 //   }
  }   /* If wide bus operation to be disabled */
  else
  {
    /* If requested card supports 1 bit mode operation */
    if ((scr[1] & SD_SINGLE_BUS_SUPPORT) != SD_ALLZERO)
    {
      /* Send CMD55 APP_CMD with argument as card's RCA.*/
      SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);


      errorstatus = CmdResp1Error(SDIO_APP_CMD);

      if (errorstatus != SD_OK)
      {
    rt_kprintf("send wide bus mode fail: in line 2586./n");
        return(errorstatus);
      }

      /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
      SDIO_CmdInitStructure.SDIO_Argument = 0x00;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_SD_SET_BUSWIDTH;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp1Error(SDIO_APP_SD_SET_BUSWIDTH);

      if (errorstatus != SD_OK)
      {
    rt_kprintf("send wide bus mode fail: in line 2586./n");
        return(errorstatus);
      }

      return(errorstatus);
    }
    else
    {
      errorstatus = SD_REQUEST_NOT_APPLICABLE;
   rt_kprintf("sd reques no applicable : in line 2592./n");
      return(errorstatus);
    }
  }
}

 

static SD_Error FindSCR(uint16_t rca, uint32_t *pscr)
{
  uint32_t index = 0;
  SD_Error errorstatus = SD_OK;
  uint32_t tempscr[2] = {0, 0};
  uint16_t delay_time;
  /* Set Block Size To 8 Bytes */
  /* Send CMD55 APP_CMD with argument as card's RCA */
  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)8;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);

  if (errorstatus != SD_OK)
  {
   rt_kprintf("send card rca fail :in line 2829./n");
    return(errorstatus);
  }

  /* Send CMD55 APP_CMD with argument as card's RCA */
  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SDIO_APP_CMD);

  if (errorstatus != SD_OK)
  {
   rt_kprintf("send rca fail:in line 2845./n");
    return(errorstatus);
  }
  SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  SDIO_DataInitStructure.SDIO_DataLength = 8;
  SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_8b;
  SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
  SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  SDIO_DataConfig(&SDIO_DataInitStructure);

  /*經(jīng)過測試,發(fā)現(xiàn)原來沒有反應(yīng)或者出錯是因為缺少必要的處理時間,我這里是慢慢調(diào)試出來的比較理想的延時。  大家可以試試不加,有的卡運氣好的可能通過了,但是不好的- -肯定沒有數(shù)據(jù)。。??赡苁强纯ǖ馁|(zhì)量吧,我只試過我的SD卡,不敢定論*/

for(delay_time = 0; delay_time < 20; delay_time++)
   __nop();
  
  //SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
  SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_SEND_SCR;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SDIO_SD_APP_SEND_SCR);

  if (errorstatus != SD_OK)
  {
   rt_kprintf("cmd Resp1 error : in line 2870./n");
    return(errorstatus);
  }

  while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR
   )))
  {
    if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
    {
      *(tempscr + index) = SDIO_ReadData();
      index++;
   if (index == 2)
     break;
    }
  }

  if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
    errorstatus = SD_DATA_TIMEOUT;
 rt_kprintf("sd data timeout : inline 2886./n");
    return(errorstatus);
  }
  else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
    errorstatus = SD_DATA_CRC_FAIL;
 rt_kprintf("sd data fail : inline 2886./n");
    return(errorstatus);
  }
  else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
    errorstatus = SD_RX_OVERRUN;
 rt_kprintf("sd rx overrun : inline 2886./n");
    return(errorstatus);
  }
  else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_STBITERR);
    errorstatus = SD_START_BIT_ERR;
 rt_kprintf("sd can't not find start bit : inline 2886./n");
    return(errorstatus);
  }

  /* Clear all the static flags */
  SDIO_ClearFlag(SDIO_STATIC_FLAGS);

  *(pscr + 1) = ((tempscr[0] & SD_0TO7BITS) << 24) | ((tempscr[0] & SD_8TO15BITS) << 8) | ((tempscr[0] & SD_16TO23BITS) >> 8) | ((tempscr[0] & SD_24TO31BITS) >> 24);

  *(pscr) = ((tempscr[1] & SD_0TO7BITS) << 24) | ((tempscr[1] & SD_8TO15BITS) << 8) | ((tempscr[1] & SD_16TO23BITS) >> 8) | ((tempscr[1] & SD_24TO31BITS) >> 24);

  return(errorstatus);
}

看上面這個函數(shù)的里面的彩色代碼。那個是我自己添加的,正如我所說的,官方的SDcard文件忽視了sd卡自己處理所需要的延時問題。我在這里面發(fā)現(xiàn),如果不加入我這個延時,基本上,如果不先對SDIO_FLAG_STBITER置位的話,就會報錯(一開始初始化成四位總線的,),要嘛沒有反應(yīng)(1位總線),進(jìn)入死循環(huán)。?;旧夏芡顺鲞@個函數(shù)就是因為出錯- -。官方庫忽略掉了這個延時,才導(dǎo)致這樣的結(jié)果(所以BS那些只拿官方的東西直接忽悠我們騙點數(shù)的人)。

再注意下下一個彩色代碼

   if (index == 2)
     break;

知道為什么要等于2就退出嗎?因為定義index的時候初始值是0,但是你們自己追蹤下,事實上發(fā)送這條命令只會返回兩個數(shù)據(jù), 我的返回的是兩個0.而返回兩個數(shù)據(jù)后基本總線就沒反映了,成了死循環(huán)- -(至少我的卡是這樣, 別人的卡我就不知道了,不過市面的SHDC卡大多買的都是金士頓的吧?不知道我的金士頓卡有沒有代表性。)

基本上這樣是能正常退出的,如果你們的卡不行,試著再降低下頻率,我發(fā)現(xiàn)我的金士頓4G(class4)只有在小于12MHZ的一位總線下才有反應(yīng)。當(dāng)然, 是在沒有配置為4位總線前?;旧线@個函數(shù)就到這里,接著再返回SDEnWideBus(FunctionalState NewState)函數(shù)看下里面的以下代碼

 

static SD_Error SDEnWideBus(FunctionalState NewState)
{
  SD_Error errorstatus = SD_OK;

  uint32_t scr[2] = {0, 0};

    

  if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  {
    errorstatus = SD_LOCK_UNLOCK_FAILED;
 rt_kprintf("sd locke unlock faile:in line 2537./n");
    return(errorstatus);
  }

  /* Get SCR Register */
  errorstatus = FindSCR(RCA, scr);

/*首先注意到這個函數(shù)這個函數(shù)會卡到。*/

  if (errorstatus != SD_OK)
  {
   rt_kprintf("get scr register error:in line4 2547./n");
    return(errorstatus);
  }

  /* If wide bus operation to be enabled */
  if (NewState == ENABLE)
  {
    /* If requested card supports wide bus operation */
  //  if ((scr[1] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO)
  //  {
      /* Send CMD55 APP_CMD with argument as card's RCA.*/
      SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp1Error(SDIO_APP_CMD);

      if (errorstatus != SD_OK)
      {
    rt_kprintf("send card rca fail: in line 2568./n");
        return(errorstatus);
      }

      /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
      SDIO_CmdInitStructure.SDIO_Argument = 0x2;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_SD_SET_BUSWIDTH;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp1Error(SDIO_APP_SD_SET_BUSWIDTH);

      if (errorstatus != SD_OK)
      {
    rt_kprintf("send wide bus mode fail: in line 2586./n");
        return(errorstatus);
  
      }
      return(errorstatus);
   // }
  //  else
 //   {
 //     errorstatus = SD_REQUEST_NOT_APPLICABLE;
//   rt_kprintf("sd reques no applicable : in line 2592./n");
//      return(errorstatus);
 //   }
  }   /* If wide bus operation to be disabled */

彩色的這些都是注釋掉的呵,因為,事實上, findsrc函數(shù)返回的結(jié)果本身我就不知道是否是正確的,而且在sd2.0規(guī)范里面并沒有仔細(xì)說明怎么切換總線模式,z只是要求先判斷是否是傳輸模式,接著是否是上鎖,之后就可以直接用CMD6修改總線操作模式了,所以至今沒發(fā)現(xiàn)findsrc這個函數(shù)的作用。另外在規(guī)范里面我也沒有找到提及findsrc這個函數(shù)的。于是直接忽略,將判斷去掉,直接就設(shè)置成四位總線24MHZ,一開始不行, 我就降低頻率,出現(xiàn)跟原來一樣的反應(yīng),再降到12MHZ,突然有數(shù)據(jù)了, 于是又慢慢調(diào)試, 升到24MHZ,可以正常讀寫了?;旧细牡木褪沁@兩個地方。其它地方因為目前沒有研究的更深入沒有發(fā)現(xiàn)問題,暫時就不改了。

至此,我已經(jīng)可以用STM32的SDIO4位總線DMA模式讀寫SHDC卡了。經(jīng)過測試,可以用文件系統(tǒng)讀寫文件, 創(chuàng)建文件夾,但是不能替換文件名- -,肯能是文件系統(tǒng)有問題。

附上我用的例程是rt_thread的文件系統(tǒng), 算是為它小小宣傳下,可能大家會用到, 基于MDK的rt_thread.工程在目錄的bsp/stm32/里面。


關(guān)鍵字:STM32  SDIO  SHDC卡 引用地址:基于STM32的SDIO用4位總線24MHZDMA模式操作SHDC卡

上一篇:STM32CubeMX的SDIO模式下對SD卡讀寫測試
下一篇:STM32 TFT學(xué)習(xí)筆記——SD卡讀寫

推薦閱讀

2017年,智能制造的技術(shù)和成本條件都日趨成熟,加上勞動力成本的進(jìn)一步提高,智能制造愈發(fā)獲得眾多制造業(yè)企業(yè)的關(guān)注。在通向智能制造的道路上,工業(yè)自動化是必須經(jīng)歷的階段。在2018年,工業(yè)自動化領(lǐng)域又將有哪些新動態(tài),十位該領(lǐng)域領(lǐng)先企業(yè)負(fù)責(zé)人和專家學(xué)者做出了自己的預(yù)測。施耐德電氣:物聯(lián)網(wǎng)的經(jīng)濟(jì)意義堪比工業(yè)革命在調(diào)查了12個國家的3000名商界精英對...
近日,美資代工巨頭偉創(chuàng)力陷入輿論漩渦之中。其位于長沙望城經(jīng)濟(jì)開發(fā)區(qū)的工廠已停產(chǎn),甚至被爆:已遭華為踢出供應(yīng)鏈體系…… 斷供華為1個月不到便被迫停產(chǎn) 據(jù)知情人士透露,自2019年3月開始,偉創(chuàng)力長沙一期項目的生產(chǎn)已經(jīng)遭遇困頓。2019年5月,偉創(chuàng)力長沙工廠就已停產(chǎn)。而偉創(chuàng)力長沙工廠停產(chǎn)的主要原因則是受“美國對華為禁令”的影響,因為偉創(chuàng)力長沙工...
最近摸了好久,發(fā)現(xiàn)這個東西真的難,MHCP 這套16bit 體系flash的擦寫操作,分為ICSP和RTSP兩種方式,前者就是常見的官方pickit/ICD編程燒寫操作時序。而后者是為bootload或者數(shù)據(jù)保存自擦寫準(zhǔn)備的,運行過程中的擦寫操作。RTSP flash讀很簡單,速度也很快。但是RTSP擦寫就是各種坑了??戳司幊淌謨院蚫atasheet發(fā)現(xiàn)這貨在寫入之前必須進(jìn)行擦除操作,而...
  7月16日,蜂巢能源在江蘇舉行了首款無鈷電池量產(chǎn)下線儀式。這意味著全球首款無鈷電池走出實驗室,正式實現(xiàn)量產(chǎn),蜂巢能源由此成為全球首家突破無鈷電池技術(shù)難關(guān),成功實現(xiàn)產(chǎn)品量產(chǎn)的動力電池企業(yè)。   本次量產(chǎn)下線的無鈷電池是一款能量密度為240wh/kg,容量為115Ah-MEB產(chǎn)品。該款電池具有高安全性、高能量密度、高循環(huán)壽命和低成本的核心優(yōu)勢。...

史海拾趣

問答坊 | AI 解惑

常見的嵌入式操作系統(tǒng)

DOS     微軟一開始選用了派特森的Q-DOS “QUICK AND DISK OPERATING SYSTEM ”為基礎(chǔ)然后再擴(kuò)充功能而成 MS-DOS,主要是采用由IBM 提供的使用8088 微處理器的計算機(jī)作開發(fā)平臺,它是以16 字節(jié)單人單工操作系統(tǒng),特別適合一些功能簡單 ...…

查看全部問答∨

請教關(guān)于PXA270喚醒源的設(shè)置

專家好:    我的PDA前兩天在公司測試部門發(fā)現(xiàn),按鍵進(jìn)入深度休眠后,不能馬上按鍵喚醒,只有等5~6秒(大約值)后才能馬上喚醒 我的按鍵休眠是設(shè)置的GPIO0,喚醒源也是GPIO0 具體的設(shè)置如下:          &nbs ...…

查看全部問答∨

wince5.0的中斷向量地址問題

shuiyan 大哥你好!  小弟最近在搞OAL里的中斷函數(shù)OALTimerInit遇到個問題,是這樣的:  我在private下的armtrap.s里發(fā)現(xiàn)了中斷的異常跳轉(zhuǎn)表 VectorInstructions         ldr     pc, [p ...…

查看全部問答∨

如何在win ce下設(shè)置圖片的3D凸起效果?(C#) 謝謝了!

如何在win ce下設(shè)置圖片的3D凸起效果?(C#) 謝謝了!…

查看全部問答∨

touch panel驅(qū)動 奇怪問題!

本人把wince6.0下的DeviceEmulator改到我的2440的開發(fā)板上運行,因為DeviceEmulator是基于2410的,現(xiàn)在改到2440下改動也不是太大, 目前wince6.0的桌面已經(jīng)可以顯示出來了,但是觸摸屏卻一直動不了,后來跟蹤發(fā)現(xiàn)觸摸屏驅(qū)動已經(jīng)加載,而且第一次點 ...…

查看全部問答∨

不好意思,問一下這個問題:-sh: ./helloworld: not found

我是一名初學(xué)者,今天終于完成了博創(chuàng)S3C2410上Linux 2.6.22的移植,網(wǎng)卡,文件系統(tǒng)都能正常使用,感覺蠻有成就感的。 但如今這個問題不知道如何解決了: 用編譯內(nèi)核和Busybox 1.5.1的編譯器編譯了一個helloworld,在開發(fā)板上用NFS掛載上,運行./hello ...…

查看全部問答∨

全球首個太空機(jī)器人

$(\'swf_vSx\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://www.tudou.com/v/IJy11e9LXmk/v.swf\'), \'quality\', ...…

查看全部問答∨

Quartus II的用法

我寫了兩段不同的verilog代碼來實現(xiàn)同一個功能,現(xiàn)在我想比較哪個代碼在FPGA上跑的更快,我在Quartus II里如何看出來呢,請各位指導(dǎo)我一下,謝謝?!?

查看全部問答∨

jlink v8識別不了LPC2148

用jlink V8給目標(biāo)板提供3.3V電壓,就是把jlink 里面的跳線帽插到3.3V pin上然后連接 2148,一直這樣提示,試了兩個2148了,都是這樣的提示我如果用目標(biāo)板自己的電源,也是同樣的提示Feature(s): RDI,FlashDL,FlashBP,JFlash,GDBFullVTarget = 3.300 ...…

查看全部問答∨

紅外接收頭的問題

目的:制作一個模塊,該模塊能檢測紅外發(fā)射管發(fā)出的紅外線,波長為940nm,紅外接收頭型號為IRM-3638,當(dāng)有接收頭接收到紅外光,那么模塊上的LED燈就亮 我畫的電路圖如下:     但是我的板子沒有達(dá)到預(yù)期目標(biāo),LED燈不亮,接收頭沒有 ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved