sdio接口是什么_如何理解api接口
大家好,又見面了,我是你們的朋友風(fēng)君子。如果您正在找激活碼,請點擊查看最新教程,關(guān)注關(guān)注公眾號 “全棧程序員社區(qū)” 獲取激活教程,可能之前舊版本教程已經(jīng)失效.最新Idea2022.1教程親測有效,一鍵激活。
Jetbrains全系列IDE穩(wěn)定放心使用
運用SD卡第一步,認(rèn)識SDIO接口
做畢業(yè)設(shè)計需要用到大量的音頻文件,一般的存儲器滿足不了存儲要求,故選擇SD卡作為存儲器件。在這里記錄一下自己的學(xué)習(xí)經(jīng)歷,學(xué)習(xí)一個新的IC,無非是要么根據(jù)時序圖寫出Read和Write函數(shù),要么是根據(jù)通信總線和IC相關(guān)操作指令去完成Read和Write函數(shù)。只有能與對應(yīng)IC“說話”,我們才能去開發(fā)它更多地可能性。這里以原子探索者為例,為大家介紹一下SD卡相關(guān)知識。
簡要的介紹一下什么是SDIO接口
SDIO——>安全數(shù)字輸入輸出接口。它是在SD卡接口基礎(chǔ)上發(fā)展而來。
SDIO 和 SD卡規(guī)范間的一個重要的區(qū)別是增加了低速標(biāo)準(zhǔn),低速卡的目標(biāo)應(yīng)用是以最小硬件開支支持低速I/O能力,低速卡支持類似調(diào)制解調(diào)器,條碼掃描儀和GPS接收器等應(yīng)用。STM32的SDIO控制器支持多媒體卡(MMC卡)、SD存儲卡、SD I/O卡和CE-ATA設(shè)備。
其特點我們直接上圖:
我們可以看到SDIO接口具有向前兼容的特點,支持多種多個版本的存儲卡。在高位總線模式下,也同樣具有優(yōu)秀的讀取速度。
stm32內(nèi)核自帶了SDIO適配器,下面上框圖(手冊自帶):
根據(jù)框圖我們可以看到SDIO適配器的時鐘與PCLK2和SDIOCLK有關(guān),SDIO適配器的控制與SDIO_CK和SDIO_CMD有關(guān),其數(shù)據(jù)的傳輸又與SDIO_D[7:0]有關(guān)(最高可以配置8位數(shù)據(jù)總線寬度)。復(fù)位情況下,SDIO_D0用于數(shù)據(jù)傳輸,初始化后主機可以改變數(shù)據(jù)總線的寬度通過(ACMD6命令設(shè)置)。
SDIO與外圍設(shè)備的命令與響應(yīng)均是通過SDIO_CMD來完成的。這里我們可以調(diào)用SDIO_SendCommand()這個庫函數(shù),用來通過SDIO總線的SDIO_CMD以SDIO_CK這樣的頻率,對外圍設(shè)備如SD卡發(fā)送CMD命令,并且可以獲取響應(yīng)數(shù)據(jù)。
那么問題來了,這個SDIO_CK到底是怎么計算的呢?話不多說,我們接著上圖:
通過上圖我們可以得出,SDIO時鐘計算公式:SDIO_CK時鐘=SDIOCLK/[clkdiv+2];其中,SDIOCLK固定為48Mhz。那么我們只要配置clkdiv這個位,就能夠完成對SDIO_CK的配置。clkdiv這個位在SDIO初始化函數(shù)里即可進行配置,下面上代碼:
SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; /* HCLK = 72MHz, SDIOCLK = 72MHz, SDIO_CK = HCLK/(178 + 2) = 400 KHz */
SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; //不使用bypass模式,直接用HCLK進行分頻得到SDIO_CK
SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; // 空閑時不關(guān)閉時鐘電源
SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b; //1位數(shù)據(jù)線
SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;//硬件流
SDIO_Init(&SDIO_InitStructure);
這里SDIO_INIT_CLK_DIV = 0x76,計算一下就可以知道SDIO_CK的時鐘為400KHz,數(shù)據(jù)寬度為1位。看到這里大家能可會問,這么慢的頻率,這么短的數(shù)據(jù)傳輸位數(shù),傳輸?shù)男誓芨邌幔科鋵嵾@里對SD卡的初始化只是為了激活SD卡,開啟SDIO總線與SD卡之間的通信。真正的初始化需要一大串命令。
初始化完以后我們需要使能SDIO_CK這個時鐘,SDIO->CLKCR|=1<<8; 這個寄存器我們后面再說。
SD卡與SDIO的接口
說完了SDIO接口,我們再說說這個接口需要操作的外圍設(shè)備,SD卡。隨便在網(wǎng)上買了個4GB的SD卡,大概長這個樣子:
這種SD卡有9個接口,每個接口的定義如下:
一般的對于SD卡,我們的開發(fā)板上都有對應(yīng)的卡槽,自己畫板子的話也很好畫,網(wǎng)上買個卡槽也很便宜,所以不要怕SD卡不好放置。
SDIO的命令與響應(yīng)
SDIO的命令分為:應(yīng)用相關(guān)命令(ACMD)和通用命令(CMD)兩部分。發(fā)送ACMD時,需先發(fā)送CMD55。
需要注意的是,發(fā)送CMD命令只需要填充命令索引和參數(shù)即可,這兩個數(shù)據(jù)相關(guān)的寄存器
SDICARG[31:0] —–>CMD[39:8] 命令的參數(shù)(根據(jù)命令所需的參數(shù)位格式設(shè)置)
SDICCON[7:0] —–> CMD[47:40] 包含Start Bit,Transmission Bit,Command Index.
關(guān)于寄存器的操作都被封裝成了庫函數(shù),所以我們只需要調(diào)用SDIO_SendCommand()這個庫函數(shù),即可完成發(fā)送CMD命令的要求,這個庫函數(shù)還帶一個參數(shù)是響應(yīng)類型參數(shù),根據(jù)長響應(yīng)還是短響應(yīng)到對應(yīng)的寄存器去尋找返回的參數(shù)。
SDIO的所有命令和響應(yīng)都是在SDIO_CMD引腳上面?zhèn)鬏數(shù)模铋L度固定位48位,SDIO命令格式如下表所示:
其中除了命令索引和參數(shù)需要我們設(shè)置,其他都是由SDIO硬件自動控制。命令索引(如CMD0,CMD1之類)由SDIO_CMD寄存器設(shè)置,命令參數(shù)則由SDIO_ARG寄存器設(shè)置。
一般SD卡在接收到命令行以后都會有一個應(yīng)答(CMD0例外),這個應(yīng)答我們也稱之為響應(yīng)。
對于stm32的SDIO接口,支持2種響應(yīng)類型:短響應(yīng)(48位)和長響應(yīng)(136位)。
SDIO塊數(shù)據(jù)傳輸不論是短響應(yīng)還是長響應(yīng),硬件都會自動濾除了起始位,傳輸位,CRC7以及結(jié)束位等信息,對于短響應(yīng),命令索引存放在SDIO_RESPCMD寄存器。參數(shù)則存放在SDIO_RESP1寄存器里面。對于長響應(yīng),則僅留CID/CSD位域,存放在SDIO_RESP1~SDIO_RESP4等4個寄存器里面。每個響應(yīng)都有自己的響應(yīng)格式(6種)。
到這里我們其實可以給SD卡的初始化和工作流程簡要的總結(jié)一下了:
①、首先我們通過配置SDIO的初始化函數(shù)初始化SD卡,就是可以想象成把SD卡給喚醒。
②、喚醒完了以后,我們就可以通過SDIO總線,給SD卡發(fā)送命令。
③、SD卡收到命令后會反饋一個響應(yīng),我們可以通過響應(yīng)的信息去獲取SD卡的各項信息,以方便我們根據(jù)信息對于SD卡做出相應(yīng)的初始化操作,比如設(shè)置數(shù)據(jù)總線寬度,設(shè)置SD卡工作頻率等等。
④、無論發(fā)送命令或者接收響應(yīng),均是通過SDIO_CMD這一個位來完成的,在沒有涉及發(fā)送或者接收數(shù)據(jù)的時候,SDIO_D數(shù)據(jù)線是不參與的。
這樣一看SD卡的初始化其實就是一個端口的發(fā)送和接收,是不是感覺簡單了很多呢?
SD卡讀寫多塊數(shù)據(jù)過程
讀取多塊數(shù)據(jù)過程
怎么說呢,就是我們發(fā)送命令,然后接收到響應(yīng)的響應(yīng)后通過SDIO_D數(shù)據(jù)線接收來自SD卡的數(shù)據(jù),直到發(fā)送了STOP命令。
寫入多塊數(shù)據(jù)過程
至此,SD卡基本的初始化和讀寫信息已經(jīng)介紹完畢了,SDIO總線的通信方式相信大家也很了解了,但是SD卡本身是一個非常復(fù)雜的存儲IC,下一篇文章我將介紹SD卡初始化和讀寫數(shù)據(jù)的詳細(xì)步驟。
總結(jié)
以上是生活随笔為你收集整理的sdio接口是什么_如何理解api接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 余额宝利率破2.4%,你还会把钱放在余额
- 下一篇: 《牧场物语 Welcome!美丽人生》定