ESP32(7) 打通SD Card
這篇介紹怎麼打通SD card介面,因為太簡單了,先講古填充版面
[SD卡與我]
2009當阿兵哥感嘆被國家糟蹋的時光,必須做點什麼補償。放假我操起J-Link對S3C2410開發板寫Bootloader,十分健康的假日休閒。13年過去了,開發ESP32招數依舊差不多
開發板的SD卡槽連上SPI介面,從SPI Driver開始寫,照SD卡規範刻下圖那種狀態機,和創見2G記憶卡當朋友,不知不覺做起讀卡機了!小時候硬碟不開機,用DOS跑fdisk /mbr能救回MBR(Master Boot Record),長大親手讀出記憶卡的MBR令我感動萬分!後續掛上FatFs,儲存空間搭配檔案系統才好用
感動另一面是恐懼,巨大的工作量忘不了(SPI/ SD-CARD IF/ DMA/ FATFS)。我玩STM32就很懶得弄;這次想做CAN bus logger,再怕都要搞定
[ESP32-C3]
隨手在網路找到範例1,範例用ESP32-C3加上Lua Firmware不能用;倒是接線不是很複雜,先安定神經一下。稍微撈了ESP32-C3 SDK的文件,這幾篇看來有點用
他們指出ESP32-C3 SDK有個簡單好用的範例,去SDK folder撈到底下的範例
/HOME/.platformio/package/framework-
espidf/examples/storage/sd_card/sdspi/main/sd_card_example_main.c
範例充滿註解,改一下針腳定義,編譯完就會動了!大概太多人都需要用SD卡,原廠SDK直接幫裝好給大家用也合情合理了
[速度考量]
勿在浮沙築高台,架起來後要看看有沒有坑
SPI初始資料結構有個欄位疑似能提高SPI clock,我試著從20Mhz拉高到24/25/26/40,全部都不能用,看起來只能跑20Mhz;也可能是杜邦線頻率上不去,這就不得而知了
修改範例,塞for-loop寫入4MB數據測試速度,大概15秒寫完,等於一秒鐘寫273KB。汽車500Kbps CAN bus極限資料量只有62.5Kbyte/sec,表示SD卡寫入速度是四倍快,拿來做logger應該不至於被SD卡速度擋住
fprintf()實作我還不確定,不知道緩衝區的特性
可以在fprintf()後面接GPIO toggle,在示波器觀測GPIO。假如是週期性的跳動,那麼fprintf()高概率是blocking call,最好把寫檔丟到另一個low priority task跑;如果是緩衝區寫滿再寫檔案,寫檔瞬間變blocking call也不合格。我預期ESP SDK應該有放ping pong buffer,緩衝區爆掉前,盡量把檔案寫入轉到背景做。嚴謹的使用SD card程式庫,還是要掌握這些特性才不會踩坑
當然... 反正還沒採坑... 我也懶了,先用再說吧
真的做產品,像是用戶突然拔卡,SD卡壞掉的Error Handle是另外一題。總之,先用再說吧
[強壯的SD卡]
實驗中開發板經常直接斷電,或是上電中直接拔卡,插入電腦讀卡,再插回開發板按RESET。看起來MicroSD卡應該是很強壯,以後我大概不會再Windows老老實實退出裝置了,想拔就拔
我第一份工作,有一位開發者弄SD卡相關的事務,需要看這些記憶卡介面,搞定檔案格式,效能不能差(DMA),儲存介面的水很深啊。感謝ESP SDK讓我能舒服的用。想繼續鑽研的人,ESP32 SDK還能繼續鑽下去
- SD卡到底吃什麼命令
- SD卡可以吃兩種命令SPI/ SDHOST
- FAT檔案格式到底長怎樣(小時候我真的抓過FAT規格書讀,然後放棄了)
- 如何讓效能超好(Ping/Pong,甚至Tripple buffer)
希望這篇讓您感受到我對SD卡的情懷,至於貧脊的內容,只是反應裝SD卡確實很簡單
留言