晶元:stm32f427
晶元配置軟體:stm32cubemx 5.6.0
配置了fatfs
卡時鐘(sdio_ck ):每個時鐘週期在命令和資料線上傳輸 1 位命令或資料。對於多**卡 v3.31 協議,時鐘頻率可以在 0mhz 至 20mhz 間變化;對於多**卡 v4.0/4.2 協議,時鐘頻率可以在 0mhz 至 48mhz 間變化;對於 sd 或 sd i/o 卡,時鐘頻率可以在 0mhz 至 25mhz間變化。
sdio介面卡時鐘( sdioclk ):該時鐘用於驅動 sdio 介面卡,其頻率等於 ahb 匯流排頻率( hclk ),並用於產生 sdio_ck 時鐘。
ahb 匯流排介面時鐘( hclk/2 ):該時鐘用於驅動 sdio 的 ahb 匯流排介面,其頻率為hclk/2 。
前面提到,我們的sd 卡時鐘( sdio_ck ),根據卡的不同,可能有好幾個區間,這就涉及到時鐘頻率的設定, sdio_ck 與 sdioclk 的關係為:
sdio_ck=sdioclk/(2+clkdiv)
其中,sdioclk 為 hclk ,一般是 72mhz(f103系列),而 clkdiv 則是分配係數,可以通過 sdio
的 sdio_clkcr 暫存器進行設定(確保 sdio_ck 不超過卡的最大操作頻率)。
這裡要提醒大家,在sd 卡剛剛初始化的時候,其時鐘頻率( sdio_ck )是不能超過 400khz的,
否則可能無法完成初始化。在初始化以後,就可以設定時鐘頻率到最大了(但不可超過 sd卡的最大操作時鐘頻率)。
按上面的公式配置了sd:
測試**:
// mount sd卡
retsd = f_mount(&sdfatfs, sdpath, 1);
if(retsd)
else
int8_t sdwrite_test()
retsd = f_close(&fl);
if(retsd)
else
return 0;
}else
}
// 讀取檔案測試
int8_t sdread_test()
else
if(f_size(&fl) != sizeof(int32_t))
uint32_t bytesread = 0; // 讀檔案計數
// 讀取檔案
retsd = f_read(&fl, &testval , sizeof(int32_t), (uint*)&bytesread);
if(retsd)
else
// 關閉檔案
retsd = f_close(&fl);
if(retsd)
else
printf("testval :%d \r\n", testval);
return 0;
}
寫入sd卡返回了成功,但是當我執行sd卡讀取**時發現,檔案不存在,讀取失敗了,取了sd卡放到電腦也發現檔案沒建立
如果寫入檔案後立刻讀取失敗則重寫檔案,一般寫第二次就會成功,檢視了sd卡的優先順序,基本已經都是最高的
之後嘗試調整sdioclk clock devide factor的值,基本上sd有問題都是這個問題,嘗試了加大和減小這個值,發現設定為0-2都可以一次寫入檔案成功
按公式,如果設定sdioclk clock devide factor為0,sd卡的時鐘頻率就應該會超了才對,然而發現sd卡是能正常的,還是說是高速模式,沒搞清楚
STM32 SPI方式讀寫SD卡
前段時間在51上模擬spi實現了對sd卡的讀取,效果還算不錯,最近將其移植到stm32上,不過使用硬體spi和使用軟體spi還是有差別的。如下 void user spiinit void spi初始化以後就可以寫spi讀寫函式了,以下兩個函式參照了網上的資料,出處找不到了,但是這兩個函式幫了我大忙...
STM32掛載SD卡記錄日誌
stm32掛載sd卡記錄日誌 程式主要是在前一篇的基礎上進行。使用cube配置stm32掛載tf卡,請看 記錄日誌主要是將執行中的資料轉換為字串,然後再寫入到sd卡。需要解決兩個問題 程式中各種格式的資料變數轉換為字串 sd卡檔案關閉後再次開啟繼續接著寫。解決第乙個問題是使用函式sprintf 函式...
STM32初始化SD卡流程
1,初始化sdio外設,關閉sdio時鐘。2,上電,開啟時鐘,注意此時時鐘應不能超過400khz,且此時是只有一位資料線,要到初始化完成後再調時鐘與資料線寬度。3,延時最低74個時鐘週期。使時鐘與sd卡穩定,否則會出錯。4,傳送cmd0,需要返回0x01,進入idle狀態 5,為了區別sd卡是2.0...