工程師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ù)的傳輸,這兩者部分分別代表者對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è)子單元的劃分,對各子單元進(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ù)手冊上關(guān)于這一部分的全部描述,大體上就是說:適配器寄存器組包含了所有的系統(tǒng)寄存器。它還產(chǎn)生用于清除MMC卡的靜態(tài)標(biāo)志位的信號。當(dāng)向SDIO Clear register(清除寄存器)的對應(yīng)位寫1,即產(chǎn)生這個(gè)信號。
2、控制單元
這一單元又在內(nèi)部分為電源管理和時(shí)鐘管理兩個(gè)子單元,他們都受控制適配器寄存器組。時(shí)鐘管理子單元產(chǎn)生和控制時(shí)鐘信號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í)鐘信號的:
復(fù)位后
上電和掉電期間
省電模式下總線處于空閑模式時(shí)
電源管理子單元在上電和掉電時(shí)關(guān)繼時(shí)適配器的輸出信號。
3、命令通道
命令通道向卡發(fā)送命令和接收回應(yīng)。
如圖所示,圖上左側(cè)陰影部分是屬于適配器寄存器組子單元里的兩個(gè)寄存器,分別為SDIO_ARG和SDIO_CMD,后者用于添加想要發(fā)送的命令,前者用于添加所要發(fā)送的命令的參數(shù),將兩個(gè)添好之后使能命令發(fā)送,命令就會自動發(fā)送出去。適配器上述兩個(gè)寄存器的內(nèi)容進(jìn)行組合,并最終形成48位長的命令,這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ā)送之后會對標(biāo)志位中的相送位置位,通知系統(tǒng),命令發(fā)送正常,然后進(jìn)入空閉狀態(tài)。如果發(fā)送的命令是有回應(yīng)的命令,則要等待回應(yīng)。接收到回應(yīng)之后,會對回應(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ī)還沒移動到接收狀態(tài),則置位超時(shí)標(biāo)志并進(jìn)入空閑狀態(tài)。
注意:命令超時(shí)時(shí)間是固定值,為64個(gè)SDIO_CK。
如果在命令寄存器中設(shè)置了中斷位(interrupt bit),就不會啟用上面講到的超時(shí)時(shí)鐘,CPSM狀態(tài)機(jī)會一直等待來自卡的中斷請求。如果在命令寄存器中置位了懸停位(pending bit),CPSM狀態(tài)機(jī)會進(jìn)入懸停狀態(tài)(所謂的掛起狀態(tài)),并等待來自數(shù)據(jù)通道子單元的CmdPend信號。檢測到CmdPend位以為,CPSM狀態(tài)機(jī)會移動到發(fā)送狀態(tài)(Send state),這將使數(shù)據(jù)計(jì)數(shù)器停止命令的傳輸。
注意:CPSM會在空閑模式停留至少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信號線串行傳輸,所有的命令都有一個(gè)固定的長度,即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ī),是對剛剛接收到的命令的回答?;貞?yīng)是在CMD信號線上串行傳輸?shù)摹?/P>
SDIO支持兩種回應(yīng)類型,都是進(jìn)行CRC校驗(yàn)的:
48位的短回應(yīng)(short response)
136位的長回應(yīng)(long response)
注意:如果回應(yīng)不包含CRC校驗(yàn)信息(如CMD1的回應(yīng)),設(shè)備驅(qū)動就必須忽略CRC錯誤的狀態(tài)。
下面兩張表是兩種回應(yīng)的格式:
前面講到,SDIO適配器包含兩個(gè)大塊兒,詳見本帖開頭,這里只拿出圖來:
其中,與AHB接口相連的有兩個(gè)塊兒,就是上圖中左側(cè)陰影部分,Adapter registers 和FIFO,即適配器寄存器組和數(shù)據(jù)FIFO。前者包含了適配器所有的寄存器,用于配置相應(yīng)時(shí)序,產(chǎn)生相應(yīng)的信號。
這里面,用于控制命令通道產(chǎn)生命令時(shí)序的就有兩個(gè)寄存器,名為SDIO_ARG和SDIO_CMD,SDIO_ARG的三十二位全部用來存儲命令參數(shù),也就沒什么好講的了。SDIO_CMD則不同,它有六個(gè)位,用來識別不同的命令,總共可以區(qū)別64個(gè),但實(shí)際上SD卡的命令集沒有那么多。 SDIO_CMD還有一些位,用來表示些命令時(shí)否有回應(yīng),是長回應(yīng)還是短回應(yīng),命令的類型是什么等等。適配器最終根據(jù)這些,加上CRC組合成一個(gè)48位的命令。
另外,我們還提到過命令發(fā)送之后,如果這是一個(gè)沒有回應(yīng)的命令,那么就很簡單,命令通道直接置位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))。對長回應(yīng)格式來說,CRC校驗(yàn)和計(jì)算的是CID或CSD的前120位。這里不包括開始位,傳輸位和六個(gè)保留位。 CRC是一個(gè)7位的值,其計(jì)算方法如下:
pwm相關(guān)文章:pwm是什么
pwm相關(guān)文章:pwm原理
評論