用Arduino板學AVR篇程 - 利用SPI存取SD咭

本帖最後由 salad 於 2011-10-9 19:35 編輯

話說在某一天用Google找Arduino的SD咭程式庫時,意外地找到這篇由印度人寫文章。內容是如何用一粒ATmega8去讀取SD咭的內容。線路圖,程式碼樣樣有,是一個很好的工具去學習如何使用SD咭。

在佈線上,連接SD咭有兩個方法。SD Mode和SPI Mode,而SPI Mode又再分線及4線。看線路圖,佈線的方法是使用SPI Mode,連接ATmega8 MCU的SPI Port。SD咭是用3.3V,而MCU是用5V,但我看線路圖,沒有升降電壓的線路。

使用SD咭做Project最困難的地方,是很難取得一份正式說明SD咭內部構造的文件。若果要取得文件,必需要向SD Card Association註用,而且要交為數不少的費用。但因為有SD咭製造商的技術文件,再加上一些從廠商溜出來的機密文件,現在總算能了解SD咭的內部構造。

再看程式碼,有MCU使用SPI Port的方法,可看到MCU和SD咭亙傳消息的Packet,最後是如何連結File System(FAT32)。若果沒有文件,根本看不明Packet在傳甚麼。

打開MCU說明書,發覺ATmega8同ATmega328,在佈線同程式碼都很相似。再和Ethernet Shield v5的線路圖比對,認為以上的程式碼應該可以在Arduino運行。所以便開始修改習作。


使用Ethernet Shield v5

我使用Version 2.3,支援SDHC的程式碼(Version 2.4要有DS1307 RTC硬體才可以用),修改Frequency,同埋改Port Name後,compile後upload上Arduino。


成功顯示內容

成功顯示內容。我心想,有冇咁順利呀。之後換上Ethernet Shield v1,程式就不能跑,永遠都顯示"SD card not detected.."。比對番線路圖,原來v1是使用4線的SD Mode,而且不是接MCU的SPI Port。

最後再看清楚v5的線路圖,CS腳(SD咭的1號腳)是連接在PD4。而程式碼則是定義在PB1,但為何程式可以正常運作?最後測試的結論是,接不接CS腳都可以工作。

更改過的程式碼在這裏。只要Overwrite前作者的檔案就可以。也附有HEX檔,可以直接寫落Arduino版,直接看效果。

類似Project
http://frank.circleofcurrent.com/cache/fat_sd.htm

回復 1# salad

謝謝師兄分享!

TOP