SD卡引腳及spi模式基本操作過程
《SD卡引腳及spi模式基本操作過程》由會員分享,可在線閱讀,更多相關(guān)《SD卡引腳及spi模式基本操作過程(13頁珍藏版)》請在裝配圖網(wǎng)上搜索。
SD 卡引腳及 spi 模式基本操作過程 摘自網(wǎng)絡(luò) 對于 SD 卡的硬件結(jié)構(gòu) 在官方的文檔上有很詳細的介紹 如 SD 卡內(nèi)的存儲器結(jié)構(gòu) 存儲單元組織方式等內(nèi)容 要實現(xiàn)對它的讀寫 最核心的是它的時序 筆者在經(jīng)過了實際 的測試后 使用 51 單片機成功實現(xiàn)了對 SD 卡的扇區(qū)讀寫 并對其讀寫速度進行了評估 下面先來講解 SD 卡的讀寫時序 SD 卡的引腳定義 SD 卡引腳功能詳述 SD 模式 SPI 模式引腳 編號 名稱 類型 描述 名稱 類型 描述 1 CD DAT3 IO 或 PP 卡檢測 數(shù)據(jù)線 3 CS I 片選 2 CMD PP 命令 回應(yīng) DI I 數(shù)據(jù)輸入 3 VSS1 S 電源地 VSS S 電源地 4 VDD S 電源 VDD S 電源 5 CLK I 時鐘 SCLK I 時鐘 6 VSS2 S 電源地 VSS2 S 電源地 7 DAT0 IO 或 PP 數(shù)據(jù)線 0 DO O 或 PP 數(shù)據(jù)輸出 8 DAT1 IO 或 PP 數(shù)據(jù)線 1 RSV 9 DAT2 IO 或 PP 數(shù)據(jù)線 2 RSV 注 S 電源供給 I 輸入 O 采用推拉驅(qū)動的輸出 PP 采用推拉驅(qū)動的輸入輸出 SD 卡 SPI 模式下與單片機的連接圖 SD 卡支持兩種總線方式 SD 方式與 SPI 方式 其中 SD 方式采用 6 線制 使用 CLK CMD DAT0 DAT3 進行數(shù)據(jù)通信 而 SPI 方式采用 4 線制 使用 CS CLK DataIn DataOut 進行數(shù)據(jù)通信 SD 方式時的數(shù)據(jù)傳輸速度與 SPI 方式要快 采用單片機對 SD 卡進行讀寫時一般都采用 SPI 模式 采用不同的初始化方式可以使 SD 卡工作于 SD 方式或 SPI 方式 這里只對其 SPI 方式進行介紹 SPI 方式驅(qū)動 SD 卡的方法 SD 卡的 SPI 通信接口使其可以通過 SPI 通道進行數(shù)據(jù)讀寫 從應(yīng)用的角度來看 采 用 SPI 接口的好處在于 很多單片機內(nèi)部自帶 SPI 控制器 不光給開發(fā)上帶來方便 同時 也見降低了開發(fā)成本 然而 它也有不好的地方 如失去了 SD 卡的性能優(yōu)勢 要解決這 一問題 就要用 SD 方式 因為它提供更大的總線數(shù)據(jù)帶寬 SPI 接口的選用是在上電初 始時向其寫入第一個命令時進行的 以下介紹 SD 卡的驅(qū)動方法 只實現(xiàn)簡單的扇區(qū)讀寫 1 命令與數(shù)據(jù)傳輸 1 命令傳輸 SD 卡自身有完備的命令系統(tǒng) 以實現(xiàn)各項操作 命令格式如下 命令的傳輸過程采用發(fā)送應(yīng)答機制 過程如下 每一個命令都有自己命令應(yīng)答格式 在 SPI 模式中定義了三種應(yīng)答格式 如下表所示 字節(jié) 位 含義 7 開始位 始終為 0 6 參數(shù)錯誤 5 地址錯誤 4 擦除序列錯誤 3 CRC 錯誤 2 非法命令 1 擦除復位 1 0 閑置狀態(tài) 字節(jié) 位 含義 7 開始位 始終為 0 6 參數(shù)錯誤 5 地址錯誤 4 擦除序列錯誤 3 CRC 錯誤 2 非法命令 1 擦除復位 1 0 閑置狀態(tài) 7 溢出 CSD 覆蓋 6 擦除參數(shù) 5 寫保護非法 4 卡 ECC 失敗 3 卡控制器錯誤 2 未知錯誤 1 寫保護擦除跳過 鎖 解鎖失敗 2 0 鎖卡 字節(jié) 位 含義 7 開始位 始終為 0 6 參數(shù)錯誤 5 地址錯誤 4 擦除序列錯誤 3 CRC 錯誤 1 2 非法命令 1 擦除復位 0 閑置狀態(tài) 2 5 全部 操作條件寄存器 高位在前 寫命令的例程 C 程序 向 SD 卡中寫入命令 并返回回應(yīng)的第二個字節(jié) unsigned char Write Command SD unsigned char CMD unsigned char tmp unsigned char retry 0 unsigned char i 禁止 SD 卡片選 SPI CS 1 發(fā)送 8 個時鐘信號 Write Byte SD 0 xFF 使能 SD 卡片選 SPI CS 0 向 SD 卡發(fā)送 6 字節(jié)命令 for i 0 i 0 x06 i Write Byte SD CMD 獲得 16 位的回應(yīng) Read Byte SD read the first byte ignore it do 讀取后 8 位 tmp Read Byte SD retry while tmp 0 xff return tmp 初始化 SD 卡的初始化是非常重要的 只有進行了正確的初始化 才能進行后面的各項操作 在初始化過程中 SPI 的時鐘不能太快 否則會造初始化失敗 在初始化成功后 應(yīng)盡量 提高 SPI 的速率 在剛開始要先發(fā)送至少 74 個時鐘信號 這是必須的 在很多讀者的實 驗中 很多是因為疏忽了這一點 而使初始化不成功 隨后就是寫入兩個命令 CMD0 與 CMD1 使 SD 卡進入 SPI 模式 初始化時序圖 初始化例程 C 程序 初始化 SD 卡到 SPI 模式 unsigned char SD Init unsigned char retry temp unsigned char i unsigned char CMD 0 x40 0 x00 0 x00 0 x00 0 x00 0 x95 SD Port Init 初始化驅(qū)動端口 Init Flag 1 將初始化標志置 1 for i 0 isector count sectorBuffer dat 6 vinf sector count sector count sectorBuffer dat 7 vinf sector count sector count sectorBuffer dat 8 獲取 multiplier vinf sector multiply sectorBuffer dat 9 vinf sector multiply sector multiply sectorBuffer dat 10 獲取 SD 卡的容量 vinf size MB vinf sector count 9 vinf sector multiply get the name of the card Read CID SD sectorBuffer dat vinf name 0 sectorBuffer dat 3 vinf name 1 sectorBuffer dat 4 vinf name 2 sectorBuffer dat 5 vinf name 3 sectorBuffer dat 6 vinf name 4 sectorBuffer dat 7 vinf name 5 0 x00 end flag 以上程序?qū)⑿畔⒀b載到一個結(jié)構(gòu)體中 這個結(jié)構(gòu)體的定義如下 typedef struct SD VOLUME INFO SD SD Card info unsigned int size MB unsigned char sector multiply unsigned int sector count unsigned char name 6 VOLUME INFO TYPE 扇區(qū)讀 扇區(qū)讀是對 SD 卡驅(qū)動的目的之一 SD 卡的每一個扇區(qū)中有 512 個字節(jié) 一次扇區(qū) 讀操作將把某一個扇區(qū)內(nèi)的 512 個字節(jié)全部讀出 過程很簡單 先寫入命令 在得到相應(yīng) 的回應(yīng)后 開始數(shù)據(jù)讀取 扇區(qū)讀的時序 扇區(qū)讀的程序例程 C 程序 unsigned char SD Read Sector unsigned long sector unsigned char buffer unsigned char retry 命令 16 unsigned char CMD 0 x51 0 x00 0 x00 0 x00 0 x00 0 xFF unsigned char temp 地址變換 由邏輯塊地址轉(zhuǎn)為字節(jié)地址 sector sector 24 CMD 2 sector CMD 3 sector 將命令 16 寫入 SD 卡 retry 0 do 為了保證寫入命令 一共寫 100 次 temp Write Command MMC CMD retry if retry 100 return READ BLOCK ERROR block write Error while temp 0 Read Start Byte form MMC SD Card FEh Start Byte Now data is ready you can read it out while Read Byte MMC 0 xfe readPos 0 SD get data 512 buffer 512 字節(jié)被讀出到 buffer 中 return 0 其中 SD get data 函數(shù)如下 獲取數(shù)據(jù)到 buffer 中 void SD get data unsigned int Bytes unsigned char buffer unsigned int j for j 0 j Bytes j buffer Read Byte SD 扇區(qū)寫 扇區(qū)寫是 SD 卡驅(qū)動的另一目的 每次扇區(qū)寫操作將向 SD 卡的某個扇區(qū)中寫入 512 個字節(jié) 過程與扇區(qū)讀相似 只是數(shù)據(jù)的方向相反與寫入命令不同而已 扇區(qū)寫的時序 扇區(qū)寫的程序例程 C 程序 寫 512 個字節(jié)到 SD 卡的某一個扇區(qū)中去 返回 0 說明寫入成功 unsigned char SD write sector unsigned long addr unsigned char Buffer unsigned char tmp retry unsigned int i 命令 24 unsigned char CMD 0 x58 0 x00 0 x00 0 x00 0 x00 0 xFF addr addr 24 CMD 2 addr CMD 3 addr 寫命令 24 到 SD 卡中去 retry 0 do 為了可靠寫入 寫 100 次 tmp Write Command SD CMD retry if retry 100 return tmp send commamd Error while tmp 0 在寫之前先產(chǎn)生 100 個時鐘信號 for i 0 i 100 i Read Byte SD 寫入開始字節(jié) Write Byte MMC 0 xFE 現(xiàn)在可以寫入 512 個字節(jié) for i 0 i 512 i Write Byte MMC Buffer CRC Byte Write Byte MMC 0 xFF Dummy CRC Write Byte MMC 0 xFF CRC Code tmp Read Byte MMC read response if tmp return WRITE BLOCK ERROR Error 等到 SD 卡不忙為止 因為數(shù)據(jù)被接受后 SD 卡在向儲存陣列中編程數(shù)據(jù) while Read Byte MMC 0 xff 禁止 SD 卡 SPI CS 1 return 0 寫入成功 此上內(nèi)容在筆者的實驗中都已調(diào)試通過 單片機采用 STC89LE 單片機 SD 卡的初 始化電壓為 2 0V 3 6V 操作電壓為 3 1V 3 5V 因此不能用 5V 單片機 或進行分壓處 理 工作于 22 1184M 的時鐘下 由于所采用的單片機中沒硬件 SPI 采用軟件模擬 SPI 因此讀寫速率都較慢 如果要半 SD 卡應(yīng)用于音頻 視頻等要求高速場合 則需要選 用有硬件 SPI 的控制器 或使用 SD 模式 當然這就需要各位讀者對 SD 模式加以研究 有了 SPI 模式的基礎(chǔ) SD 模式應(yīng)該不是什么難事- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- SD 引腳 spi 模式 基本 操作過程
鏈接地址:http://m.appdesigncorp.com/p-10027954.html