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

Submitted by saladlam on

話說在某一天用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運行。所以便開始修改習作。

22092011-0001.jpg
使用Ethernet Shield v5

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

22092011-0002.jpg

成功顯示內容。我心想,有冇咁順利呀。之後換上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

Add new comment

The content of this field is kept private and will not be shown publicly.

Restricted HTML

  • Allowed HTML tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.
CAPTCHA
Enter the characters shown in the image.
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.