前面介紹了初始化過程中涉及到的三條命令CMD5/CMD3/CMD7(屬于SDIO層面),現(xiàn)在繼續(xù)來介紹SDIO/iSDIO的寄存器(屬于SDIO層面)和訪問寄存器的CMD52/CMD53命令(屬于SDIO層面)。
SDIO協(xié)議是基于SD卡協(xié)議而來, 而iSDIO又是在SDIO基礎(chǔ)上定義的一類智能卡,iSDIO Wireless LAN則是iSDIO類卡的一個(gè)具體的實(shí)例。
即對(duì)應(yīng)SD->SDIO->iSDIO->WLAN這幾個(gè)層級(jí),規(guī)格書分別對(duì)應(yīng)以下:
[REF1]SD Specifications Part 1 Physical Layer Specification Version 3.01 February 18, 2010
[REF2]SD Specifications?Part E1?SDIO Simplified Specification?Version 3.00?July 25, 2018
[REF3]SD Specifications Part E7 iSDIO Simplifed Specification Version 1.10 July 25, 2018
[REF4]SD Specifications Part E7 Wireless LAN Simplified Addendum Version 1.10 July 25, 2018
[REF3] 1.3章節(jié)中的如下框圖,很好的介紹了iSDIO的拓?fù)浣Y(jié)構(gòu)。
Part1是SD卡的協(xié)議[REF1]。
在SD卡協(xié)議基礎(chǔ)上定義了SDIO的協(xié)議PartE1[REF2],SDIO相對(duì)于SD卡,增加了第9類命令中的IO_RW_DIRECT (CMD52)和IO_RW_EXTENDED(CMD53),用于快速的進(jìn)行I/O卡的字節(jié)和塊訪問,見[REF2]的第5章。SDIO同時(shí)定義了其寄存器空間,見[REF2]的6.7章節(jié)。
然后在SDIO基礎(chǔ)之上定義了iSDIO的協(xié)議[REF3],iSDIO可以通過SDIO方式即CMD52/CMD53操作,也可以使用SD卡方式CMD48和CMD49操作。同時(shí)在SDIO寄存器空間基礎(chǔ)上,定義了iSDIO的寄存器見[REF3]的2.2章節(jié),相對(duì)SDIO空間一樣只是定義了更多iSDIO相關(guān)的寄存器。
iSDIO是智能卡類別總的協(xié)議,在此之上定義具體的設(shè)備比如WIFI,藍(lán)牙等的協(xié)議,其中PartE7 Wireless LAN[REF4]是WIFI的協(xié)議,在iSDIO基礎(chǔ)上進(jìn)一步定義了其相關(guān)寄存器[REF4]的第3章節(jié),相對(duì)iSDIO空間一樣只是定義了更多WIFI相關(guān)的寄存器。

[REF3]的第二章,在[REF2]第六章SDIO基礎(chǔ)上,定義了iSDIO的功能寄存器空間。
可以通過CMD52/53或者CMD48/49訪問這些寄存器。
寄存器地址空間按照Function為單位劃分,每個(gè)Function的空間都是128KB,其中Function 0即CIA是必須要有的,Function 0又劃分為CCCR,FBR1~7,General Informationm ,RFU ,CIS Area, RFU幾個(gè)部分,這些部分每個(gè)設(shè)備都是一樣的。除了Function 0還可以有1~7個(gè)Function(Function Unique Register),這些Function是不同設(shè)備自定義實(shí)現(xiàn)的。
上一篇文章介紹了CMD5命令,卡會(huì)響應(yīng)該命令,字段Number of I/O functions即代表的這些自定義的Function個(gè)數(shù)。
如下所示,寄存器空間采用二級(jí)索引,即先根據(jù)Function Number找到對(duì)應(yīng)Function,然后使用Register Address找到該功能內(nèi)的具體的某一個(gè)寄存器。所以在命令CMD52,CMD53中需要這兩個(gè)參數(shù)。且Function Number只需要3位可以表示0~7,即自定義的Function個(gè)數(shù)是最多7個(gè),其序號(hào)從1開始即1~7. 訪問128KB空間,Register Address需要17位。
SDIO規(guī)格書中寄存器空間如下

iSDIO規(guī)格書中地址空間如下

iSDIO對(duì)于function 0統(tǒng)一定義為以下部分:CCCR,FBR1~7,CIS.
以下表格總結(jié)了,分別使用SD卡模式和SDIO模式訪問,需要實(shí)現(xiàn)的寄存器

[REF2]的6.9章節(jié)定義了SDIO完整的CCCR寄存器,iSDIO無需實(shí)現(xiàn)所有的,

iSDIO要求白色背景的是必須實(shí)現(xiàn)的,其他是可選實(shí)現(xiàn)的,見[REF3]的2.2.1.1

[REF2]的6.10章節(jié),定義了SDIO詳細(xì)的FBR寄存器。

iSDIO在此基礎(chǔ)上增加了如下粗體字部分見[REF3]的2.2.1.2

[REF2]的6.11定義了SDIO的CIS寄存器

iSDIO增加了如下粗體字部分,見[REF3]的2.2.1.3

IO_RW_DIRECT(CMD52)是用于按照字節(jié)為單位訪問I/O功能中128K寄存器空間,包括公共I/O區(qū)域(CIA)。一般用于初始化功能的寄存器和查看狀態(tài)。
格式如下

32位的命令參數(shù)劃分為了Function Number~Write Data or Stuff Bits這幾個(gè)字段。
S,D,Conmand Index,CRC7,E這些字段和SD卡命令格式一樣,所以不再介紹,只介紹后面參數(shù)部分。
其中Function Number和Register Address即前面介紹的功能寄存器空間尋址的兩個(gè)參數(shù)。
R/W Flag: 0表示讀寄存器,讀到的寄存器內(nèi)容通過R5響應(yīng)返回(見后面一小節(jié)),如果設(shè)置為1表示寫寄存器。
RAW flag: 這個(gè)bit設(shè)置為1,則R/W Flag=1寫寄存器時(shí),同時(shí)立即回讀寫入的值返回,無需再單獨(dú)進(jìn)行一次讀來確認(rèn)寫入結(jié)果。如果設(shè)置為0則返回寫入的寄存器值(不是回讀出來的)。
Write Data: 對(duì)于寫,則填充待寫的寄存器內(nèi)容,讀則設(shè)置為0.
Stuff位都寫0
CMD52響應(yīng)R5,內(nèi)容如下
S,D,Command Index,Stuff,CRC7,E這些和SD卡都是一樣的,不再贅述,只介紹Respense Flasgs BIt和 Read or Write Data字段。

Response Flags?Bit: 表示8位的卡狀態(tài),定義如下


Read or Write Data:
如果是讀寄存器則返回的是讀到的寄存器內(nèi)容,
如果是寫寄存器且RAW flag=1則是寫入后,再重新讀出來的寄存器值,
如果是寫寄存器且RAW flag=0,則返回的就是寫入命令中的值(不是回讀值)。
如果是SPI模式則響應(yīng)為16位,如下

CMD52用于單個(gè)寄存器操作,CMD53則用戶批量操作。
格式如下

同樣的只關(guān)注R/W flag,Function Number, Block Mode ,OP Code ,Register Address Byte/Block Count這幾個(gè)參數(shù)。
Function Number和Register Address和CMD52一樣用于尋址寄存器的位置。
R/W flag也和CMD52一樣,1表示寫,0表示讀。
Block Mode用于表示操作模式:設(shè)置為1表示按照block為單位進(jìn)行操作,后面Byte/Block Count即為一次操作的block數(shù)。設(shè)置為0表示則表示按照字節(jié)操作,后面Byte/Block Count即為一次操作的字節(jié)數(shù)。
Function 0的block大小由CCCR寄存器的FN0設(shè)置。Function1~7的block大小由FBR寄存器配置。CCCR寄存器的SMB位表示卡是否支持block模式。
OP Code,操作模式,1表示地址自動(dòng)遞增,0表示不自動(dòng)遞增。

Byte/Block Count 表示要操作的字節(jié)字節(jié)數(shù)或者block數(shù),在block模式時(shí)需要注意的是,設(shè)置為0表示一直讀寫,直到設(shè)置CCCR寄存器的ASx中止。

和CMD52一樣,但是8位的Data填充為0.
CMD53的數(shù)據(jù)傳輸,數(shù)據(jù)不再在命令中,而是和memory的讀寫一樣。
非Block讀寫和CMD17/CMD24類似
Block讀寫則和CMD18/CMD25一樣。如果不是infinite即Count不是0則無需停止直到傳輸完指定的塊,否則需要stop操作進(jìn)行停止。
前面介紹了通過CMD52/CMD52進(jìn)行iSDIO的功能寄存器的操作,iSDIO規(guī)范了功能寄存器的空間和尋址。其中function0是通用的,function1~7是自定義的。不同的具體的iSDIO設(shè)備即實(shí)現(xiàn)不同的功能寄存器即可,通過這些設(shè)備特定的功能寄存器即可操作特定的設(shè)備。
此時(shí)就需要參考具體的設(shè)備的規(guī)格書了,比如iSDIO參考[REF3], 然后再細(xì)分對(duì)應(yīng)具體的WIFI設(shè)備參考[REF4]。
對(duì)于Function0所有的SDIO設(shè)備都是一樣的,而對(duì)于iSDIO則通過Function1~7去額外定義自己的功能寄存器。
我們前面第二章拓?fù)浣Y(jié)構(gòu),可以看到可以通過CMD52/CMD53去操作功能寄存器,但是如何和具體的設(shè)備交互數(shù)據(jù)呢,比如要通過WIFI收發(fā)數(shù)據(jù),數(shù)據(jù)量是很大的,肯定不能通過這些寄存器直接進(jìn)行數(shù)據(jù)傳輸。那么如何實(shí)現(xiàn)呢?通常的做法一般是通過FIFO進(jìn)行數(shù)據(jù)傳輸,
這里也是類似使用了一個(gè)Function Unique Register?的Command Write Register
Port和Response Data Register Port來實(shí)現(xiàn)的,即用某個(gè)Function的某兩個(gè)寄存器地址一個(gè)作為寫,一個(gè)作為讀入口用,讀寫這兩個(gè)寄存器地址即類似于讀寫FIFO。類似于硬件FIFO,讀寫FIFO即讀寫某個(gè)固定的空間(地址固定),iSDIO也是類似的。
見[REF3]的2.2.2章節(jié)。
要寫數(shù)據(jù)則寫某個(gè)Unique Function的寄存器地址為00000h的地方即Command Write RegisterPort。
讀數(shù)據(jù)則讀某個(gè)Unique Function的寄存器地址為00200h的地方即Response Data Register Port。
當(dāng)然為了獲取狀態(tài),能力等還定義了Status寄存器Capability寄存器,廠商自定寄存器等,見[REF3]中的下表。

上述Unique Function,即Function Unique Register1~7中選一個(gè),一般選1, 作為iSDIO Register Map映射。
所以對(duì)于iSDIO的寄存器,實(shí)際就是映射的Function Unique Register1功能寄存器。
換句話說Function 0定義了SDIO通用的寄存器,Function 1定義iSDIO通用的寄存器。
以上分享了SDIO->iSDIO->WIFI卡的的拓?fù)浣Y(jié)構(gòu),CMD52/53命令, 以及寄存器地址空間。以及數(shù)據(jù)通道Command Write Register Port和Response Data Register Port的原理,簡單理解就是讀寫固定寄存器地址,類似于FIFO固定地址的讀寫。以上都是原理協(xié)議上的分享,下一篇實(shí)戰(zhàn)分享CMD52和CMD53的讀寫。