資料介紹
描述
微控制器 (MCU) 最基本的元素之一是 I/O——引腳數量、接收器和源強度以及可用的功能。在某些情況下,系統(tǒng)的 I/O 需求與微控制器的內存大小可能會出現不匹配。通常,可用的 I/O 越多,包含的內存就越多,這使得微控制器更昂貴。
I/O 擴展器通過串行通信(通常是I2C或 SPI )向主微控制器提供額外的 I/O bank 。I/O 擴展器的常見用例包括簡化 PCB 布線、改善功耗和縮小主微控制器的物理尺寸。
![pYYBAGN27JOAZInWAAChTbXHl6E415.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27JOAZInWAAChTbXHl6E415.png)
I/O 擴展器 ASIC是一種常見商品,但每個 ASIC 的功能和用例略有不同,這可能會在設計過程中引起頭痛。然而,I/O 擴展器是一種相對簡單的數字設備,可以使用微控制器進行仿真,例如新的PIC16F15244 系列。與相關的基于 ASIC 的解決方案相比,這可以產生更多的設計靈活性、功能,甚至更低的物料清單 (BOM) 成本。然而,由于更專業(yè)的硬件,基于 ASIC 的解決方案在空間和功率效率方面具有優(yōu)勢。
為了展示這個概念的靈活性,我們創(chuàng)建了 2 個單獨的代碼示例。第一個代碼示例是一個非常簡單的 I/O 擴展器。可以輕松定制與該項目相關的固件,以進一步簡化通信。第二個代碼示例是一個非常靈活的“高級”I/O 擴展器,其設計目的是允許通過 I2C 控制幾乎每個 I/O 設置,而不是依賴于預設功能。
這兩個 I/O 擴展器示例具有共同的特性和大部分代碼庫。與許多 I2C 設備一樣,尋址線被分配給一些未使用的 I/O 以設置 I2C 地址的一些位,這在設計中提供了靈活性,而無需額外編程。與 ASIC 不同,這些分配可以在軟件中更改、重新路由、刪除或重新排序。此外,該器件還提供了一條外部中斷線 (INT) 來發(fā)出 I/O 電平變化的信號。INT 可以是公共線路的漏極開路,如果該線路是獨占的,則可以是推挽式。
簡單 I/O 擴展器
在深入了解高級 I/O 擴展器之前,讓我們看一下簡單的擴展器。在本例中,每條 I/O 線有兩種連續(xù)狀態(tài)(假設代碼未修改):弱上拉輸入或輸出 LOW。弱上拉允許 I/O 擴展器在用作輸入時定義邏輯電平,并且它還關閉通常會將電流吸入擴展器的連接電路。該器件的內部弱上拉強度約為 10s 或 100s μA。
LOW 輸出是一個更強大的驅動器,每個 I/O 能夠吸收高達25mA 的電流,整個設備的電流為 300mA(-40C 至 +85C)。有關這些限制的更多信息,請參閱器件數據表的電氣特性部分。從輸出狀態(tài)轉換到輸入狀態(tài)時可能遇到的一個問題是 I/O 線上存在的寄生電容的充電時間。該電容會導致從 0 到 1 的轉換延遲,這可能會觸發(fā)變化時中斷電路。為了最大限度地減少這些影響,可以將簡單的 I/O 擴展器配置為在切換到弱上拉之前暫時打開高側 I/O 驅動器以快速對該電容進行充電。
![pYYBAGN27JWAZsjRAAAg5ocjesI782.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27JWAZsjRAAAg5ocjesI782.png)
高側 I/O 驅動程序的運行時間可在軟件中配置,并且可以根據需要禁用。下圖顯示了這種方法對上升時間的增強——注意圖像中時間尺度從 20μs/div 到 40ns/div 的變化。注意:我們不建議在任何配置中直接驅動電容器。
![pYYBAGN27JmAW7MJAABGBPKxHoY737.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27JmAW7MJAABGBPKxHoY737.png)
![poYBAGN27JuAcVJyAABH2IjcM6s985.png](https://file.elecfans.com/web2/M00/7B/CF/poYBAGN27JuAcVJyAABH2IjcM6s985.png)
簡單 I/O 擴展器 – 通信
這個例子的 I2C 通信也非常簡單。完整的 I2C 通信只需要 2 個字節(jié)用于讀取和寫入。在 I2C 寫入中,數據的第一個字節(jié)是一個位圖,它將由單個位表示的每個 I/O 線設置為輸入或輸出。發(fā)送的所有其他數據字節(jié)都被丟棄,開發(fā)人員可以省略。
![pYYBAGN27J2AKsOTAAA1A5xDgjQ544.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27J2AKsOTAAA1A5xDgjQ544.png)
在 I2C 讀取中,從設備讀取的字節(jié)是一個位圖,表示每個 I/O 線上的數字值,可通過 PORT 寄存器在內部訪問。
![poYBAGN27KCAFNdtAAA5AIECkCg741.png](https://file.elecfans.com/web2/M00/7B/CF/poYBAGN27KCAFNdtAAA5AIECkCg741.png)
高級 I/O 擴展器
開發(fā)高級 I/O 擴展器的目標是提供比上面顯示的簡單變體功能更全面的程序。由于極其簡單的串行通信,簡單的 I/O 擴展器具有許多限制,并且無法利用PIC16F15244 系列中提供的以 I/O 為中心的功能,例如輸入電平控制、開漏輸出、可屏蔽的變化中斷和弱上拉使能。
相比之下,這個更復雜的示例可以配置板載 I/O 的幾乎所有功能。為了實現這個功能集,程序使用查找表來確定訪問哪個寄存器或執(zhí)行什么功能。圖 7 顯示了一個示例應用程序,其中微控制器充當鍵盤控制器,在按鍵被按下時通知主微控制器。(這個例子將在以后的文章中展開。)
![pYYBAGN27KKAEw7WAAC-irHmQRc759.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27KKAEw7WAAC-irHmQRc759.png)
高級 I/O 擴展器 - 程序結構
圖 8 是器件中“寄存器”的查找表。表中的某些寄存器物理存在于每個 PIC16F15244 系列器件上,例如 TRIS 和 LAT,而其他寄存器(例如 ERROR)是“虛擬的”。虛擬寄存器特定于該程序并且僅存在于 RAM 中。
![poYBAGN27KeAD-oIAABeEQ-2RBQ468.png](https://file.elecfans.com/web2/M00/7B/CF/poYBAGN27KeAD-oIAABeEQ-2RBQ468.png)
這種查找表結構的一個好處是可以靈活地重新排列寄存器,這可用于優(yōu)化串行通信或減少軟件故障干擾關鍵設置的機會。
查找表分為兩個單獨的函數用于讀取和寫入。這以代碼大小為代價創(chuàng)建了一個簡單可靠的權限方案。例如,要創(chuàng)建一個只讀函數,只需從寫查找表中省略地址即可。
高級 I/O 擴展器 - 通信
與此示例的通信比簡單的 I/O 擴展器更復雜。在執(zhí)行讀取或寫入之前,控制器必須已指示開始讀取或寫入的地址。
I2C 寫入使用第一個數據字節(jié)來設置起始地址。然后,下一個字節(jié)用于加載該地址的數據。然后為發(fā)送的下一個數據字節(jié)增加地址。只要地址仍然可寫且有效,此過程就可以重復,如下所示。如果寫入無效或只讀地址,則該地址不會遞增,并且設備不會確認 (NACK) 以發(fā)出錯誤已發(fā)生的信號。
![pYYBAGN27KqAWVsZAABejEMohUY128.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27KqAWVsZAABejEMohUY128.png)
![pYYBAGN27KyAKmMnAABPdNB5CBI443.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27KyAKmMnAABPdNB5CBI443.png)
對于 I2C 讀取,必須首先設置要讀取的地址。通常這是通過將單個數據字節(jié)寫入設備來完成的,盡管為方便起見,某些操作可能會自動設置地址。I2C 總線停止,然后以讀取模式再次啟動。
讀取的第一個數據字節(jié)出現在地址集。讀取此字節(jié)后,地址會遞增,因此下一次讀取發(fā)生在地址 + 1、地址 + 2 處,依此類推。如果遇到無效或只寫區(qū)域,則程序停止增加地址并返回 0x00,直到停止讀取。圖 12 顯示了兩個寄存器的讀取示例。
![poYBAGN27K-Ab1wGAABl_1t-6os745.png](https://file.elecfans.com/web2/M00/7B/CF/poYBAGN27K-Ab1wGAABl_1t-6os745.png)
![poYBAGN27LGAUI4SAABlUeigv9E841.png](https://file.elecfans.com/web2/M00/7B/CF/poYBAGN27LGAUI4SAABlUeigv9E841.png)
高級 I/O 擴展器 – 特性
該程序存儲了 8 個與 I/O 相關的設置,所有這些設置都在器件數據表中進行了更詳細的說明。唯一未保存的 I/O 設置是模擬選擇 (ANSEL) 和 PORT。假設 I/O 擴展器始終是數字的,因此 ANSEL 是一個常數值。PORT 值是存在于 I/O bank 上的邏輯電平,它取決于電路條件。
引用這些寄存器時,“x”(例如:TRISx)指的是可以分配的可選 I/O bank。默認情況下,此示例使用銀行 C。
- 三態(tài)方向控制 [ TRISx ] – 控制線路是輸出 (0) 還是輸入 (1)。
- Latch [ LATx ] – 設置 I/O 驅動器的輸出值。
- Interrupt-On-Change Positive Edge [ IOCxP ] ——啟用所選引腳上的上升沿是否產生中斷。
- Interrupt-On-Change Negative Edge [ IOCxN ] ——啟用所選引腳上的下降沿是否產生中斷。
- 弱上拉 [ WPUx ] – 為每個選定的 I/O 啟用弱上拉。
- 輸入電平控制 [ INLVLx ] ——為每個引腳選擇 TTL 或施密特觸發(fā)器 CMOS 輸入閾值。
- 開漏控制 [ ODCONx ] – 啟用所選引腳的開漏輸出功能。
- 壓擺率控制 [ SLRCONx ] – 啟用壓擺率限制以提高所選引腳的 EMI 性能。
高級 I/O 擴展器 - 內存操作
作為一項附加功能,此代碼示例支持恢復默認設置、保存、加載或保存并將其設置加載到內部非易失性存儲器的功能。PIC16F15244 系列沒有 EEPROM,但可以通過啟用存儲區(qū)閃存 (SAF) 將一小部分程序閃存 (PFM) 標記為不可執(zhí)行。
![pYYBAGN27LaAZ8RmAAB_OcBH534491.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27LaAZ8RmAAB_OcBH534491.png)
圖 13 顯示了配置是如何在內部存儲的。只有一個存儲器行(32 個 14 位字)用于存儲設置。此配置簡化了內存管理,并將剩余的不可執(zhí)行內存留作其他用途。
可配置的 I/O 設置與一個簡單(軟件創(chuàng)建的)CRC-8 校驗和一起保存到 PFM,以驗證配置的完整性。為了將 CRC 打包到可用空間中,它被分成 2 位的塊并附加到每個配置的前 4 個設置。
![pYYBAGN27LiARJiKAACQ7dE7nro099.png](https://file.elecfans.com/web2/M00/7C/5D/pYYBAGN27LiARJiKAACQ7dE7nro099.png)
如果加載的配置無法通過其校驗和驗證,則不會將其加載到適當的寄存器中。對于內存加載,可以在內存操作字節(jié)中指定 I/O 引腳行為,如圖 14 所示。如果加載失敗,引腳將保持該狀態(tài),直到重新配置。
I/O 設置可以在運行時保存并加載到四種配置中的任何一種。作為編譯選項,開發(fā)人員或設計人員可以將設備設置為在啟動時嘗試加載配置 0 而不是默認值,這可以用作不需要完全重新編程操作的簡單固件更新。如果配置 0 未通過 CRC 驗證,程序將使用默認 I/O 設置啟動。
設備上的默認 I/O 設置被定義為常量,開發(fā)人員可以根據應用程序的需要進行設置。這些默認值不會被程序修改,并且被認為是已知的良好值。運行內存操作“l(fā)oad defaults”將使用這些默認值加載寄存器。
作為故障保險,所有內存操作(不包括啟動時的加載)都需要特定的字節(jié)序列來“解鎖”操作。這減少了軟件故障擦除或覆蓋設置的機會。
結論
如本文所示,在需要靈活 I/O 配置或在單個系統(tǒng)中使用大量 I/O 擴展器的應用中,簡單的 8 位微控制器可以合理地替代通用 I/O 擴展器 ASIC。這兩個示例所需的固件可通過以下鏈接在 Github 上獲得。使用 Arduino Uno 的高級 I/O 擴展器的演示庫和代碼也在 Github 中提供。
這是 3 部分博客文章系列的第 1 部分。下一篇文章將介紹如何利用先進的 I/O 擴展器來控制 7 段顯示器。
對于本系列的第 2 部分,介紹使用I/O 擴展器來控制 7 段顯示器,請參閱此 Hackster Post。
對于本系列的最后一部分,包括使用 I/O 擴展器創(chuàng)建鍵盤控制器,請參閱此 Hackster 帖子。
- 電源設計方法-第3部分
- 電源設計方法-第1部分
- DIY點焊機-第2部分
- DIY CD點焊機-第1部分
- 電氣過應力簡介-第1部分
- 了解你的電池組:第1部分
- 如何進行電源設計 - 第1部分
- LDO基礎知識:噪聲 - 第1部分
- 集成智能第1部分:EMI管理
- 教程第3部分:帶有OV7670攝像頭模塊的TinyML
- 用電信息采集系統(tǒng)型式規(guī)范第3部分 1次下載
- 用電信息采集系統(tǒng)技術規(guī)范第3部分 2次下載
- 用電信息采集系統(tǒng)檢驗規(guī)范第3部分 0次下載
- 用電信息采集系統(tǒng)通信協(xié)議第3部分 3次下載
- 電壓基準如何影響ADC性能,第2部分 10次下載
- 雙極踏腳車(第二部分):微步和衰減模式 656次閱讀
- ADC數字下變頻器:抽取濾波器和ADC混疊,第2部分 2051次閱讀
- ADC眼中的虛擬評估,第2部分 822次閱讀
- 邊緣智能第1部分:邊緣節(jié)點 1251次閱讀
- SMBus I/O擴展器控制LCD偏置電壓 1467次閱讀
- 實時數據體系建設的總體方案的三部分 6771次閱讀
- 實時控制技術滿足實時工業(yè)通信發(fā)展的需求 —— 第2部分 1074次閱讀
- 新唐科技通用型 I/O 系列擴展器介紹 1698次閱讀
- JESD204C入門第2部分:新特性及其內容 6517次閱讀
- DC/DC轉換器傳導EMI - 第2部分,噪聲傳播和濾波 3338次閱讀
- 電壓檢測器、監(jiān)控器和高級監(jiān)控各種功能介紹:第1部分 5094次閱讀
- 關于如何「訓練」神經網絡的一部分經驗與見解 7633次閱讀
- DC/DC轉換器數據表——靜態(tài)電流解密:第一部分 1715次閱讀
- 無源元件并非真的“無源”:第1部分——電容 2519次閱讀
- 混合信號系統(tǒng)接地揭秘之第二部分 1712次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論