話說在某一天用Google找Arduino的SD咭程式庫時,意外地找到這篇由印度人寫文章。內容是如何用一粒ATmega8去讀取SD咭的內容。線路圖,程式碼樣樣有,是一個很好的工具去學習如何使用SD咭。
在佈線上,連接SD咭有兩個方法。SD Mode和SPI Mode,而SPI Mode又再分1線及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版,直接看效果。
Add new comment