0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將PIC16F15244系列用作I/O擴展器以提高設(shè)計靈活性

星星科技指導員 ? 來源:microchip ? 作者:microchip ? 2023-05-05 10:31 ? 次閱讀

面對不斷發(fā)展和多樣化的應用程序需求,數(shù)據(jù)中心面臨著提高運營效率并最大化其在硬件基礎(chǔ)設(shè)施中的 IT 投資的艱巨任務。僅去年一年,全球數(shù)據(jù)中心在服務器和存儲基礎(chǔ)設(shè)施上的支出就超過140億美元,但仍然沒有以最高效率運行。

需要新的架構(gòu)來更好地利用和優(yōu)化跨越計算、內(nèi)存和存儲的硬件資產(chǎn)。在將物理計算、內(nèi)存和存儲資源視為可組合構(gòu)建塊的情況下,實現(xiàn)資源敏捷性是提高效率和消除閑置和未充分利用資產(chǎn)的關(guān)鍵。

微控制器MCU) 最基本的元素之一是 I/O – 引腳數(shù)量、灌電流和拉電流強度以及可用的功能。在某些情況下,系統(tǒng)的I/O需求與微控制器的內(nèi)存大小之間可能會出現(xiàn)不匹配。通常,可用的I / O越多,包含的內(nèi)存就越多,這使得微控制器更加昂貴。

I/O 擴展器通過串行通信(通常為 I 2C 或 SPI)為主微控制器提供額外的 I/O 組。I/O擴展器的常見用例包括簡化PCB布線、改善功耗和物理縮小主微控制器。

poYBAGRUakmAMyPYAACkSoONLpA941.png

參見圖1。I/O 擴展器的使用示例

I/O擴展器ASIC是一種常見的商品,但是每個ASIC的功能和用例略有不同,這可能會在設(shè)計過程中引起頭痛。然而,I/O擴展器是一種相對簡單的數(shù)字設(shè)備,可以使用微控制器進行仿真,例如新的PIC16F15244系列。與相關(guān)的基于 ASIC 的解決方案相比,這可以產(chǎn)生更大的設(shè)計靈活性、功能,甚至更低的物料清單 (BOM) 成本。然而,由于更專業(yè)的硬件,基于ASIC的解決方案在空間和功率效率方面占上風。

為了演示此概念的靈活性,我們創(chuàng)建了 2 個單獨的代碼示例。第一個代碼示例是一個非常簡單的 I/O 擴展器。與該項目相關(guān)的固件可以輕松定制,以進一步簡化通信。第二個代碼示例是一個非常靈活的“高級”I/O 擴展器,它旨在允許通過 I2C 控制幾乎所有 I/O 設(shè)置,而不是依賴于預設(shè)功能。

兩個 I/O 擴展器示例具有共同的功能和大部分代碼庫。與許多I2 C器件一樣,尋址線分配給一些未使用的I/O,以設(shè)置I2C地址的一些位,這提供了設(shè)計靈活性,無需額外編程。與ASIC不同,這些分配可以在軟件中更改,重新路由或重新排序。此外,該器件還提供一條外部中斷線 (INT),以發(fā)出 I/O 電平變化的信號。對于公共線路,INT 可以是漏極開路,也可以是推挽式(如果該線路是專用的)。

簡單的 I/O 擴展器

在深入了解高級 I/O 擴展器之前,讓我們看一下簡單的擴展器。在此示例中,每個 I/O 線都有兩種連續(xù)狀態(tài)(假設(shè)代碼未修改):弱上拉輸入或輸出 LOW。弱上拉允許I/O擴展器在用作輸入時定義邏輯電平,并且它還關(guān)閉通常會將電流吸收到擴展器中的連接電路。該器件內(nèi)部弱上拉的強度約為 10 或 100 μA。

低輸出是一個更強大的驅(qū)動器,每個I/O能夠吸收高達25mA的電流,整個器件的電流為300mA(-40C至+85C)。有關(guān)這些限制的更多信息,請參閱器件數(shù)據(jù)表的電氣特性部分。從輸出狀態(tài)轉(zhuǎn)換到輸入狀態(tài)時可能遇到的一個問題是I/O線路上寄生電容的充電時間。該電容會導致從0到1的轉(zhuǎn)換延遲,這可能會觸發(fā)變化時中斷電路。為了將這些影響降至最低,可以將簡單的I/O擴展器配置為暫時打開高端I/O驅(qū)動器,以便在切換到弱上拉之前快速對該電容進行充電。

pYYBAGRUalGAVZHiAAEUJzpWLDA580.png

參見圖2。I/O 線的轉(zhuǎn)換

高端 I/O 驅(qū)動程序的運行時間可在軟件中配置,如果需要,可以禁用。下圖顯示了使用這種方法增強的上升時間 - 注意圖像中時間尺度從20μs/div到40ns/div的變化。注意:我們不建議在任何配置下直接驅(qū)動電容器。

pYYBAGRUalaATDocAAEC3MteAgA112.png

參見圖 3。無高端 I/O – 1nF 負載

poYBAGRUalyAKIBPAADpiiOMkG4753.png

參見圖 4。高端 I/O 開啟 – 1nF 負載

簡單的 I/O 擴展器 – 通信

I2C與這個例子的通信也非常簡單。完整的I 2 C通信只需要2個字節(jié)的讀寫。在I2C寫入中,數(shù)據(jù)的第一個字節(jié)是一個位圖,它將每個I/O行(由單個位表示)設(shè)置為輸入或輸出。發(fā)送的所有其他數(shù)據(jù)字節(jié)都將被丟棄,開發(fā)人員可以省略。

pYYBAGRUakCAYHvaAADdHHDnJkw877.png

參見圖 5。簡單的 I/O 擴展器,I2C 寫入

在I2C讀取中,從器件讀取的字節(jié)是一個位圖,表示每個I/O行的數(shù)字值,可通過PORT寄存器在內(nèi)部訪問。

pYYBAGRUajaAFeIkAAE5gTkWTBI354.png

參見圖 6。簡單 I/O 擴展器,I2C 讀取

高級 I/O 擴展器

開發(fā)高級 I/O 擴展器的目標是提供比上面顯示的簡單變體功能更全面的程序。由于串行通信極其簡單,簡單的I/O擴展器具有許多局限性,并且無法利用PIC16F15244系列中可用的以I/O為中心的功能,例如輸入電平控制、漏極開路輸出、變化時可屏蔽中斷和弱上拉使能。

相比之下,這個更復雜的示例可以配置板載I/O的幾乎所有功能。為了實現(xiàn)此功能集,程序使用查找表來確定要訪問的寄存器或要執(zhí)行的功能。圖7顯示了一個示例應用,其中微控制器充當鍵盤控制器,在按下按鍵時通知主微控制器。(此示例將在以后的帖子中展開。

pYYBAGRUajKAaeYwAAEC2_cjFrU648.png

參見圖 7。高級 I/O 擴展器作為帶鎖定指示器的鍵盤控制器

高級 I/O 擴展器 – 程序結(jié)構(gòu)

圖8是器件中“寄存器”的查找表。表中的某些寄存器實際存在于每個PIC16F15244系列器件上,例如TRIS和LAT,而其他寄存器(如ERROR)是“虛擬的”。虛擬寄存器特定于此程序,僅存在于RAM中。

poYBAGRUai2AQ-0fAAC7hNMX7MU949.png

參見圖 8。I/O 高級擴展器的寄存器映射

這種查找表結(jié)構(gòu)的一個好處是可以靈活地重新排列寄存器,這可用于優(yōu)化串行通信或減少軟件故障干擾關(guān)鍵設(shè)置的機會。

查找表分為兩個單獨的函數(shù),用于讀取和寫入。這將創(chuàng)建一個簡單可靠的權(quán)限方案,但代價是代碼大小。例如,要創(chuàng)建只讀函數(shù),只需從寫入查找表中省略地址即可。

高級 I/O 擴展器 – 通信

與此示例的通信比簡單的 I/O 擴展器更復雜。在執(zhí)行讀取或?qū)懭胫?,控制器必須指示要開始讀取或?qū)懭氲牡刂贰?/p>

I2C 寫入使用第一個數(shù)據(jù)字節(jié)來設(shè)置要開始的地址。然后,下一個字節(jié)用于加載該地址的數(shù)據(jù)。然后,地址將遞增以發(fā)送數(shù)據(jù)的下一個字節(jié)。只要地址仍然可寫且有效,此過程就可以重復,如下所示。如果寫入了無效或只讀地址,則地址不會遞增,并且設(shè)備不會確認 (NACK) 以指示發(fā)生了錯誤。

pYYBAGRUaiiAS6nUAACGE0suM5M585.png

參見圖 9。高級 I/O 擴展器,I2C 寫入流程圖

poYBAGRUaiCALSsDAADfusIPsRs775.png

參見圖 10。高級 I/O 擴展器,I2C 寫入

對于 I2C 讀取,必須首先設(shè)置要讀取的地址。通常,這是通過寫入設(shè)備的單個數(shù)據(jù)字節(jié)完成的,盡管某些操作可能會為方便起見自動設(shè)置地址。I2C 總線停止,然后在讀取模式下再次啟動。

讀取的第一個數(shù)據(jù)字節(jié)發(fā)生在地址集。讀取此字節(jié)后,地址將遞增,因此下一次讀取發(fā)生在地址 + 1、地址 + 1 處,依此類推。如果遇到無效區(qū)域或只寫區(qū)域,則程序?qū)⑼V惯f增地址并返回2x0,直到停止讀取。圖00顯示了兩個寄存器的示例讀取。

pYYBAGRUahSADXP2AADNTkYJe34491.png

參見圖 11。高級 I/O 擴展器,I2C 讀取流程圖

poYBAGRUahCAV1kxAAEEHftm8GU020.png

請參見圖 12。高級 I/O 擴展器,I2C 讀取

高級 I/O 擴展器 – 功能

該程序存儲 8 個 I/O 相關(guān)設(shè)置,所有這些設(shè)置都更詳細地記錄在器件數(shù)據(jù)表中。唯一未保存的 I/O 設(shè)置是模擬選擇 (ANSEL) 和端口。假設(shè) I/O 擴展器始終是數(shù)字的,因此 ANSEL 是一個常量值。PORT 值是 I/O 組的邏輯電平,取決于電路條件。

當引用這些寄存器時,“x”(例如:TRISx)是指可以分配的可選I/O組。默認情況下,此示例使用銀行 C。

? 三態(tài)方向控制 [TRISx] – 控制線路是輸出 (0) 還是輸入 (1)。

·鎖存器 [LATx] – 設(shè)置 I/O 驅(qū)動程序的輸出值。

·更改時中斷正邊沿 [IOCxP] – 啟用所選引腳上的上升沿是否生成中斷。

·更改時中斷負邊沿 [IOCxN] – 啟用所選引腳上的下降沿是否生成中斷。

·弱上拉 [WPUx] – 為每個選定的 I/O 啟用弱上拉。

? 輸入電平控制 [INLVLx] – 為每個引腳選擇 TTL 或施密特觸發(fā)器 CMOS 輸入閾值。

? 漏極開路控制 [ODCONx] – 為所選引腳啟用漏極開路輸出功能。

? 壓擺率控制 [SLRCONx] – 啟用壓擺率限制,以提高所選引腳的 EMI 性能。

高級 I/O 擴展器 – 內(nèi)存操作

作為附加功能,此代碼示例支持還原默認設(shè)置、保存、加載或保存并將其設(shè)置加載到內(nèi)部非易失性存儲器的功能。PIC16F15244系列沒有EEPROM,但是通過啟用存儲區(qū)域閃存(SAF),可以將一小部分程序閃存(PFM)標記為不可執(zhí)行。

pYYBAGRUagqAML5WAAF5rQYJ_7o970.png

參見圖 13。內(nèi)存存儲

圖 13 顯示了內(nèi)部存儲配置的方式。僅使用單個內(nèi)存行(32 個 14 位字)來存儲設(shè)置。此配置簡化了內(nèi)存管理,并將剩余的不可執(zhí)行內(nèi)存留給其他用途。

可配置的 I/O 設(shè)置與簡單的(軟件創(chuàng)建的)CRC-8 校驗和一起保存到 PFM 中,以驗證配置的完整性。為了將CRC打包到可用空間中,它被分成2位的塊,并附加到每個配置的前4個設(shè)置。

pYYBAGQzf6iAVVeHAACHdNFsvWA136.png

參見圖 14。內(nèi)存操作字節(jié)

如果加載的配置未通過校驗和驗證,則不會將其加載到相應的寄存器中。對于內(nèi)存負載,I/O引腳行為可以在內(nèi)存操作字節(jié)中指定,如圖14所示。如果負載失敗,引腳將保持該狀態(tài),直到重新配置。

I/O 設(shè)置可以保存并加載到運行時四種配置中的任何一種。作為編譯選項,開發(fā)人員或設(shè)計人員可以將設(shè)備設(shè)置為在啟動時嘗試加載配置 0,而不是默認值,這可以用作不需要完全重新編程操作的簡單固件更新。如果配置 0 未通過 CRC 驗證,程序?qū)⑹褂媚J I/O 設(shè)置啟動。

設(shè)備上的默認 I/O 設(shè)置定義為常量,開發(fā)人員可以根據(jù)應用程序的需要設(shè)置這些常量。程序不會修改這些默認值,并被視為已知的良好值。運行內(nèi)存操作“加載默認值”將使用這些默認值加載寄存器。

作為故障保護,所有內(nèi)存操作(不包括啟動時的負載)都需要特定的字節(jié)序列來“解鎖”操作。這減少了軟件故障擦除或覆蓋設(shè)置的可能性。

結(jié)論

如本文所示,在需要I/O配置靈活性或在單個系統(tǒng)中利用大量I/O擴展器的應用中,簡單的8位微控制器可以合理地替代通用I/O擴展器ASIC。這兩個示例所需的固件可通過以下鏈接在 Github 上找到。Github中還提供了使用Arduino Uno的高級I / O Expander的演示庫和代碼。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7336

    瀏覽量

    150108
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16667

    瀏覽量

    347800
  • 擴展器
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15125
收藏 人收藏

    評論

    相關(guān)推薦

    如何去提高電源管理的靈活性?

    有什么方法可以提高電源管理的靈活性嗎?
    發(fā)表于 04-23 06:24

    PIC16F15244的8位單片機功能簡析

    XC8、XC16和XC32對應8位、16位和32位PIC單片機,按實際使用的單片機選擇下載最新版本即可。這次活動發(fā)的開發(fā)板是PIC16F15244的8位單片機,所以下載XC8編譯
    發(fā)表于 11-24 07:04

    基于PIC16F15244單片機怎樣去新建工程

    IDE軟件和編譯都下載之后就可以開始新建工程了。輸入你的單片機型號,所以這里要輸入PIC16F15244選擇編譯,這里有點兒疑惑,我明明XC8、XC16、XC32都安裝了,為什么這
    發(fā)表于 11-24 06:04

    AN070231 I O擴展器選型指南

    基于 I2C 總線的GPIO 擴展器件為主控提供了額外的I/O 口,本文介紹了擴展器件的應用場
    發(fā)表于 11-03 11:36 ?16次下載

    如何將LP3943//LP3944用作GPIO擴展器。(中文講解)

    /44還有兩個可編程PWM發(fā)生,可自由設(shè)置控制任意輸出。本文討論了如何將LP3943/44用作GPIO擴展器。建議
    發(fā)表于 04-09 15:54 ?9次下載
    <b class='flag-5'>如何將</b>LP3943//LP3944<b class='flag-5'>用作</b>GPIO<b class='flag-5'>擴展器</b>。(中文講解)

    PIC24F系列參考手冊之帶外設(shè)引腳選擇(PPS)的I/O端口

    通用 I/O 引腳可被認為是最簡單的外設(shè)。它們使 PIC? MCU 可以監(jiān)視和控制其他器件。為了提高 器件的靈活性和功能性,一些引腳與備用功
    發(fā)表于 06-24 04:20 ?28次下載
    <b class='flag-5'>PIC24F</b><b class='flag-5'>系列</b>參考手冊之帶外設(shè)引腳選擇(PPS)的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>端口

    上電和復位 16 位 PCA I2C 總線 I/O 擴展器

    上電和復位 16 位 PCA I2C 總線 I/O 擴展器
    發(fā)表于 11-15 20:32 ?1次下載
    上電和復位 <b class='flag-5'>16</b> 位 PCA <b class='flag-5'>I</b>2C 總線 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> <b class='flag-5'>擴展器</b>

    帶有PIC16F15244的DIY I/O擴展器(第1部分,共3部分)

    電子發(fā)燒友網(wǎng)站提供《帶有PIC16F15244的DIY I/O擴展器(第1部分,共3部分).zip》資料免費下載
    發(fā)表于 11-18 11:46 ?2次下載
    帶有<b class='flag-5'>PIC16F15244</b>的DIY <b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>擴展器</b>(第1部分,共3部分)

    SMBus I/O擴展器控制LCD偏置電壓

    由 SMBus I/O 擴展器、升壓轉(zhuǎn)換和數(shù)字電位計組成的電路使 SMBus? 能夠控制 LCD 的對比度。
    的頭像 發(fā)表于 01-10 11:20 ?1310次閱讀
    SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>擴展器</b>控制LCD偏置電壓

    具有中斷輸出和配置寄存的低壓 16I2C 和 SMBus I/O 擴展器-NCA9555

    具有中斷輸出和配置寄存的低壓 16I2C 和 SMBus I/O 擴展器-NCA9555
    發(fā)表于 02-07 20:12 ?3次下載
    具有中斷輸出和配置寄存<b class='flag-5'>器</b>的低壓 <b class='flag-5'>16</b> 位 <b class='flag-5'>I</b>2C 和 SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b> <b class='flag-5'>擴展器</b>-NCA9555

    信路達 I/O端口擴展器 XL8574AT數(shù)據(jù)手冊

    I/O端口擴展器?SOP-16封裝:SOP16
    發(fā)表于 08-19 15:57 ?0次下載

    信路達 I/O端口擴展器 XL8574T數(shù)據(jù)手冊

    I/O端口擴展器?SOP-16封裝:SO16_10.5X7.6MM
    發(fā)表于 08-19 15:57 ?0次下載

    TCA9555低電壓16I2C和SMBus I/O擴展器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《TCA9555低電壓16I2C和SMBus I/O擴展器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 06-29 09:59 ?0次下載
    TCA9555低電壓<b class='flag-5'>16</b>位<b class='flag-5'>I</b>2C和SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>擴展器</b>數(shù)據(jù)表

    TCA6416低壓16I2C和SMBus I/O擴展器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《TCA6416低壓16I2C和SMBus I/O擴展器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 06-29 09:23 ?0次下載
    TCA6416低壓<b class='flag-5'>16</b>位<b class='flag-5'>I</b>2C和SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>擴展器</b>數(shù)據(jù)表

    TCAL敏捷I/O擴展器的特性

    電子發(fā)燒友網(wǎng)站提供《TCAL敏捷I/O擴展器的特性.pdf》資料免費下載
    發(fā)表于 09-05 10:49 ?0次下載
    TCAL敏捷<b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>擴展器</b>的特性