面對(duì)不斷發(fā)展和多樣化的應(yīng)用程序需求,數(shù)據(jù)中心面臨著提高運(yùn)營(yíng)效率并最大化其在硬件基礎(chǔ)設(shè)施中的 IT 投資的艱巨任務(wù)。僅去年一年,全球數(shù)據(jù)中心在服務(wù)器和存儲(chǔ)基礎(chǔ)設(shè)施上的支出就超過(guò)140億美元,但仍然沒(méi)有以最高效率運(yùn)行。
需要新的架構(gòu)來(lái)更好地利用和優(yōu)化跨越計(jì)算、內(nèi)存和存儲(chǔ)的硬件資產(chǎn)。在將物理計(jì)算、內(nèi)存和存儲(chǔ)資源視為可組合構(gòu)建塊的情況下,實(shí)現(xiàn)資源敏捷性是提高效率和消除閑置和未充分利用資產(chǎn)的關(guān)鍵。
微控制器 (MCU) 最基本的元素之一是 I/O – 引腳數(shù)量、灌電流和拉電流強(qiáng)度以及可用的功能。在某些情況下,系統(tǒng)的I/O需求與微控制器的內(nèi)存大小之間可能會(huì)出現(xiàn)不匹配。通常,可用的I / O越多,包含的內(nèi)存就越多,這使得微控制器更加昂貴。
I/O 擴(kuò)展器通過(guò)串行通信(通常為 I 2C 或 SPI)為主微控制器提供額外的 I/O 組。I/O擴(kuò)展器的常見(jiàn)用例包括簡(jiǎn)化PCB布線、改善功耗和物理縮小主微控制器。
參見(jiàn)圖1。I/O 擴(kuò)展器的使用示例
I/O擴(kuò)展器ASIC是一種常見(jiàn)的商品,但是每個(gè)ASIC的功能和用例略有不同,這可能會(huì)在設(shè)計(jì)過(guò)程中引起頭痛。然而,I/O擴(kuò)展器是一種相對(duì)簡(jiǎn)單的數(shù)字設(shè)備,可以使用微控制器進(jìn)行仿真,例如新的PIC16F15244系列。與相關(guān)的基于 ASIC 的解決方案相比,這可以產(chǎn)生更大的設(shè)計(jì)靈活性、功能,甚至更低的物料清單 (BOM) 成本。然而,由于更專業(yè)的硬件,基于ASIC的解決方案在空間和功率效率方面占上風(fēng)。
為了演示此概念的靈活性,我們創(chuàng)建了 2 個(gè)單獨(dú)的代碼示例。第一個(gè)代碼示例是一個(gè)非常簡(jiǎn)單的 I/O 擴(kuò)展器。與該項(xiàng)目相關(guān)的固件可以輕松定制,以進(jìn)一步簡(jiǎn)化通信。第二個(gè)代碼示例是一個(gè)非常靈活的“高級(jí)”I/O 擴(kuò)展器,它旨在允許通過(guò) I2C 控制幾乎所有 I/O 設(shè)置,而不是依賴于預(yù)設(shè)功能。
兩個(gè) I/O 擴(kuò)展器示例具有共同的功能和大部分代碼庫(kù)。與許多I2 C器件一樣,尋址線分配給一些未使用的I/O,以設(shè)置I2C地址的一些位,這提供了設(shè)計(jì)靈活性,無(wú)需額外編程。與ASIC不同,這些分配可以在軟件中更改,重新路由或重新排序。此外,該器件還提供一條外部中斷線 (INT),以發(fā)出 I/O 電平變化的信號(hào)。對(duì)于公共線路,INT 可以是漏極開(kāi)路,也可以是推挽式(如果該線路是專用的)。
簡(jiǎn)單的 I/O 擴(kuò)展器
在深入了解高級(jí) I/O 擴(kuò)展器之前,讓我們看一下簡(jiǎn)單的擴(kuò)展器。在此示例中,每個(gè) I/O 線都有兩種連續(xù)狀態(tài)(假設(shè)代碼未修改):弱上拉輸入或輸出 LOW。弱上拉允許I/O擴(kuò)展器在用作輸入時(shí)定義邏輯電平,并且它還關(guān)閉通常會(huì)將電流吸收到擴(kuò)展器中的連接電路。該器件內(nèi)部弱上拉的強(qiáng)度約為 10 或 100 μA。
低輸出是一個(gè)更強(qiáng)大的驅(qū)動(dòng)器,每個(gè)I/O能夠吸收高達(dá)25mA的電流,整個(gè)器件的電流為300mA(-40C至+85C)。有關(guān)這些限制的更多信息,請(qǐng)參閱器件數(shù)據(jù)表的電氣特性部分。從輸出狀態(tài)轉(zhuǎn)換到輸入狀態(tài)時(shí)可能遇到的一個(gè)問(wèn)題是I/O線路上寄生電容的充電時(shí)間。該電容會(huì)導(dǎo)致從0到1的轉(zhuǎn)換延遲,這可能會(huì)觸發(fā)變化時(shí)中斷電路。為了將這些影響降至最低,可以將簡(jiǎn)單的I/O擴(kuò)展器配置為暫時(shí)打開(kāi)高端I/O驅(qū)動(dòng)器,以便在切換到弱上拉之前快速對(duì)該電容進(jìn)行充電。
參見(jiàn)圖2。I/O 線的轉(zhuǎn)換
高端 I/O 驅(qū)動(dòng)程序的運(yùn)行時(shí)間可在軟件中配置,如果需要,可以禁用。下圖顯示了使用這種方法增強(qiáng)的上升時(shí)間 - 注意圖像中時(shí)間尺度從20μs/div到40ns/div的變化。注意:我們不建議在任何配置下直接驅(qū)動(dòng)電容器。
參見(jiàn)圖 3。無(wú)高端 I/O – 1nF 負(fù)載
參見(jiàn)圖 4。高端 I/O 開(kāi)啟 – 1nF 負(fù)載
簡(jiǎn)單的 I/O 擴(kuò)展器 – 通信
I2C與這個(gè)例子的通信也非常簡(jiǎn)單。完整的I 2 C通信只需要2個(gè)字節(jié)的讀寫。在I2C寫入中,數(shù)據(jù)的第一個(gè)字節(jié)是一個(gè)位圖,它將每個(gè)I/O行(由單個(gè)位表示)設(shè)置為輸入或輸出。發(fā)送的所有其他數(shù)據(jù)字節(jié)都將被丟棄,開(kāi)發(fā)人員可以省略。
參見(jiàn)圖 5。簡(jiǎn)單的 I/O 擴(kuò)展器,I2C 寫入
在I2C讀取中,從器件讀取的字節(jié)是一個(gè)位圖,表示每個(gè)I/O行的數(shù)字值,可通過(guò)PORT寄存器在內(nèi)部訪問(wèn)。
參見(jiàn)圖 6。簡(jiǎn)單 I/O 擴(kuò)展器,I2C 讀取
高級(jí) I/O 擴(kuò)展器
開(kāi)發(fā)高級(jí) I/O 擴(kuò)展器的目標(biāo)是提供比上面顯示的簡(jiǎn)單變體功能更全面的程序。由于串行通信極其簡(jiǎn)單,簡(jiǎn)單的I/O擴(kuò)展器具有許多局限性,并且無(wú)法利用PIC16F15244系列中可用的以I/O為中心的功能,例如輸入電平控制、漏極開(kāi)路輸出、變化時(shí)可屏蔽中斷和弱上拉使能。
相比之下,這個(gè)更復(fù)雜的示例可以配置板載I/O的幾乎所有功能。為了實(shí)現(xiàn)此功能集,程序使用查找表來(lái)確定要訪問(wèn)的寄存器或要執(zhí)行的功能。圖7顯示了一個(gè)示例應(yīng)用,其中微控制器充當(dāng)鍵盤控制器,在按下按鍵時(shí)通知主微控制器。(此示例將在以后的帖子中展開(kāi)。
參見(jiàn)圖 7。高級(jí) I/O 擴(kuò)展器作為帶鎖定指示器的鍵盤控制器
高級(jí) I/O 擴(kuò)展器 – 程序結(jié)構(gòu)
圖8是器件中“寄存器”的查找表。表中的某些寄存器實(shí)際存在于每個(gè)PIC16F15244系列器件上,例如TRIS和LAT,而其他寄存器(如ERROR)是“虛擬的”。虛擬寄存器特定于此程序,僅存在于RAM中。
參見(jiàn)圖 8。I/O 高級(jí)擴(kuò)展器的寄存器映射
這種查找表結(jié)構(gòu)的一個(gè)好處是可以靈活地重新排列寄存器,這可用于優(yōu)化串行通信或減少軟件故障干擾關(guān)鍵設(shè)置的機(jī)會(huì)。
查找表分為兩個(gè)單獨(dú)的函數(shù),用于讀取和寫入。這將創(chuàng)建一個(gè)簡(jiǎn)單可靠的權(quán)限方案,但代價(jià)是代碼大小。例如,要?jiǎng)?chuàng)建只讀函數(shù),只需從寫入查找表中省略地址即可。
高級(jí) I/O 擴(kuò)展器 – 通信
與此示例的通信比簡(jiǎn)單的 I/O 擴(kuò)展器更復(fù)雜。在執(zhí)行讀取或?qū)懭胫?,控制器必須指示要開(kāi)始讀取或?qū)懭氲牡刂贰?/p>
I2C 寫入使用第一個(gè)數(shù)據(jù)字節(jié)來(lái)設(shè)置要開(kāi)始的地址。然后,下一個(gè)字節(jié)用于加載該地址的數(shù)據(jù)。然后,地址將遞增以發(fā)送數(shù)據(jù)的下一個(gè)字節(jié)。只要地址仍然可寫且有效,此過(guò)程就可以重復(fù),如下所示。如果寫入了無(wú)效或只讀地址,則地址不會(huì)遞增,并且設(shè)備不會(huì)確認(rèn) (NACK) 以指示發(fā)生了錯(cuò)誤。
參見(jiàn)圖 9。高級(jí) I/O 擴(kuò)展器,I2C 寫入流程圖
參見(jiàn)圖 10。高級(jí) I/O 擴(kuò)展器,I2C 寫入
對(duì)于 I2C 讀取,必須首先設(shè)置要讀取的地址。通常,這是通過(guò)寫入設(shè)備的單個(gè)數(shù)據(jù)字節(jié)完成的,盡管某些操作可能會(huì)為方便起見(jiàn)自動(dòng)設(shè)置地址。I2C 總線停止,然后在讀取模式下再次啟動(dòng)。
讀取的第一個(gè)數(shù)據(jù)字節(jié)發(fā)生在地址集。讀取此字節(jié)后,地址將遞增,因此下一次讀取發(fā)生在地址 + 1、地址 + 1 處,依此類推。如果遇到無(wú)效區(qū)域或只寫區(qū)域,則程序?qū)⑼V惯f增地址并返回2x0,直到停止讀取。圖00顯示了兩個(gè)寄存器的示例讀取。
參見(jiàn)圖 11。高級(jí) I/O 擴(kuò)展器,I2C 讀取流程圖
請(qǐng)參見(jiàn)圖 12。高級(jí) I/O 擴(kuò)展器,I2C 讀取
高級(jí) I/O 擴(kuò)展器 – 功能
該程序存儲(chǔ) 8 個(gè) I/O 相關(guān)設(shè)置,所有這些設(shè)置都更詳細(xì)地記錄在器件數(shù)據(jù)表中。唯一未保存的 I/O 設(shè)置是模擬選擇 (ANSEL) 和端口。假設(shè) I/O 擴(kuò)展器始終是數(shù)字的,因此 ANSEL 是一個(gè)常量值。PORT 值是 I/O 組的邏輯電平,取決于電路條件。
當(dāng)引用這些寄存器時(shí),“x”(例如:TRISx)是指可以分配的可選I/O組。默認(rèn)情況下,此示例使用銀行 C。
? 三態(tài)方向控制 [TRISx] – 控制線路是輸出 (0) 還是輸入 (1)。
·鎖存器 [LATx] – 設(shè)置 I/O 驅(qū)動(dòng)程序的輸出值。
·更改時(shí)中斷正邊沿 [IOCxP] – 啟用所選引腳上的上升沿是否生成中斷。
·更改時(shí)中斷負(fù)邊沿 [IOCxN] – 啟用所選引腳上的下降沿是否生成中斷。
·弱上拉 [WPUx] – 為每個(gè)選定的 I/O 啟用弱上拉。
? 輸入電平控制 [INLVLx] – 為每個(gè)引腳選擇 TTL 或施密特觸發(fā)器 CMOS 輸入閾值。
? 漏極開(kāi)路控制 [ODCONx] – 為所選引腳啟用漏極開(kāi)路輸出功能。
? 壓擺率控制 [SLRCONx] – 啟用壓擺率限制,以提高所選引腳的 EMI 性能。
高級(jí) I/O 擴(kuò)展器 – 內(nèi)存操作
作為附加功能,此代碼示例支持還原默認(rèn)設(shè)置、保存、加載或保存并將其設(shè)置加載到內(nèi)部非易失性存儲(chǔ)器的功能。PIC16F15244系列沒(méi)有EEPROM,但是通過(guò)啟用存儲(chǔ)區(qū)域閃存(SAF),可以將一小部分程序閃存(PFM)標(biāo)記為不可執(zhí)行。
參見(jiàn)圖 13。內(nèi)存存儲(chǔ)
圖 13 顯示了內(nèi)部存儲(chǔ)配置的方式。僅使用單個(gè)內(nèi)存行(32 個(gè) 14 位字)來(lái)存儲(chǔ)設(shè)置。此配置簡(jiǎn)化了內(nèi)存管理,并將剩余的不可執(zhí)行內(nèi)存留給其他用途。
可配置的 I/O 設(shè)置與簡(jiǎn)單的(軟件創(chuàng)建的)CRC-8 校驗(yàn)和一起保存到 PFM 中,以驗(yàn)證配置的完整性。為了將CRC打包到可用空間中,它被分成2位的塊,并附加到每個(gè)配置的前4個(gè)設(shè)置。
參見(jiàn)圖 14。內(nèi)存操作字節(jié)
如果加載的配置未通過(guò)校驗(yàn)和驗(yàn)證,則不會(huì)將其加載到相應(yīng)的寄存器中。對(duì)于內(nèi)存負(fù)載,I/O引腳行為可以在內(nèi)存操作字節(jié)中指定,如圖14所示。如果負(fù)載失敗,引腳將保持該狀態(tài),直到重新配置。
I/O 設(shè)置可以保存并加載到運(yùn)行時(shí)四種配置中的任何一種。作為編譯選項(xiàng),開(kāi)發(fā)人員或設(shè)計(jì)人員可以將設(shè)備設(shè)置為在啟動(dòng)時(shí)嘗試加載配置 0,而不是默認(rèn)值,這可以用作不需要完全重新編程操作的簡(jiǎn)單固件更新。如果配置 0 未通過(guò) CRC 驗(yàn)證,程序?qū)⑹褂媚J(rèn) I/O 設(shè)置啟動(dòng)。
設(shè)備上的默認(rèn) I/O 設(shè)置定義為常量,開(kāi)發(fā)人員可以根據(jù)應(yīng)用程序的需要設(shè)置這些常量。程序不會(huì)修改這些默認(rèn)值,并被視為已知的良好值。運(yùn)行內(nèi)存操作“加載默認(rèn)值”將使用這些默認(rèn)值加載寄存器。
作為故障保護(hù),所有內(nèi)存操作(不包括啟動(dòng)時(shí)的負(fù)載)都需要特定的字節(jié)序列來(lái)“解鎖”操作。這減少了軟件故障擦除或覆蓋設(shè)置的可能性。
結(jié)論
如本文所示,在需要I/O配置靈活性或在單個(gè)系統(tǒng)中利用大量I/O擴(kuò)展器的應(yīng)用中,簡(jiǎn)單的8位微控制器可以合理地替代通用I/O擴(kuò)展器ASIC。這兩個(gè)示例所需的固件可通過(guò)以下鏈接在 Github 上找到。Github中還提供了使用Arduino Uno的高級(jí)I / O Expander的演示庫(kù)和代碼。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7544瀏覽量
151323 -
mcu
+關(guān)注
關(guān)注
146文章
17129瀏覽量
351007 -
擴(kuò)展器
+關(guān)注
關(guān)注
0文章
129瀏覽量
15188
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論