最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

基于STM32的SDIO用4位總線24MHZDMA模式操作SHDC卡

出處:eefocus 發(fā)布于:2018-07-20 13:38:00

  發(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

  /* 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位總線),進入死循環(huán)。?;旧夏芡顺鲞@個函數(shù)就是因為出錯- -。庫忽略掉了這個延時,才導致這樣的結(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)。當然, 是在沒有配置為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ī)范里面并沒有仔細說明怎么切換總線模式,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卡

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!