發(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/里面。
上一篇:STM32CubeMX的SDIO模式下對SD卡讀寫測試
下一篇:STM32 TFT學(xué)習(xí)筆記——SD卡讀寫
推薦閱讀
史海拾趣
在競爭激烈的電子行業(yè)中,Conflux始終保持對技術(shù)創(chuàng)新的追求。公司團(tuán)隊不斷研發(fā)新的區(qū)塊鏈應(yīng)用場景,如供應(yīng)鏈管理、物聯(lián)網(wǎng)安全等。通過將這些技術(shù)應(yīng)用于實際業(yè)務(wù)中,Conflux不僅提升了自身的競爭力,也推動了整個電子行業(yè)的進(jìn)步。同時,公司還積極參與國際技術(shù)交流和合作,不斷引進(jìn)國際先進(jìn)理念和技術(shù),為公司的持續(xù)創(chuàng)新提供了有力支持。
歌普電子科技有限公司以自有品牌(GEPU歌普)創(chuàng)立于2006年,公司最初在臺灣設(shè)立,隨后逐步擴(kuò)展至江蘇和東莞,形成了跨區(qū)域的研發(fā)、生產(chǎn)和銷售網(wǎng)絡(luò)。公司自創(chuàng)立之初便專注于各式線對板連接器、板對板連接器、網(wǎng)絡(luò)連接器等產(chǎn)品的研發(fā)與設(shè)計。通過不斷的技術(shù)積累和市場需求洞察,歌普逐漸在連接器領(lǐng)域建立了自己的市場地位。
AINFO Inc公司在初創(chuàng)期便明確了其在電子行業(yè)中的技術(shù)發(fā)展方向和市場定位。公司注重技術(shù)積累,投入大量資源進(jìn)行研發(fā),逐步在某一領(lǐng)域取得了技術(shù)突破。同時,公司對市場進(jìn)行了深入調(diào)研,確定了目標(biāo)客戶群體和市場需求,為后續(xù)的產(chǎn)品開發(fā)和市場推廣打下了堅實基礎(chǔ)。
在電子行業(yè)快速發(fā)展的背景下,Carlisle Interconnect Components公司始終將技術(shù)研發(fā)和持續(xù)創(chuàng)新作為公司發(fā)展的核心動力。公司投入大量資源用于研發(fā)新型連接器技術(shù),不斷推出具有更高性能、更小型化、更智能化的產(chǎn)品。這些創(chuàng)新產(chǎn)品的問世,不僅為公司帶來了更多的市場機(jī)遇,更推動了整個電子連接器行業(yè)的進(jìn)步。
進(jìn)入新世紀(jì),電子行業(yè)的技術(shù)更新?lián)Q代速度加快。AB Connectors Ltd意識到,只有不斷創(chuàng)新才能在激烈的市場競爭中立足。于是,公司加大了研發(fā)投入,組建了一支高素質(zhì)的研發(fā)團(tuán)隊,專注于連接器技術(shù)的創(chuàng)新。經(jīng)過多年的努力,AB Connectors Ltd成功開發(fā)出了一系列具有自主知識產(chǎn)權(quán)的新型連接器產(chǎn)品,不僅提高了產(chǎn)品的性能和質(zhì)量,還降低了生產(chǎn)成本。這些創(chuàng)新產(chǎn)品為公司贏得了眾多客戶的青睞,進(jìn)一步鞏固了市場地位。
隨著公司的發(fā)展,璟德(ACX)在LTCC技術(shù)的研發(fā)上取得了重大突破。這些突破不僅提升了產(chǎn)品的性能和質(zhì)量,也為公司贏得了多項國內(nèi)外專利。這些專利的獲取進(jìn)一步鞏固了璟德(ACX)在無線通信領(lǐng)域的領(lǐng)先地位,也為其后續(xù)的市場拓展提供了有力支持。
DOS 微軟一開始選用了派特森的Q-DOS “QUICK AND DISK OPERATING SYSTEM ”為基礎(chǔ)然后再擴(kuò)充功能而成 MS-DOS,主要是采用由IBM 提供的使用8088 微處理器的計算機(jī)作開發(fā)平臺,它是以16 字節(jié)單人單工操作系統(tǒng),特別適合一些功能簡單 ...… 查看全部問答∨ |
專家好: 我的PDA前兩天在公司測試部門發(fā)現(xiàn),按鍵進(jìn)入深度休眠后,不能馬上按鍵喚醒,只有等5~6秒(大約值)后才能馬上喚醒 我的按鍵休眠是設(shè)置的GPIO0,喚醒源也是GPIO0 具體的設(shè)置如下: &nbs ...… 查看全部問答∨ |
shuiyan 大哥你好! 小弟最近在搞OAL里的中斷函數(shù)OALTimerInit遇到個問題,是這樣的: 我在private下的armtrap.s里發(fā)現(xiàn)了中斷的異常跳轉(zhuǎn)表 VectorInstructions ldr pc, [p ...… 查看全部問答∨ |
|
本人把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 ...… 查看全部問答∨ |
$(\'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\', ...… 查看全部問答∨ |
我寫了兩段不同的verilog代碼來實現(xiàn)同一個功能,現(xiàn)在我想比較哪個代碼在FPGA上跑的更快,我在Quartus II里如何看出來呢,請各位指導(dǎo)我一下,謝謝?!? 查看全部問答∨ |
用jlink V8給目標(biāo)板提供3.3V電壓,就是把jlink 里面的跳線帽插到3.3V pin上然后連接 2148,一直這樣提示,試了兩個2148了,都是這樣的提示我如果用目標(biāo)板自己的電源,也是同樣的提示Feature(s): RDI,FlashDL,FlashBP,JFlash,GDBFullVTarget = 3.300 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 特斯拉升級AEB系統(tǒng) 防止車輛撞到行人/騎行者
- 慕尼黑工業(yè)大學(xué)研發(fā)一納米大小鉑顆粒 比目前燃料電池催化劑性能高一倍
- 現(xiàn)代為混合動力車研全球首個換擋主動控制技術(shù) 提升燃油經(jīng)濟(jì)性
- 英偉達(dá)利用深度神經(jīng)網(wǎng)絡(luò) 精確探測車輛與其他物體間距離
- 寶馬集團(tuán)布局5G時代 加快自動駕駛在華落地
- 光譜分析儀指標(biāo)參數(shù)及操作方法
- 2020年高階HDI產(chǎn)能緊缺,或?qū)⑾茲q價潮
- TCL華星:6代柔性AMOLED產(chǎn)線正式量產(chǎn)出貨了
- 國內(nèi)EDA市場整合開始!概倫電子收購博達(dá)微完成
- 臺積電首批5納米樣品出貨!解密兩大客戶