精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32入門學習筆記之SD卡基礎讀寫實驗1

jf_78858299 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-02-16 15:09 ? 次閱讀

20.1 概述

SD卡是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12M字節的數據。

20.1.1 SDIO框圖

STM32F1的SDIO控制器包括2部分,SDIO適配器模塊和AHB總線接口,功能框圖如下圖所示。

圖片

其中SDIO適配器模塊主要用于實現所有MMC/SD卡的相關功能,如時鐘的產生,命令和數據的傳輸,AHB總線接口則用于操作SDIO適配器模塊中的寄存器并產生中斷和DMA請求信號。復位后默認情況下SDIO_D0用于數據傳輸。初始化后主機可以改變數據總線的寬度。

如果一個多媒體卡接到了總線上,則SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于數據傳輸。MMC版本V3.31和之前版本的協議只支持1位數據線,所以只能用SDIO_D0(為了通用性考慮,在程序里面我們只要檢測到是MMC卡就設置為1位總線數據)。

如果一個SD卡接到了總線上,可以通過主機配置數據傳輸使用SDIO_D0或SDIO_D[3:0]。所有的數據線都工作在推挽模式。

SDIO_CMD有兩種操作模式:

(1)用于初始化時的開路模式(僅用于MMC版本V3.31或之前版本)

(2)用于命令傳輸的推挽模式(SD卡和MMCV4.2在初始化時也使用推挽驅動)

20.1.2 SDIO時鐘

從SDIO框圖我們可以看到SDIO總共有3個時鐘,分別是:

(1)卡時鐘SDIO_CK:每個時鐘周期在命令和數據線上傳輸1位命令或數據。對于多媒體卡V3.31協議,時鐘頻率可以在0MHz至20MHz間變化;對于多媒體卡V4.0/4.2協議,時鐘頻率可以在0MHz至48MHz間變化;對于SD卡,時鐘頻率可以在0MHz至25MHz間變化。

(2)SDIO適配器時鐘SDIOCLK:該時鐘用于驅動SDIO適配器,其頻率等于AHB總線頻率HCLK,并用于產生SDIO_CK時鐘

(3)AHB總線接口時鐘HCLK/2:該時鐘用于驅動SDIO的AHB總線接口,其頻率為HCLK/2。

我們的SD卡時鐘SDIO_CK,根據卡的不同,可能有好幾個區間,這就涉及到時鐘頻率的設置,SDIO_CK與SDIOCLK的關系為:

SDIO_CK=SDIOCLK/(2+CLKDIV)

其中,SDIOCLK為HCLK,一般是72MHz,而CLKDIV則是分配系數,可以通過SDIO的SDIO_CLKCR寄存器進行設置,確保SDIO_CK不超過卡的最大操作頻率。

注:在SD卡剛剛初始化的時候,其時鐘頻率SDIO_CK不能超過400KHz,否則可能無法完成初始化。在初始化以后,就可以設置時鐘頻率到最大了,但不可超過SD卡的最大操作時鐘頻率。

20.1.3 SDIO的命令與響應

SDIO的命令分為應用相關命令ACMD和通用命令CMD兩部分,應用相關命令ACMD的發送,必須先發送通用命令CMD55,然后才能發送應用相關命令ACMD。SDIO的所有命令和響應都是通過SDIO_CMD引腳傳輸的,任何命令的長度都是固定為48位,SDIO的命令格式如下表所示。

Bit位 寬度 說明
47 1 0 起始位
46 1 1 傳輸位
45:40 6 - 命令索引
39:8 32 - 參數
7:1 7 - CRC7
0 1 1 結束位

所有的命令都是由STM32F1發出,其中開始位、傳輸位、CRC7和結束位由SDIO硬件控制,我們需要設置的就只有命令索引和參數部分。其中命令索引在SDIO_CMD寄存器里面設置,命令參數則由寄存器SDIO_ARG設置。一般情況下,選中的SD卡在接收到命令之后,都會回復一個應答(但是CMD0無應答),這個應答我們稱之為響應,響應也是在CMD線上串行傳輸的。STM32F1的SDIO控制器支持2種響應類型,48位的短響應和136位的長響應,這兩種響應類型都帶CRC錯誤檢測,不帶CRC的響應應該忽略CRC錯誤標志,如CMD1的響應。

短響應的格式如下表所示。

Bit位 寬度 說明
47 1 0 起始位
46 1 0 傳輸位
45:40 6 - 命令索引
39:8 32 - 參數
7:1 7 - CRC7或者1111111
0 1 1 結束位

長響應的格式如下表所示。

Bit位 寬度 說明
135 1 0 起始位
134 1 0 傳輸位
133:128 6 111111 保留
127:1 127 - CID或CSD(包括內部CRC7)
0 1 1 結束位

硬件為我們濾除了開始位、傳輸位、CRC7以及結束位等信息,對于短響應,命令索引存放在SDIO_RESPCMD寄存器,參數則存放在SDIO_RESP1寄存器里面。對于長響應,則僅留CID/CSD位域,存放在SDIO_RESP1到SDIO_RESP4等4個寄存器。SD卡總共有5類響應(R1、R2、R3、R6、R7),這里以R1為例簡單介紹一下。R1(普通響應命令)響應屬于短響應,其長度為48位,R1響應的格式如下表所示。

Bit位 寬度 說明
47 1 0 起始位
46 1 1 傳輸位
45:40 6 X 命令索引
39:8 32 X 參數
7:1 7 X CRC7
0 1 1 結束位

在收到R1響應后,我們可以從SDIO_RESPCMD寄存器和SDIO_RESP1寄存器分別讀出命令索引和卡狀態信息。

20.1.4 數據塊讀操作

對于SD卡,數據是以數據塊的形式傳輸的,我們常用的卡就是SD卡,所以不考慮MMC形式的讀寫操作,因為MMC卡數據以數據塊或者數據流的形式傳輸。

從機在收到主機相關命令后,開始發送數據塊給主機,所有數據塊都帶有CRC校驗值,CRC由SDIO硬件自動處理,單個數據塊讀的時候,在收到1個數據塊以后即可以停止了,不需要發送停止命令CMD12。但是多塊數據讀的時候,SD卡將一直發送數據給主機,直到接到主機發送的STOP命令CMD12。

SDIO多數據塊的讀操作如下圖所示。

圖片

20.1.5 數據塊寫操作

數據塊寫操作同數據塊讀操作基本類似,只是數據塊寫的時候,多了一個忙判斷,新的數據塊必須在SD卡非忙的時候發送。這里的忙信號由SD卡拉低SDIO_D0,以表示忙,SDIO硬件自動控制,不需要我們軟件處理。

圖片

20.2 SDIO相關寄存器

20.2.1 SDIO電源控制寄存器:SDIO_POWER

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- CTRL

Bit 1~Bit 0:電源控制位

00:電源關閉,卡的時鐘停止

01:保留

10:保留的上電狀態

11:上電狀態,卡的時鐘開啟

20.2.2 SDIO時鐘控制寄存器:SDIO_CLKCR

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- HWFC_EN NEGEDGE WIDBUS BYPASS PWRSAV CLKEN CLKDIV

Bit 14:硬件流控制使能

0:關閉硬件流控制

1:使能硬件流控制

Bit 13:SDIO_CK相位選擇位

0:在主時鐘SDIOCLK的上升沿產生SDIO_CK

1:在主時鐘SDIOCLK的下降沿產生SDIO_CK

Bit 12~Bit 11:寬總線模式使能位

00:默認總線模式,使用SDIO_D0

01:4位總線模式,使用SDIO_D[3:0]

10:8位總線模式,使用SDIO_D[7:0]

Bit 10:旁路時鐘分頻器

0:關閉旁路:驅動SDIO_CK輸出信號之前,依據CLKDIV數值對SDIOCLK分頻

1:使能旁路:SDIOCLK直接驅動SDIO_CK輸出信號

Bit 9:省電配置位(為了省電,當總線為空閑時,設置PWRSAV位可以關閉SDIO_CK時鐘輸出)

0:始終輸出SDIO_CK

1:僅在有總線活動時才輸出SDIO_CK

Bit 8:時鐘使能位

0:SDIO_CK關閉

1:SDIO_CK使能

Bit 7~Bit 0:時鐘分頻系數

這個域定義了輸入時鐘(SDIOCLK)與輸出時鐘(SDIO_CK)間的分頻系數:SDIO_CK頻率=SDIOCLK/[CLKDIV+2]

20.2.3 SDIO參數寄存器:SDIO_ARG

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
CMDARG[31:16]
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CMDARG[16:0]

Bit 31~Bit 0:命令參數

屬于發送到卡中命令的一部分,如果一個命令包含一個參數,必須在寫命令到命令寄存器之前加載這個寄存器

20.2.4 SDIO命令響應寄存器:SDIO_RESPCMD

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- RESPCMD

Bit 5~Bit 0:響應的命令索引

只讀位,包含最后收到的命令響應中的命令索引

20.2.5 SDIO相應寄存器組:SDIO_RESP1~SDIO_RESP4

寄存器 短響應 長響應
SDIO_RESP1 卡狀態[31:0] 卡狀態[127:96]
SDIO_RESP2 未使用 卡狀態[95:64]
SDIO_RESP3 未使用 卡狀態[31:0]
SDIO_RESP4 未使用 卡狀態[31:0]

注:總是先收到卡狀態的最高位,SDIO_RESP3寄存器的最低位始終為0。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6032

    文章

    44522

    瀏覽量

    633217
  • 存儲器
    +關注

    關注

    38

    文章

    7455

    瀏覽量

    163616
  • SD卡
    +關注

    關注

    2

    文章

    560

    瀏覽量

    63812
  • SDIO
    +關注

    關注

    2

    文章

    72

    瀏覽量

    19294
收藏 人收藏

    評論

    相關推薦

    【紫光同創國產FPGA教程】【第八章】SD讀寫實驗

    SD是現在嵌入式設備重要的存儲模塊,內部集成了nand flash控制器,方便了主機的的管理。本實驗主要是練習對sd的扇區進行
    的頭像 發表于 02-05 11:35 ?8290次閱讀
    【紫光同創國產FPGA教程】【第八章】<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>讀寫實驗</b>

    【GD32F470紫藤派開發板使用手冊】第十二講 SDIO-SD讀寫實驗

    通過本實驗主要學習以下內容: ?SDIO操作原理 ?SD讀寫實
    的頭像 發表于 05-18 09:36 ?1306次閱讀
    【GD32F470紫藤派開發板使用手冊】第十二講 SDIO-<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>讀寫實驗</b>

    arduino學習筆記18 - SD讀寫實驗

    本次實驗使用arduino驅動SD,在SD中進行文件讀寫。需要說明的是arduino的
    發表于 10-24 10:09

    接觸式IC讀寫實驗

    接觸式IC讀寫實驗 一. 實驗目的了解接觸式IC 的知識,
    發表于 09-22 17:20 ?4706次閱讀
    接觸式IC<b class='flag-5'>卡</b><b class='flag-5'>讀寫實驗</b>

    STM32開發板_SD學習

    資料包括《SD讀寫規范》和《SD接口規范》以及《SD
    發表于 06-08 17:29 ?15次下載

    ARM基礎應用實驗06_SD讀寫

    ARM嵌入式應用程序架構設計實例精講--ARM基礎應用實驗06SD讀寫
    發表于 07-08 11:08 ?0次下載

    ARM基礎應用實驗_SD讀寫

    電子專業單片機相關知識學習教材資料——ARM基礎應用實驗06SD讀寫
    發表于 09-13 17:23 ?0次下載

    STM32CubeMX生成一個SD讀寫程序

    本文檔內容介紹了一個STM32CubeMX生成一個SD讀寫程序,由于本程序是直接操作SD的物
    發表于 01-08 11:23 ?57次下載

    SD基礎讀寫實驗詳解

    SD是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12
    的頭像 發表于 01-31 18:01 ?2625次閱讀
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>基礎<b class='flag-5'>讀寫實驗</b>詳解

    STM32入門學習筆記SD基礎讀寫實驗2

    SD是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12
    的頭像 發表于 02-16 15:09 ?1152次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>入門</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>SD</b><b class='flag-5'>卡</b>基礎<b class='flag-5'>讀寫實驗</b>2

    STM32入門學習筆記SD基礎讀寫實驗3

    SD是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12
    的頭像 發表于 02-16 15:09 ?1492次閱讀

    STM32入門學習筆記SD基礎讀寫實驗4

    SD是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12
    的頭像 發表于 02-16 15:09 ?1430次閱讀

    SD基礎讀寫實驗

    SD是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。
    的頭像 發表于 03-01 14:46 ?1461次閱讀
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>基礎<b class='flag-5'>讀寫實驗</b>

    淺談STM32SD

    STM32SD
    的頭像 發表于 10-19 18:28 ?1797次閱讀
    淺談<b class='flag-5'>STM32</b><b class='flag-5'>之</b><b class='flag-5'>SD</b><b class='flag-5'>卡</b>

    【GD32F303紅楓派開發板使用手冊】第二十三講 SDIO-SD讀寫實驗

    通過本實驗主要學習以下內容: ?SDIO操作原理 ?SD讀寫實
    的頭像 發表于 06-23 10:49 ?553次閱讀
    【GD32F303紅楓派開發板使用手冊】第二十三講 SDIO-<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>讀寫實驗</b>