色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 詳解 STM32 之 SD 卡(2)

          詳解 STM32 之 SD 卡(2)

          發(fā)布人:魚鷹談單片機(jī) 時(shí)間:2022-12-21 來源:工程師 發(fā)布文章

          五、SD卡物理層協(xié)議

            SD卡的協(xié)議相對(duì)于SPI、I2C等協(xié)議的存儲(chǔ)器來說相對(duì)復(fù)雜,包含SD卡物理層(機(jī)械封裝、管腳、芯片結(jié)構(gòu)、命令集等)、SD卡接口(SDIO)、SD主機(jī)控制器,甚至是軟件設(shè)計(jì)的流程,都進(jìn)行了詳細(xì)的規(guī)定。

          1、接口

          ① SDIO接口

            參考《Simplified_SDIO_Card_Spec.pdf》

          圖片

          <1> CLK 時(shí)鐘同步線

          <2> CMD 命令信號(hào)線,主機(jī)發(fā)出的命令以及從機(jī)對(duì)命令的響應(yīng)都是通過這條線進(jìn)行傳輸

          <3> DAT[3:0] 表示4條數(shù)據(jù)線,主機(jī)和從機(jī)的數(shù)據(jù)都是從這四條數(shù)據(jù)線上傳輸

          ② SPI接口

          圖片

          2、命令格式

          圖片

          3、響應(yīng)格式

            以R1為例

          圖片

          4、SD卡的工作狀態(tài)

          圖片

           

          5、SD卡的兩種狀態(tài)信息

          ① Card Status

            執(zhí)行命令過程中的狀態(tài)信息,比如地址不對(duì)齊錯(cuò)誤、塊長(zhǎng)度錯(cuò)誤、卡鎖、ECC校驗(yàn)錯(cuò)誤等等

          ② SD Status

            SD卡的專有特征,編程中不經(jīng)常涉及。這個(gè)狀態(tài)值有512位,不是通過命令線傳送給主機(jī),而是通過數(shù)據(jù)線。

          六、STM32與SD卡相配的外設(shè)--SDIO適配器

           1、SDIO adapter 結(jié)構(gòu)圖

          圖片

          2、命令狀態(tài)機(jī)(CPSM)

            當(dāng)發(fā)送命令和接收響應(yīng)時(shí),啟動(dòng)CPSM狀態(tài)機(jī)。

          圖片

          3、數(shù)據(jù)通道狀態(tài)機(jī)

            當(dāng)傳輸數(shù)據(jù)時(shí),啟動(dòng)數(shù)據(jù)通道狀態(tài)機(jī)。

          圖片

          4、FIFO

            有關(guān)FIFO的資料參考:異步FIFO的FPGA實(shí)現(xiàn)

            數(shù)據(jù)FIFO(先進(jìn)先出)子單元是一個(gè)具有發(fā)送和接收單元的數(shù)據(jù)緩沖區(qū)。

            FIFO包含一個(gè)每字32位寬、共32個(gè)字的數(shù)據(jù)緩沖區(qū),和發(fā)送與接收電路。因?yàn)閿?shù)據(jù)FIFO工作在AHB 時(shí)鐘區(qū)域(HCLK/2),所有與SDIO時(shí)鐘區(qū)域(SDIOCLK)連接的信號(hào)都進(jìn)行了重新同步。依據(jù)TXACT和RXACT標(biāo)志,可以關(guān)閉FIFO、使能發(fā)送或使能接收。TXACT和RXACT 由數(shù)據(jù)通道子單元設(shè)置而且是互斥的:

              ─ 當(dāng) TXACT 有效時(shí),發(fā)送 FIFO 代表發(fā)送電路和數(shù)據(jù)緩沖區(qū)
              ─ 當(dāng) RXACT 有效時(shí),接收 FIFO 代表接收電路和數(shù)據(jù)緩沖區(qū)

          5、SDIO的特殊功能寄存器

          • SDIO電源控制寄存器(SDIO_POWER)

          • SDIO時(shí)鐘控制寄存器(SDIO_CLKCR) : 時(shí)鐘選擇、分頻

          • SDIO參數(shù)寄存器(SDIO_ARG)

          • SDIO命令寄存器(SDIO_CMD):控制發(fā)送命令

          • SDIO命令響應(yīng)寄存器(SDIO_RESPCMD):包含響應(yīng)命令中的命令索引

          • SDIO響應(yīng)1..4寄存器(SDIO_RESPx):包含響應(yīng)命令中的卡狀態(tài)信息

          • SDIO數(shù)據(jù)定時(shí)器寄存器(SDIO_DTIMER)

          • SDIO數(shù)據(jù)長(zhǎng)度寄存器(SDIO_DLEN):讀或者寫的長(zhǎng)度,通常是是512的倍數(shù)

          • SDIO數(shù)據(jù)控制寄存器(SDIO_DCTRL):控制數(shù)據(jù)的讀寫方向、使能傳輸?shù)刃畔?/p>

          • SDIO數(shù)據(jù)計(jì)數(shù)器寄存器(SDIO_DCOUNT):當(dāng)DPSM狀態(tài)機(jī)從Idle state切換到Wait_R或者Wait_S狀態(tài)時(shí),SDIO_LEN的數(shù)值加載到該寄存器中

          • SDIO狀態(tài)寄存器(SDIO_STA)

          • SDIO清除中斷寄存器(SDIO_ICR)

          • SDIO中斷屏蔽寄存器(SDIO_MASK)

          • SDIO FIFO計(jì)數(shù)器寄存器(SDIO_FIFOCNT):當(dāng)SDIO_DCTRL中的DTEN使能,并且DPSM處于Idle state時(shí),SDIO_LEN/4的數(shù)值加載到該寄存器中

          • SDIO數(shù)據(jù)FIFO寄存器(SDIO_FIFO):讀寫數(shù)據(jù)緩沖FIFO

          七、SD卡編程

            SD卡的編程在STM32官方固件庫中就有例程,而且野火開發(fā)板對(duì)該例程進(jìn)行了中文注釋,不必再把源碼貼入。這里著重講一下SD卡編程流程,主要包含SD卡初始化、SD卡讀、SD卡寫、SD卡擦除。

          1、SD卡編程的內(nèi)容

            SD卡主要就是用來存儲(chǔ)數(shù)據(jù)的,所以核心就是讀寫。為了實(shí)現(xiàn)這個(gè)目標(biāo),必須實(shí)現(xiàn)響應(yīng)的驅(qū)動(dòng)。

            配置過程中,不僅要設(shè)置好SD控制器,還需要將SD卡設(shè)置到合適的狀態(tài)。在讀取狀態(tài)的時(shí)候,不僅涉及到SD控制器的狀態(tài),還涉及到SD卡的狀態(tài)。

          2、SD卡初始化

          ① STM32外設(shè)SDIO初始化

          1. 端口配置、端口時(shí)鐘、SDIO時(shí)鐘、DMA2時(shí)鐘使能

          2. SDIO寄存器復(fù)位

          3. 設(shè)置時(shí)鐘SDIO_CK為400KHz以下,設(shè)置數(shù)據(jù)線寬度,開啟時(shí)鐘、開啟SDIO電源

          ② SD卡上電初始化

          圖片

            上電初始化流程如上圖所示,筆者認(rèn)為官方庫提供的例程沒有完全按照這個(gè)流程圖的指示去做。事實(shí)上,官方庫的程序只做了如上圖紅色方框內(nèi)的流程,之外的沒涉及。

            CMD0命令復(fù)位所有的卡。

            SD協(xié)議規(guī)定:在初始化的時(shí)候,使用ACMD41之前,必須先使用CMD8命令。而且ACMD41命令屬于應(yīng)用命令,在使用之前需要先發(fā)送命令CMD55。

            CMD8命令是為了核查電源是否匹配。ACMD41命令不斷詢問SD卡是否支持主機(jī)提供的電壓,并且詢問SD卡是否上電完成進(jìn)入準(zhǔn)備狀態(tài)。ACMD41命令還能詢問SD卡的類型(SDSC、SDHC)。

          ③卡進(jìn)一步核查、獲取卡信息

            發(fā)送命令CMD2,以獲取CID信息。

            發(fā)送命令CMD3,以獲取RCA相對(duì)地址,可以通過多次發(fā)送CMD3獲取不同的RCA值,但是只有最后一次的才是有效的RCA地址。

            發(fā)送命令CMD9,以獲取CSD寄存器。

          ④ 設(shè)置SDIO工作在數(shù)據(jù)傳輸模式

            設(shè)置SDIO的時(shí)鐘為24MHz、數(shù)據(jù)線寬度為4位。

            通過SD_GetCardInfo函數(shù)將之前得到CID、CSD處理成卡的信息。

            通過CMD7命令選擇匹配地址的卡,而取消選擇其他的卡。

            至此,初始化完成。

          3、讀SD卡的一個(gè)塊

          •  數(shù)據(jù)控制寄存器(SDIO_DCTRL)清零

          •  發(fā)送命令CMD16,設(shè)置SD卡的Block大小

          •  調(diào)用函數(shù)SDIO_DataConfig設(shè)置SDIO數(shù)據(jù)傳輸方式

          •  發(fā)送命令CMD17,讀單個(gè)塊

          •  SDIO數(shù)據(jù)傳輸結(jié)束中斷使能

          •  SDIO的DMA傳輸功能使能

          •  DMA設(shè)置,并使能

          4、寫SD卡的一個(gè)塊 

          •  數(shù)據(jù)控制寄存器(SDIO_DCTRL)清零

          •  發(fā)送命令CMD16,設(shè)置SD卡的Block大小

          •  發(fā)送命令CMD24,寫單個(gè)塊

          •  調(diào)用函數(shù)SDIO_DataConfig設(shè)置SDIO數(shù)據(jù)傳輸方式

          •  SDIO數(shù)據(jù)傳輸結(jié)束中斷使能

          •  DMA設(shè)置,并使能

          •  使能SDIO的DMA傳輸功能 


          *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



          關(guān)鍵詞: 單片機(jī)

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉