工程師STM32單片機(jī)學(xué)習(xí)基礎(chǔ)手記(4):用PWM實(shí)現(xiàn)熒火蟲燈(三)
一、STM32的SDIO適配器的結(jié)構(gòu)
STM32的SDIO適配器包括與AHB總線接口和SD卡接口兩個(gè)大塊兒。如下面圖中兩個(gè)灰色陰影區(qū)域。
左側(cè)的陰影部分又細(xì)分兩個(gè)子單無,適配器寄存器組和FIFO。適配器寄存器組包含了所有SDIO所有的寄存器,這些寄存器用于配置一些參數(shù),以實(shí)現(xiàn)一些SD協(xié)議中的時(shí)序,最終于實(shí)現(xiàn)SD卡的命令傳輸。FIFO則是為了實(shí)現(xiàn)數(shù)據(jù)的傳輸,這兩者部分分別代表者對(duì)SD卡的兩種傳輸操作,即命令的傳輸和數(shù)據(jù)的傳輸。
右側(cè)的陰影部分,即SDIO適配器的SD卡接口大塊兒,又細(xì)分為三個(gè)子單元??刂茊卧–ontrol Unit),命令通道和數(shù)據(jù)通道(Command Path and Data Path)??刂茊卧饕獙?shí)現(xiàn)電源和時(shí)鐘的控制。它根據(jù)適配器寄存器組中寄存器的配置,開啟和關(guān)閉SDIO適配器模塊的電源,改變工作的時(shí)鐘源(直接使用 SDIO_CLK還是其分頻后的時(shí)鐘等)。命令通道連接CMD線,控制命令的傳輸。數(shù)據(jù)通道連接數(shù)據(jù)線(DAT0~DAT7),控制數(shù)據(jù)的傳輸。
二、分單元詳述
下面按照上面一章提到的五個(gè)子單元的劃分,對(duì)各子單元進(jìn)行詳細(xì)的描述。
1、適配器寄存器組
The adapter register block contains all system registers. This block also generates the signals that clear the static flags in the multimedia card. The clear signals are generated when 1 is written into the corresponding bit location in the SDIO Clear register.
這個(gè)STM32數(shù)據(jù)手冊(cè)上關(guān)于這一部分的全部描述,大體上就是說:適配器寄存器組包含了所有的系統(tǒng)寄存器。它還產(chǎn)生用于清除MMC卡的靜態(tài)標(biāo)志位的信號(hào)。當(dāng)向SDIO Clear register(清除寄存器)的對(duì)應(yīng)位寫1,即產(chǎn)生這個(gè)信號(hào)。
2、控制單元
這一單元又在內(nèi)部分為電源管理和時(shí)鐘管理兩個(gè)子單元,他們都受控制適配器寄存器組。時(shí)鐘管理子單元產(chǎn)生和控制時(shí)鐘信號(hào)SDIO_CK,也就是SD卡最絡(luò)接收到的SCK。時(shí)鐘管理子單元工作于兩種模式時(shí)鐘分頻模式和時(shí)鐘直通模式(Bypass,標(biāo)準(zhǔn)的翻譯不知是什么,似乎可以是“旁路”,但“直通”更容易理解些)。當(dāng)工作在直通模式進(jìn),SDIO_CK==SDIO_CLK.工作于分頻模塊時(shí),SDIO_CK==SDIO_CLK/div.
在如下情形下,時(shí)鐘是不輸出時(shí)鐘信號(hào)的:
復(fù)位后
上電和掉電期間
省電模式下總線處于空閑模式時(shí)
電源管理子單元在上電和掉電時(shí)關(guān)繼時(shí)適配器的輸出信號(hào)。
3、命令通道
命令通道向卡發(fā)送命令和接收回應(yīng)。
如圖所示,圖上左側(cè)陰影部分是屬于適配器寄存器組子單元里的兩個(gè)寄存器,分別為SDIO_ARG和SDIO_CMD,后者用于添加想要發(fā)送的命令,前者用于添加所要發(fā)送的命令的參數(shù),將兩個(gè)添好之后使能命令發(fā)送,命令就會(huì)自動(dòng)發(fā)送出去。適配器上述兩個(gè)寄存器的內(nèi)容進(jìn)行組合,并最終形成48位長(zhǎng)的命令,這48 位首先進(jìn)入移位寄存器,即圖中的Shift register,在這里由并轉(zhuǎn)串一位一位的發(fā)送,由圖可見,這些位要經(jīng)過CRC后,才發(fā)送出去。實(shí)際上,前面講的總位數(shù)并非48,在這里經(jīng)過CRC,生成那些位的CRC較驗(yàn)值,并追加到其尾部,最絡(luò)才是48位。命令分為有回應(yīng)的和沒有回應(yīng)的兩種。如果發(fā)送的是沒有回應(yīng)的命令,發(fā)送之后會(huì)對(duì)標(biāo)志位中的相送位置位,通知系統(tǒng),命令發(fā)送正常,然后進(jìn)入空閉狀態(tài)。如果發(fā)送的命令是有回應(yīng)的命令,則要等待回應(yīng)。接收到回應(yīng)之后,會(huì)對(duì)回應(yīng)進(jìn)行CRC校驗(yàn),并設(shè)定相關(guān)位。下面是命令通道的狀態(tài)機(jī):
進(jìn)入等待狀態(tài)后,命令時(shí)鐘(command timer)開始計(jì)時(shí),如果到達(dá)超時(shí)時(shí)間CPSM狀態(tài)機(jī)還沒移動(dòng)到接收狀態(tài),則置位超時(shí)標(biāo)志并進(jìn)入空閑狀態(tài)。
注意:命令超時(shí)時(shí)間是固定值,為64個(gè)SDIO_CK。
如果在命令寄存器中設(shè)置了中斷位(interrupt bit),就不會(huì)啟用上面講到的超時(shí)時(shí)鐘,CPSM狀態(tài)機(jī)會(huì)一直等待來自卡的中斷請(qǐng)求。如果在命令寄存器中置位了懸停位(pending bit),CPSM狀態(tài)機(jī)會(huì)進(jìn)入懸停狀態(tài)(所謂的掛起狀態(tài)),并等待來自數(shù)據(jù)通道子單元的CmdPend信號(hào)。檢測(cè)到CmdPend位以為,CPSM狀態(tài)機(jī)會(huì)移動(dòng)到發(fā)送狀態(tài)(Send state),這將使數(shù)據(jù)計(jì)數(shù)器停止命令的傳輸。
注意:CPSM會(huì)在空閑模式停留至少8個(gè)SDIO_CK時(shí)間,以滿足Ncc和Nrc的時(shí)間要求。Ncc時(shí)兩次主機(jī)命令傳輸?shù)淖钚⊙舆t,而Nrc時(shí)主機(jī)命令與卡的回應(yīng)之間的最小延遲。如下圖:
命令的格式:
命令即是開始傳輸?shù)囊粋€(gè)標(biāo)記。命令由主機(jī)發(fā)送給單個(gè)卡(尋址性命令)或是所有的卡(廣播性命令,MMC V3.31及更早的MMC卡標(biāo)準(zhǔn)中支持)。命令通過CMD信號(hào)線串行傳輸,所有的命令都有一個(gè)固定的長(zhǎng)度,即48位。命令的格式如下圖:
命令通道工作于半雙工模式,所以可以發(fā)送,也可以接收命令或回應(yīng)。如果CPSM狀態(tài)機(jī)不在發(fā)送狀態(tài)(Send State),SDIO_CMD為高阻狀態(tài)(Hi-Z state),如下圖:
SDIO_CMD在SDIO_CK的上升沿進(jìn)行同步。
回應(yīng):
回應(yīng)是由被尋址的卡發(fā)出的一個(gè)標(biāo)記(或是在MMC V3.31及以前標(biāo)準(zhǔn)中,所有連接在適配器上的卡同步發(fā)送),此標(biāo)記由卡發(fā)給主機(jī),是對(duì)剛剛接收到的命令的回答?;貞?yīng)是在CMD信號(hào)線上串行傳輸?shù)摹?/P>
SDIO支持兩種回應(yīng)類型,都是進(jìn)行CRC校驗(yàn)的:
48位的短回應(yīng)(short response)
136位的長(zhǎng)回應(yīng)(long response)
注意:如果回應(yīng)不包含CRC校驗(yàn)信息(如CMD1的回應(yīng)),設(shè)備驅(qū)動(dòng)就必須忽略CRC錯(cuò)誤的狀態(tài)。
下面兩張表是兩種回應(yīng)的格式:
前面講到,SDIO適配器包含兩個(gè)大塊兒,詳見本帖開頭,這里只拿出圖來:
其中,與AHB接口相連的有兩個(gè)塊兒,就是上圖中左側(cè)陰影部分,Adapter registers 和FIFO,即適配器寄存器組和數(shù)據(jù)FIFO。前者包含了適配器所有的寄存器,用于配置相應(yīng)時(shí)序,產(chǎn)生相應(yīng)的信號(hào)。
這里面,用于控制命令通道產(chǎn)生命令時(shí)序的就有兩個(gè)寄存器,名為SDIO_ARG和SDIO_CMD,SDIO_ARG的三十二位全部用來存儲(chǔ)命令參數(shù),也就沒什么好講的了。SDIO_CMD則不同,它有六個(gè)位,用來識(shí)別不同的命令,總共可以區(qū)別64個(gè),但實(shí)際上SD卡的命令集沒有那么多。 SDIO_CMD還有一些位,用來表示些命令時(shí)否有回應(yīng),是長(zhǎng)回應(yīng)還是短回應(yīng),命令的類型是什么等等。適配器最終根據(jù)這些,加上CRC組合成一個(gè)48位的命令。
另外,我們還提到過命令發(fā)送之后,如果這是一個(gè)沒有回應(yīng)的命令,那么就很簡(jiǎn)單,命令通道直接置位CMDSENT標(biāo)志,或進(jìn)入空閑狀態(tài)。如果是有回應(yīng)的,則要等待回應(yīng),并設(shè)定相關(guān)的標(biāo)志位。命令通道的相關(guān)標(biāo)志位如下:
CRC 產(chǎn)生器計(jì)算的是CRC碼前面的所有位的校驗(yàn)和。這包括開始位,傳輸位,命令索引(command index)和命令參數(shù)(和卡狀態(tài))。對(duì)長(zhǎng)回應(yīng)格式來說,CRC校驗(yàn)和計(jì)算的是CID或CSD的前120位。這里不包括開始位,傳輸位和六個(gè)保留位。 CRC是一個(gè)7位的值,其計(jì)算方法如下:
pwm相關(guān)文章:pwm是什么
pwm相關(guān)文章:pwm原理
評(píng)論