實踐出真知 |
為什麼我之前特別專注在 spi 上呢? 不是 i2c, 也不是 i2s, 就是因為我要使用 spi sd card, 這才是我真正的目的。sd card 的界面有 sdio 或是 spi, 我選擇了比較簡單的 spi。
spi 已經可以通訊了, 再來要把 spi 和 sd card 插槽連接起來, 這真的難倒我。
spi 的 4 個 pin 我已經了解, 沒有問題, ground 也沒問題, 問題是 3.3v, 5v 那個才是要接的 pin, 又要接在開發板的哪裡呢?
詢問過有經驗的朋友後, 決定把 sd 板的 3.3v 接在 stm32f4 開發板的 vdd 上, 也用了三用電錶確定 vdd 輸出的是 3V 電壓, 我一個軟體人員自然不會這些, 麻煩別人幫我完成這些事情。
5v 據說也可以, sd card slot 有降壓 ic 會把 5v 降到 3.3v。
使用《作業系統之前的程式 for stm32f4discovery (16) - spi》提過的 spi1 來連接 sd card, 在該篇文章中, 我已經打通了 spi1 的通訊, 把它接過來這邊就可以了。
和《作業系統之前的程式 for stm32f4discovery (16) - spi》不一樣的是 cs (NSS) 需要接起來, 接到 sd card 的 SDCS, 但是設定 spi 時, 還是設定 soft nss。
stm32f4discovery 開發板 (msater) | sd card (slave) |
NSS: PA4 | SDCS |
SCK: PA5 | SCK |
MISO: PA6 | MISO |
MOSI: PA7 | MOSI |
ground | ground |
vdd | 3.3v |
stm32f4discovery 線路圖可以參考 stm32f4discovery 線路圖, 我看了 vdd, 5v, 3.3v 的這些部份, 當然還是看不懂, 有個朋友為我說明其中概念, 這是認識 ee 人的好處, 要不然會看得很辛苦。
硬體接線搞定了, 再來剩下軟體的問題, spi 沒問題, sd card 的初始化還真的很複雜, 最後找了 STM32 不完原手冊的範例:
4)正点原子miniSTM32F103rct开发板资料:
基础资料下载总连接:http://pan.baidu.com/s/1qXYP1b2
手把手教你学STM32》参考视频(下载战舰B,C,D盘即可):http://pan.baidu.com/s/1eSAwPrW
B盘独立压缩包: http://pan.baidu.com/s/1i5GwEqT 视频盘,《手把手教你学STM32-M3》视频
C盘独立压缩包:http://pan.baidu.com/s/1miPJYeW 视频盘,《手把手教你学STM32-M3》视频
D盘独立压缩包:http://pan.baidu.com/s/1i4UZ4Lf 视频盘,《手把手教你学STM32-M3》视频
UCOS/EMWIN/LWIP视频下载链接:
EMWIN视频:http://pan.baidu.com/s/1c29LDj6
MiniSTM32 V2.0开发板资料(适合3.0之前所有版本):http://pan.baidu.com/s/1o7Hs8OU
<<原子教你玩STM32>>系列视频教程(30集):http://pan.baidu.com/s/1dD3Uvg1
STM32学习短视频(STM32解读/工具使用/开发板/模块测试):http://pan.baidu.com/s/1kT1GpRT
STM32学习从0开始(13讲): http://pan.baidu.com/s/1nvETqQ1
這個網站的 stm 相關開發板有很豐富的資源, 還有教學影片, 他們為了賣開發板做了這麼多的努力, 真的不簡單。這次的 SD card 程式碼參考了 STM32 不完原手冊的範例, 我修改為符合 stm32f4discovery 開發板後在 stm32f4discovery 執行。這是最麻煩的部份, 目前似乎沒有書籍專為 stm32f4discovery 來撰寫, 書籍大都需要搭配某塊開發板, 而我使用的開發板和這些書籍寫的都不同, 把範例改到可以正確執行還蠻麻煩的。
電子書可以下載, 想知道 sd card 初始化流程可以看看, 我只想套用這段程式碼, 站在巨人的肩膀真的輕鬆不少。由於我打通了 stm32f4discovery 的 spi1, 只要單純把 spi init 的程式碼換成我那段成功的部份就可以了, 當然, 還有 spi1 讀寫資料的部份也要一併置換。
這次能完成這個實驗要感謝很多人, 特別是 telegram 群組的 Yen-Chin Lee, 他給我很多意見以及相關資訊。
接上電源後, 開始跑程式了, 我很有信心, 一開始的 SD_Initialize() 應該會過才是, 但 ... 沒有, 我懷疑是硬體沒接好, 轉頭一看, 果然 3.3 v 的線沒插好, 再試一次, 還是不行, 再轉頭一看, 下方的 spi1 線鬆開了, 再來一次, 果然順利把 SD_Initialize() 執行完畢, 我就說是硬體沒接好吧! 這是難得的幸運, 一次就好, 之前的努力沒有白費, 真是讓人開心。
不過再來該做什麼呢? 把 CID, CSD 讀出來確認 sd card 真的有認到, 說不定 SD_Initialize() 只是運氣好過了, 而無法正確讀到 sd card 資訊。
在和 linux 抓到的 cid, csd 對照後, 除了最後的 CRC 不同外, 其他都一樣, 爽阿!
確定了, cid, csd 都是對的, 不過要把 spi 降速會比較穩,spi 設定在高速時不太穩, 有時候會卡在 spi read function。
Name | Field | Linux attribute* | Description |
---|---|---|---|
Manufacturer ID | MID | manfid | Assigned by SD-3C, LLC. |
OEM/Application ID | OID | oemid | Identifies the card OEM and/or the card contents. Assigned by SD-3C, LLC. |
Product Name | PNM | name | 5 characters long (ASCII) |
Product Revision | PRV | hwrev, fwrev | Two binary coded decimal (BCD) digits. Each is four bits. The PRV is in the form x.y. The PRV can also be found by using the hwrev and fwrev, where x=hwrev and y=fwrev |
Serial Number | PSN | serial | This 32 bit field is intended to be read as an unsigned integer |
Manufacture Date Code | MDT | date | Manufacture date is stored in the form yym (offset from 2000) |
CRC7 checksum | CRC | 7 bit code used for checking errors in the card register |
再來 dump sd card 的第 0 個 sector 內容, 確定可以正確讀到 sector 0 的資料。
和用 hexdump 做比較, 當然是一樣的。
linux 抓到的 blocks 是 7839744 也和 list 1. L12 計算的是一樣的值。這個值是說這張 sd card 有幾個 sector, 而每一個 sector 是 512 byte。
source code:
https://github.com/descent/stm32f4_prog/tree/master/spi_sdcard
突破這關後, 再來的 fat 檔案系統是純軟體, 對我來說就沒有那麼難了, 我煩惱的是要自己寫, 還是用現成的 library? 該讓我自己站在巨人的肩膀了, 造了那麼多輪子也是會累的。
fat 我搞定了, 而且也完成我想做的事情了。
ref:
- Generic FAT file system code
- Reading and writing to a file on sd card using stm32 discovery kit
- Cheap DIY SD card breadboard socket
- stm32f4基于spi用fatfs读写SD卡的实现
- 成大 spi
- Taming the STMicros Discovery Boards
- Arduino 專用 Micro SD卡讀寫模組 SPI介面,迷你TF卡讀寫
- 踢鐵板的自製 microSD 模組
- SD(HC)-memory card and MMC interface conditioning
- Rev. 2 — 4 April 2013 Application
- Project: Read, Collect & Decode SD Card CSD Register Data
- Project: Read, Collect & Decode SD Card CID Register Data
- How To: Read CID on SD card
- How to determine MMC card size?
- How to Use MMC/SDC
- STM32F4 Discovery - interfacing SD card with SPI & FatFS
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。