SDIO协议概述
SDIO?總線
???????SDIO?總線和?USB?總線類似,?SDIO?總線也有兩端,其中一端是主機(jī)(?HOST?)端,另一端是設(shè)備端(?DEVICE?),采用?HOST- DEVICE?這樣的設(shè)計(jì)是為了簡化?DEVICE?的設(shè)計(jì),所有的通信都是由?HOST?端發(fā)出命令開始的。在?DEVICE?端只要能解溪?HOST?的命令,就可以同?HOST?進(jìn)行通信了。
???????這個(gè)是同?SD?的總線一樣的?,?其中有如下的幾種信號(hào)
1.????????CLK?信號(hào)?:HOST?給?DEVICE?的時(shí)鐘信號(hào)?.
2.????????CMD?信號(hào):雙向的信號(hào),用于傳送命令和反應(yīng)。
3.????????DAT0-DAT3?信號(hào)?:?四條用于傳送的數(shù)據(jù)線。
4.????????VDD?信號(hào)?:?電源信號(hào)。
5.????????VSS1?,?VSS2:?電源地信號(hào)。
在?SDIO?總線定義中?,DAT1?信號(hào)線復(fù)用為中斷線。在?SDIO?的?1BIT?模式下?DAT0?用來傳輸數(shù)據(jù),?DAT1?用作中斷線。在?SDIO?的?4BIT?模式下?DAT0-DAT3?用來傳輸數(shù)據(jù),其中?DAT1?復(fù)用作中斷線。
SDIO?命令:
???????SDIO?總線上都是?HOST?端發(fā)起請(qǐng)求,然后?DEVICE?端回應(yīng)請(qǐng)求。其中請(qǐng)求和回應(yīng)中會(huì)數(shù)據(jù)信息。
1.????????Command:?用于開始傳輸?shù)拿?#xff0c;是由?HOST?端發(fā)往?DEVICE?端的。其中命令是通過?CMD?信號(hào)線傳送的。
2.????????Response:?回應(yīng)是?DEVICE?返回的?HOST?的命令,作為?Command?的回應(yīng)。也是通過
CMD?線傳送的。
3.????????Data:?數(shù)據(jù)是雙向的傳送的。可以設(shè)置為?1?線模式,也可以設(shè)置為?4?線模式。數(shù)據(jù)是通過?DAT0-DAT3?信號(hào)線傳輸?shù)摹?/p>
?SDIO?的每次操作都是由?HOST?在?CMD?線上發(fā)起一個(gè)?CMD?,對(duì)于有的?CMD?,?DEVICE?需要返回?Response?,有的則不需要。
???????對(duì)于讀命令,首先?HOST?會(huì)向?DEVICE?發(fā)送命令,緊接著?DEVICE?會(huì)返回一個(gè)握手信號(hào),此時(shí),當(dāng)?HOST?收到回應(yīng)的握手信號(hào)后,會(huì)將數(shù)據(jù)放在?4?位的數(shù)據(jù)線上,在傳送數(shù)據(jù)的同時(shí)會(huì)跟隨著?CRC?校驗(yàn)碼。當(dāng)整個(gè)讀傳送完畢后,?HOST?會(huì)再次發(fā)送一個(gè)命令,通知?DEVICE?操作完畢,?DEVICE?同時(shí)會(huì)返回一個(gè)響應(yīng)。
???????對(duì)于寫命令,首先?HOST?會(huì)向?DEVICE?發(fā)送命令,緊接著?DEVICE?會(huì)返回一個(gè)握手信號(hào),此時(shí),當(dāng)?HOST?收到回應(yīng)的握手信號(hào)后,會(huì)將數(shù)據(jù)放在?4?位的數(shù)據(jù)線上,在傳送數(shù)據(jù)的同時(shí)會(huì)跟隨著?CRC?校驗(yàn)碼。當(dāng)整個(gè)寫傳送完畢后,?HOST?會(huì)再次發(fā)送一個(gè)命令,通知?DEVICE?操作完畢,?DEVICE?同時(shí)會(huì)返回一個(gè)響應(yīng)。
SDIO?的寄存器:
??????SDIO?卡的設(shè)備驅(qū)動(dòng)?80%?的任務(wù)就是操作?SDIO?卡上的有關(guān)寄存器。?SDIO?卡最多允許有?7?個(gè)功能(?function?)?,這個(gè)同其功能號(hào)是對(duì)應(yīng)的(?0?~?7?)?,?每個(gè)功能都對(duì)應(yīng)一個(gè)?128K?字節(jié)大小的寄存器,這個(gè)見下面的圖。功能號(hào)之所以取值范圍是?1~7?,而沒有包含?0?,是因?yàn)楣δ?0?并不代表真正的功能,而代表?CIA?寄存器,即?Common I/O Area?,這個(gè)紀(jì)錄著?SDIO?卡的一些基本信息和特性,并且可以改寫這些寄存器。其中地址?0x1000~0x17fff?是?SDIO?卡的?CIS?區(qū)域,就是基本信息區(qū)域,?Common Information Structure?。初始化的時(shí)候讀取并配對(duì)?SDIO?設(shè)備。
???????這些寄存器的詳細(xì)分區(qū)已經(jīng)其對(duì)應(yīng)的功能,在開發(fā)過程中都是需要仔細(xì)研讀的,這些都在協(xié)議的?SPEC?中都有詳細(xì)說明,這里就不在羅索了。??
CMD52?命令:
SDIO?設(shè)備為了和?SD?內(nèi)存卡兼容,?SD?卡所有?Command?和?Response?完全兼容,同時(shí)加入了一些新的?Command?和Response?。例如,初始化?SD?內(nèi)存卡使用?ACMD41?,而?SDIO?卡設(shè)備則用?CMD5?通知?DEVICE?進(jìn)行初始化。
但二者最重要的區(qū)別是,?SDIO?卡比?SD?內(nèi)存卡多了?CMD52?和?CMD53?命令,這兩個(gè)命令可以方便的訪問某個(gè)功能的某個(gè)地址寄存器。
CMD52?命令是?IO_RW_DIRECT?命令的簡稱,其命令格式如下
首先第一位為?0,?表明是起始位,第二位為傳輸方向,這里為?1?,代表方向?yàn)?HOST?向?DEVICE?設(shè)備傳送,其后?6?位為命令號(hào),這里是?110100b?,用十進(jìn)制表示為?52?,?CMD52?的名字也由此而來。緊接著是讀寫標(biāo)志位。
??????然后是操作的功能號(hào)。也就是?function? ?number?。如果為?0?則指示為?CCCR?寄存器組。
???????緊接著是寄存器地址,用?17?指示,由于功能寄存器有?128K?地址,?17?位正好能尋址。
???????再下來?8?位?Write data or Staff Bits?的意思是說,如果當(dāng)前為寫操作,則為數(shù)據(jù),否則?8?位為填充位。無意義。
???????最后?7?位為?CRC?校驗(yàn)碼。最后一位為結(jié)束位?0?。
???????對(duì)于?CMD52?的?Response?是?48?位,命令格式如下:
???????總結(jié)下,?CMD52?是由?HOST?發(fā)往?DEVICE?的,它必須有?DEVICE?返回來的?Response?。?CMD52?不需要占用DAT?線,讀寫的數(shù)據(jù)是通過?CMD52?或者?Response?來傳送。每次?CMD52?只能讀或者寫一個(gè)?byte?.
?
CMD53?命令:
CMD52?每次只能讀寫一個(gè)字節(jié),因?yàn)橛辛?CMD53?對(duì)讀寫進(jìn)行了擴(kuò)展,?CMD53?允許每次讀寫多個(gè)字節(jié)或者多個(gè)塊(BLOCK)?。?CMD53?的命令格式如下:
???????第一位是?1,?為開始位,然后是一位方向位,總是?1?,代表方向?yàn)?HOST?向?DEVICE?設(shè)備傳送,其后?6?位為命令號(hào),這里是?110101b?,用十進(jìn)制表示為?53?,?CMD53?的名字也由此而來。
???????然后是?1?位的讀寫標(biāo)志。接著是?3?位功能號(hào),這個(gè)同?CMD52?都是相同的。?Block? ?Mode?如果?1?代表是塊傳輸模式,否則為字節(jié)傳輸模式。
???????OP Code?為操作位,如果是?0?,代表數(shù)據(jù)往固定的位置讀寫,如果?1?代表是地質(zhì)增量讀寫。例如,對(duì)地址?0?固定讀寫16?個(gè)字節(jié),相當(dāng)于?16?次讀寫的地址?0?,而對(duì)地址?0?增量讀寫?16?個(gè)字節(jié),相當(dāng)于讀寫?0~15?地址的數(shù)據(jù)。
???????然后是?17?位的地址寄存器,可以尋址到?128K?字節(jié)的地址,然后是?9?位的讀寫的計(jì)數(shù),對(duì)于字節(jié)讀取,讀寫大小就是這個(gè)計(jì)數(shù),而對(duì)于塊讀寫,讀寫的大小是計(jì)數(shù)乘以塊的大小。
???????隨后的?7?位為?CRC?校驗(yàn)碼。最后一位為?1?。
???????當(dāng)讀寫操作是塊操作的時(shí)候,塊的大小是可以通過設(shè)置?FBR?中的相關(guān)寄存器來設(shè)置。
???????同?CMD52?命令不同的是,?CMD53?沒有返回的命令的,這里判斷是否?DEVICE?設(shè)備讀寫完畢是需要驅(qū)動(dòng)里面自己判斷的,一般有?2?個(gè)方法,?1.?設(shè)置相應(yīng)的讀寫完畢中斷。如果?DEVICE?設(shè)備讀寫完畢,則對(duì)?HOST?設(shè)備發(fā)送中斷。?2.HOST?設(shè)備主動(dòng)查詢?DEVICE?設(shè)備是否讀寫完畢,可以通過?CMD?命令是否有返回來判斷是否?DEVICE?是否讀寫完畢。
——————————————————————————————————————
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 结构体后面定义一个空数组的含义
- 下一篇: 802.x协议介绍