這幾天在FPGA調試與SD通信,讀SD卡里的圖片,之前接觸32時沒有去研究過SD卡,不太熟悉操作流程,在網上找了很多資料,也看了幾個32開發板的資料,但大多數都講得不是特別清楚,只能瞎操作了一番,在別人的代碼做了修改,能初始化成功,但是讀數據一直有問題,加上用Arria 10在Quartus下編譯比較慢,下載驗證也比較慢,調了好幾天才調好,在此總結一下,讀操作按照SD協議來,讀單塊發送CMD17,加扇區地址,加一字節FF如下:
發送讀操作指令后,SD會有一字節00應答,這一點很重要,我在找資料過程中沒有人特別說明這點,所以有段時間卡在這,沒法確定發送的指令SD是否接收辨識到。
發送讀操作指令且有應答后,就一直給SD卡提供時鍾,通常是一直發送0xFF,此時發送的數據無關緊要,只要緊緊關注SD的回應,當SD回應0xFE時就說明SD在傳數據給你了,這一點也非常重要,我找資料時有網友提到這,但是沒有特別提醒,所以也糾結在這,不知道什么時候數據有效,再次強調,發送CMD17和扇區地址后,一直提供時鍾,並檢測SD回應,當SD卡回應0xFE時指示接下來的數據為有效數據,如下截圖:
如果已經到以上步驟了,那說明已經快接近成功了,接下來是非常關鍵的,也是讓我折騰了幾天沒弄出來的,其實就是沒有理解給的扇區地址的問題,網上找了好多資料,大多數都會提到SD卡的邏輯地址和物理地址,但是就沒誰點一下,不使用FAT文件系統,直接讀SD卡,應該讀邏輯地址還是物理地址,自己折騰了幾天,在此總結一下:
當你使用SPI或SDIO方式直接讀SD卡時,應該直接讀你用WinHex看到的物理扇區地址!!!直接讀你用WinHex看到的物理扇區地址!!!直接讀它,我就是因為不知道該讀哪個,一直讀看到的邏輯扇區地址,數據一直對不上,然后一直以為是通信時序問題,浪費了好多時間。下面是我實際操作的截圖,簡單說明一下,供參考。
我實驗時先讀0扇區的數據,看看對不對(因為0扇區一定有數據,SD保留區域),通過WinHex查看0扇區的物理扇區地址如下:
FPGA讀到后送到RAM查看得到數據如下:
對比兩張截圖,可以清晰的得到結論,直接讀SD的數據時,地址選物理扇區地址,才能正確讀出來對應的數據。
以下是我在SD卡存了圖片,讀出來的數據對比:
先是WinHex查看到的圖片的物理扇區地址:46144
FPGA讀該地址並送到RAM中查看得到數據如下:
兩張圖片對比都一致。