引言
隨著嵌入式系統(tǒng)小型化的趨勢,市場對減少器件間通信所用的I/O引腳數(shù)的需求與日俱增。Microchip科技公司開發(fā)的UNI/O總線正滿足了這一需求,這個低成本且易于實(shí)現(xiàn)的解決方案,僅需要使用一個I/O引腳就可實(shí)現(xiàn)主從器件之間的通信。
1 UNI/O總線介紹
1.1 UNI/O總線的特點(diǎn)
UNI/O總線具有如下特點(diǎn):
①UNI/O總線采用曼徹斯特編碼,只需一根信號線SCIO就可以實(shí)現(xiàn)數(shù)據(jù)的串行傳輸和同步控制。
②UNI/O總線是一種單主型總線。主器件負(fù)責(zé)肩動和控制總線上的所有操作,決定總線的工作速度。主器件通常由單片機(jī)、ASIC等充當(dāng)。
③UNI/O總線具有雙向通信能力。有主發(fā)送從接收和從發(fā)送主接收兩種工作方式。
④UNI/O總線速度為10~100kbps。
⑤UNI/O從器件必須具有空閑模式和待機(jī)模式,也可選擇具有保持模式。
1.2 UNI/O總線的幀格式
1.2.1 位值定義
由于采用的是曼徹斯特編碼,所以其位值由佗周期中間的信號跳變方向決定。UNI/O總線規(guī)定:從高到低的跳變是0,從低到高的跳變是1。
1.2.2 幀結(jié)構(gòu)
在UNI/O總線上進(jìn)行通信時,指令、數(shù)據(jù)和地址的傳送都以字節(jié)為單位。字節(jié)傳送時,高位在前,低位在后,前一個位之后立即傳輸下一個位,位與位之間沒有延遲。字節(jié)之后必須發(fā)送應(yīng)答序列,進(jìn)行主從應(yīng)答。圖1給出了通常情況下使用的基本字節(jié)幀結(jié)構(gòu)。
(1)主應(yīng)答位
由主器件發(fā)送,取值為1或0。為1時稱之為MAK,MAK告知從器件指令執(zhí)行將繼續(xù);為0時稱之為NoMAK,NoMAK用來結(jié)束當(dāng)前指令,此后如有必要,從器件可以啟動相應(yīng)的內(nèi)部處理。
(2)從應(yīng)答位
由被選定作為通信對象的從器件發(fā)送。該位為1時稱之為SAK,SAK表明其前面的操作已成功完成;非1時稱之為NoSAK。在從器件被選定之前,由于無從器件應(yīng)答,從應(yīng)答位應(yīng)為NoSAK。在從器件被選定之后,NoSAK用來表明通信產(chǎn)生了錯誤。
另外,UNI/O總線也考慮了對主器件的中斷功能的支持。當(dāng)主器件與具有保持模式的從器件進(jìn)行通信時,如果主器件在下一個MAK位周期時間內(nèi)持續(xù)拉低SCIO,從器件就進(jìn)入了保持模式。要維持在保持模式應(yīng)繼續(xù)使SCIO為低電平。當(dāng)從器件處在保持模式時,主器件就可以進(jìn)行對其他I/O設(shè)備的中斷處理工作,中斷處理結(jié)束后可通過發(fā)送MAK來終止保持過程,并繼續(xù)之前的通信。圖2給出了包含保持過程的字節(jié)幀結(jié)構(gòu)。
1.3 UNI/O總線的命令序列
UNI/O總線的命令序列是指完成一條指令的執(zhí)行主從器件,需要在總線上傳送的各種信號和字節(jié)幀的有序組合。在UNI/O總線系統(tǒng)中,一條指令的執(zhí)行過程必須包括:總線準(zhǔn)備、主從同步、從器件選擇、指令傳輸和指令執(zhí)行等環(huán)節(jié)。
1.3.1 總線定義的信號
(1)待機(jī)脈沖
待機(jī)脈沖是由主器件驅(qū)動SCIO到高電平狀態(tài),并保持此狀態(tài)600μs以上形成的脈沖信號。待機(jī)脈沖通常用來通知總線上的所有從器件進(jìn)入待機(jī)模式,也可以用來提前終止一條指令的執(zhí)行。在執(zhí)行一條指令時,如果是第一條指令,或者要選擇的從器件與上一條指令不同,或者上一條指令的執(zhí)行過程發(fā)生了錯誤,本條指令的執(zhí)行都必須從產(chǎn)生待機(jī)脈沖開始。
(2)TSS信號
TSS信號是由主器件驅(qū)動SCIO到高電平狀態(tài),并保持此狀態(tài)10μs以上形成的脈沖信號。在一條指令成功執(zhí)行之后,若還要執(zhí)行下一條指令來對同一個從器件進(jìn)行操作,則后一條指令執(zhí)行過程的第一步只需產(chǎn)生一個TSS信號,而不需要再產(chǎn)生待機(jī)脈沖。這樣,通信效率會更高。
1.3.2 特殊功能字節(jié)幀
(1)起始頭
起始頭用來使從器件進(jìn)入正常工作模式,并同步從器件內(nèi)的時鐘。起始頭由5μs以上的持續(xù)低電平脈沖和緊跟其后的8位編碼“01010 101”組成。所有的從器件都可以從起始頭中獲知位周期的長短,并以此為依據(jù)調(diào)整內(nèi)部時鐘,實(shí)現(xiàn)主從同步。起始頭之后的主應(yīng)答位應(yīng)為MAK,從應(yīng)答位正常情況應(yīng)為NoSAK。
(2)地址幀
地址幀用于選擇總線上特定的從器件進(jìn)行通信。從器件地址有8位和12位兩種類型,由4位系列碼和4位或8位從器件碼組成。8位地址的傳輸只需一個地址幀,正常情況,其應(yīng)答序列由MAK和SAK組成。12位地址的傳輸需要兩個字節(jié)幀:高地址字節(jié)幀和緊跟其后的低地址字節(jié)幀。正常情況,低地址字節(jié)幀中的應(yīng)答序列應(yīng)該由MAK和SAK組成,高地址字節(jié)幀中的應(yīng)答序列則由MAK和NoSAK組成。
(3)指令幀
指令幀用于傳送指令,由指令編碼和應(yīng)答序列組成。指令及其編碼往各種UNI/O從器件中定義。指令幀中的主應(yīng)答位應(yīng)根據(jù)指令是否要求傳輸其他數(shù)據(jù)字節(jié)確定。當(dāng)指令要求傳輸其他數(shù)據(jù)字節(jié)時,該位為MAK,否則為NoMAK。從應(yīng)答位正常情況下為SAK。
1.3.3 UNI/O總線的命令序列
圖3所示的是用于執(zhí)行8位地址從器件指令的命令序列。其中字節(jié)幀的數(shù)量在總線規(guī)范中未進(jìn)行限制,只要前一個字節(jié)幀中的主應(yīng)答位為MAK就表示期望傳輸下一個字節(jié)幀。不過,字節(jié)幀的實(shí)際數(shù)量必須符合從器件指令的使用規(guī)范。在此前提下,可以由用戶程序根據(jù)其功能決定。用于執(zhí)行12位地址從器件指令的命令序列如圖4所示。
2 UNI/O從器件與單片機(jī)的接口設(shè)計(jì)
11XXX系列EEPROM是Microchip技術(shù)公司最新推出的、支持UNI/O總線協(xié)議的存儲器產(chǎn)品。下面就以該存儲器的使用為例,詳細(xì)介紹UNI/O總線系統(tǒng)的應(yīng)用設(shè)計(jì)方法。
2.1 硬件設(shè)計(jì)
圖5給出了11XXX系列EEPROM與單片機(jī)的接口原理圖。圖中,SCIO引腳上接一個20 kΩ的上拉電阻是為了確保總線在上電/掉電序列期間以及未被驅(qū)動時處于空閑狀態(tài)。VCC和VSS之間接入一個0.1μF的去耦電容是為了濾除VCC上的噪聲。
2.2 軟件設(shè)計(jì)
2.2.1 UNI/O存儲器11XXX的操作指令
11XXX系列存儲器共有9條操作指令,其指令編碼和功能描述如表1所列。
2.2.2 UNI/O存儲器11XXX的高級特性
11XXX器件除了具有EEPROM存儲器的基本特性、支持UNI/O總線協(xié)議外,還有以下高級特性。這些高級特性也是編寫接口程序的基本依據(jù)。
(1)內(nèi)置了一個狀態(tài)寄存器
狀態(tài)寄存器可以用來提供狀態(tài)信息和片內(nèi)數(shù)據(jù)的保護(hù)控制。其各位的功能定義如下:
①Bit0。為寫進(jìn)行位WIP,用于表明11XXX是否忙于寫操作。當(dāng)它為1時,表明正在進(jìn)行寫操作;為0時,表明沒有進(jìn)行寫操作。此位只讀。要編寫高效率的寫存儲陣列程序,可采用WIP查詢來及時檢測寫周期的結(jié)束。
②Bit1。為寫使能鎖存器位WEL,用于表明寫使能鎖存器的狀態(tài)。當(dāng)它為1時,鎖存器允許存儲陣列無保護(hù)塊和狀態(tài)寄存器的寫入操作;當(dāng)置為0時,禁止寫入操作。只能使用WREN指令來將此位置1,但會在上電或成功執(zhí)行了以下指令之一時復(fù)位。這些指令包括:WRDI、WRSR、WRITE、SETAL和ERAL。
③Bit2~Bit3。是塊保護(hù)位BP0和BP1,用于表明當(dāng)前哪些塊被寫保護(hù)。這些位可以由用戶通過WRSR指令進(jìn)行設(shè)置。這些位是非易失性的。表2給出了利用BP0和BP1對存儲器進(jìn)行分塊保護(hù)的方案。
④Bit4~Bit7。為無關(guān)位,讀出時為0。
(2)包含一個讀操作地址指針
在進(jìn)行存儲陣列讀操作時,瀆操作地址指針會在每個字節(jié)發(fā)送后自動指向原地址加1的存儲單元。當(dāng)?shù)竭_(dá)最高地址時,如果主器件仍然發(fā)出MAK選擇繼續(xù)讀取,則地址指針的值會翻轉(zhuǎn)回到0x00地址處。在上電后,讀地址指針會保持上一次訪問的存儲單元的地址。
(3)支持頁寫功能
用WRITE指令可以向指定地址的存儲單元或者指定地址開始的存儲器區(qū)域?qū)懭雰?nèi)容任意的數(shù)據(jù)。不過,在寫多個存儲單元時,必須限制在單個物理頁面內(nèi)寫。物理頁邊界從頁大小(16字節(jié))整數(shù)倍的地址開始,結(jié)束于頁大小的整數(shù)倍減1的地址。如果WRITE指令試圖跨越物理頁邊界進(jìn)行,其結(jié)果是將超出頁邊界的數(shù)據(jù)寫回到當(dāng)前頁的開始,即覆蓋先前存儲的數(shù)據(jù),而不會如期望的那樣寫到下一貞。
2.2.3 UNI/O存儲器11XXX的讀寫程序
上電之后,由于11XXX處在關(guān)斷模式,而且總線處于高電平空閑狀態(tài),所以主器件必須先在SCIO上產(chǎn)生一個高到低再到高的脈沖,使11XXX從關(guān)斷模式退出進(jìn)入空閑模式,這樣11XXX才能按照命令序列所規(guī)定的流程響應(yīng)總線上的其他信號,接收主器件發(fā)來的指令,并按指令要求完成規(guī)定的操作。
(1)寫程序流程
圖6是寫存儲陣列中未保護(hù)區(qū)塊的程序流程。圖中發(fā)送指令的操作可通過調(diào)用發(fā)送指令子程序來完成。圖7給出了發(fā)送指令程序流程。要寫存儲陣列中受保護(hù)的區(qū)塊,只需在執(zhí)行WREN指令之前,用WRSR指令對BP0、BP1進(jìn)行相應(yīng)的設(shè)置,以暫時解除待寫區(qū)塊的保護(hù),并在程序的最后再用WRSR指令對它們進(jìn)行恢復(fù)即可。要全地址空間置1或擦除,必須先解除對整個存儲陣列的保護(hù)并使能寫操作,再發(fā)送SETAL或ERAL指令,指令發(fā)送之后用NoMAK來啟動內(nèi)部寫操作,內(nèi)部操作完成之后恢復(fù)對存儲陣列的保護(hù)即可。
(2)讀程序流程
隨機(jī)讀存儲陣列的程序流程是:先發(fā)送READ指令,再發(fā)送待讀單元地址。先高地址字節(jié),后低地址字節(jié)。然后,從器件就會將該地址中的數(shù)據(jù)送到總線上,主器件收到第一個數(shù)據(jù)字節(jié)后,若還要讀取更多的數(shù)據(jù),可以發(fā)送應(yīng)答信號MAK。之后,從器件用SAK應(yīng)答,并送出下一個數(shù)據(jù)字節(jié)。若要結(jié)束讀操作,主器件只要發(fā)送NoMAK即可。
要從存儲陣列的當(dāng)前位置讀取數(shù)據(jù)可用CRRD指令來進(jìn)行操作,其程序流程除了不需要傳送存儲器單元地址外,其余操作步驟與READ相同。
結(jié)語
UNI/O總線只有一根信號線,對I/O端口的占用最少,可有效地減小嵌入式系統(tǒng)的體積并降低產(chǎn)品成本,具有廣闊的應(yīng)用前景。
責(zé)任編輯:gt
評論
查看更多