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