配置 Silicon Labs 8051 Busy Bee 優先權交叉開關(包括跨越暫存器)

Silicon Labs 的 Busy Bee 是經典 8-bit 8051 微控制器的最新版本。此系列產品非常適合需要高性能、高能源效率且佔用空間小的通用應用。

本工程簡報介紹了 Busy Bee 的交叉開關。交叉開關是關鍵組件,因為它可以將周邊連接到特定的 I/O 引腳。該器件易於使用。但是,如後文所述,它需要仔細進行 I/O 對應,包括內部和外部組件。圖 1 展示了 EFM8BB10F8G-A-SOIC16R 的 I/O 對應範例。

圖 1:8051 專案的 I/O 引腳對應和交叉開關支援(SPI 和 PWM)。

設定預期

如果您來到此頁面,很可能正對 Silicon Labs Busy Bee 8051 微控制器的交叉開關 (Crossbar) 功能感到困惑不解。您可能會遇到諸如優先權解碼器、跨越暫存器之類的關鍵字,以及顯示周邊和實體 I/O 引腳之間關係的功能對應。

簡而言之,您可以使用 Silicon Labs Simplicity Studio 整合開發環境 (IDE) 中內建的圖形化設定工具。這是一個非常優秀的工具,可以滿足您的許多需求。

  • 但是,如果您想在多個裝置之間共用引腳功能呢?

  • 如何動態地變更交叉開關?

與 SPI 共享?對於效能要求較低的設計而言,這是一個重要的成本節約優勢。這裡所說的「效能要求較低」是指 LCD 更新和 SPI 操作不會同時進行,且更新速率夠慢,以適應時分複用。

為了回答這個問題,我們將從頭開始。我們將首先探討交叉開關的操作,然後逐步過渡到允許引腳共享的動態配置的更複雜範例。

技術提示:本工程簡報重點介紹 Silicon Laboratory 8051 系列的最新成員。其中一項重大升級是加入了交叉開關跨越暫存器。與 C8051F000 等舊款裝置相比,這提高了引腳分配的靈活性。然而,這也增加了程式設計的複雜性,而交叉開關的概念本身就比較抽象,有時難以理解。因此,現在或許是回顧一下本應用程式筆記中所描述的舊款裝置交叉開關配置操作的好時機。

秉承 8051 系列的悠久傳統,這些新功能建立在原始功能的基礎上,其根源可以追溯到 20 世紀 80 年代 Intel 母公司的設計。

什麼是 Silicon Laboratories 8051 交叉開關?

交叉開關用於將周邊路由到特定的 I/O 引腳。不同微控制器對此功能的處理方式各不相同。某些架構在引腳分配方面幾乎沒有彈性。這些極簡的微控制器會將 SPI 等周邊實體路由到一組特定的 I/O 接腳。因此,在設計印刷電路板時,我們需要想辦法克服這個限制。理想情況下,SPI 等周邊可以路由到任意引腳。雖然這很理想,但無限制的分配會增加成本和複雜性。交叉開關提供了介於兩者之間的解決方案。

交叉開關是一個閘道器。任何訊號都必須先經過交叉開關才能傳送到編號較低的 I/O 連接埠。這個閘道器可以被視為一系列多工器,如圖 2 所示的簡化示意圖。例如,SPI0-SCK 訊號可以路由到任意 P0 引腳,或在啟動相應的優先權交叉開關暫存器後,路由到選定的 P1 引腳。

圖 2:Silicon Labs 8051 交叉開關的簡化圖。

分層引腳分配

Crossbar 最令人沮喪的地方之一在於它的抽象性。請注意,我們並沒有明確指出周邊 X 連接到 I/O 引腳 Y。也沒有「將 SPI0-SCK 連接到 P1.3」這樣的指令。相反,我們根據給定的優先方案來指導連接過程。

此優先權由兩個維度定義:

  • 從某種意義上說,優先權等同於引腳順序,P0.0 被分配到最高位置。 P0.1 的優先權略低,依此類推,直到所有 P0、P1 引腳以及(取決於微控制器)P2 引腳都被佔用。

  • 另一個維度則與外設本身有關。諸如 UART 和 SPI 之類的通訊設備被認為比 PWM 或定時器輸出更重要。例如,假設編程器啟動了所有三個外設。UART 將首先被分配優先級,然後是 SPI,最後是 PWM。

交叉開關屬性概述

以下列表概述了本文後續內容中需要考慮的交叉開關屬性:

  • 交叉開關位於周邊和 I/O 引腳之間的關鍵路徑。未啟動交叉開關時,微控制器將沒有輸出。

  • 交叉開關用作大優先權多工器。

  • 程式設計師無法直接控制多工器。引腳分配採用優先權制,優先權由周邊類型和 I/O 引腳兩個維度決定。USART 在周邊維度上優先順序最高,而 P0.0 在引腳層級維度上優先順序最高。

  • 交叉開關可以動態配置。但是,透過修改 XBRn 暫存器關閉某個裝置會改變優先權,導致引腳分配發生變化。可以使用 PxSKIP 暫存器來緩解這個問題,本文稍後將對此進行探討。

8051 交叉開關入門

在嘗試對交叉開關進行編程之前,制定一個計劃至關重要。您需要識別所有 I/O 並將其對應到微控制器。至少,您需要確定要啟動哪些周邊。

在本例中,我們假設使用 EFM8BB10F8G-A-SOIC16R Busy Bee 微控制器。在本項目中,我們將啟動以下引腳:

  • SPI(三線模式,由 NSS 軟體控制連續寫入操作)
  • PWM0
  • PWM1
  • UART 引腳目前未使用,但我們將保留其用於後續用途。
  • 其餘引腳將保留用於通用或非交叉開關外設,例如 ADC。

最終的 I/O 對應圖如圖 1 所示。左側表格列出了實體 I/O 引腳,並附有 SOIC-16 IC 封裝的示意圖以供參考。右側表格列出了交叉開關矩陣。該表格改編自 Busy Bee 規格書中的表格,並根據 SOIC-16 裝置的有限功能進行了精簡。

請注意,此層級表包含了兩個維度的關鍵優先順序。此外,與規格書中的表示不同,此表還包含了相關的 XBARx 和 PxSKIP 暫存器。

我們先來看 UART。請記住,我們希望將此最高優先權週邊保留以供將來使用。我們不啟用該裝置,而是透過在 P0.4 和 P0.5 的對應位置放置 S(跨越)來跳過引腳分配。稍後我們需要配置相關的 P0SKIP 位元。

接下來,我們對應 SPI。我們將使用 P0.0 到 P0.2 的最高優先權 I/O。請注意,這對應於 SOIC-16 裝置的實體引腳 3、2、1 和 16(晶片選擇單元)。這樣做很方便,因為所有 SPI I/O 都位於 IC 的同一側,從而簡化了 PCB 佈局。稍後我們需要設定相關的 XBR0 位元。

我們電路圖的最後一部分涉及可程式計數器陣列 (PCA0) 中的 PWM。我們可以將兩個 PWM 輸出分別分配給 P0.6 和 P0.7。然而,從電路板佈線的角度來看,使用 P1.1 和 P1.2 引腳可能會更好,因為它們位於 SOIC-16 封裝的邊緣,位置非常方便。

技術提示:引腳分配是一個迭代過程。將給定微控制器封裝的實體對應與交叉開關優先權對應結合起來會很有幫助。它們共同指向一個理想的 PCB 佈局,如果單獨考慮這些方案,這個佈局可能並不明顯。

在繼續之前,請檢查圖 1 並觀察:

  • 黑色陰影區域不可用於所選的 Busy Bee。

  • UART 是一個例外,它與引腳 P0.4 和 P0.5 具有固定關聯。

  • UART 異常完成後,我們從左到右移動 I/O 引腳,要麼分配 (X) 要麼跨越 (S)。在每列中明確放置 X 或 S 非常重要,因為錯誤會導致引腳向左移動。請記住,我們沒有明確聲明周邊 X 連接到 I/O 引腳 Y。相反,我們分配優先級,然後由 Crossbar 進行實際分配。

  • 為了清晰起見,我們將每個 “X” 或 “S” 下方的列進行陰影填充。

  • 我們沿著「Crossbar」表格的對角線方向向下「移動」。

  • 對於這款 SOIC-16 封裝的裝置,其周邊數量超過了可用的實體 I/O 接腳數量。

將表格轉換為 SFR(特殊功能暫存器)值

既然我們已經在 Crossbar(交叉開關)配置表中填入了所需的連接(標記為 X)和跨越設定(標記為 S),接下來就可以設定對應的暫存器值了。具體操作是寫入資料到表格左側的 XBRx 暫存器和底部的 PxSKIP 暫存器。

我們先從跨越暫存器(skip registers)入手。從左到右,我們將跳過以下引腳:

  • P0.3(用於 SPI 晶片選擇線的軟體控制)
  • P0.4 和 P0.5(預留,以備日後使用 UART)
  • P0.6、P0.7 和 P1.0(考慮 SOIC-16 封裝,這是 PCB 佈線的首選配置)

查閱 Busy Bee 參考手冊可知,「跨越」(skip)對應邏輯 1。由此可得,其數值如下:

    P0SKIP = 0xF8;  
    P1SKIP = 0x01;

接下來我們來看 XBRx 的配置。從上到下依序查看,我們將跳過以下項目:

  • UART
  • 從 SMB0E 到 SYSCLK(包括)的所有周邊

再次查閱 Busy Bee 參考手冊可知,配置值為邏輯 1。由此可得各項的值如下:

    XBR0 = 0x01;
    XBR1 = 0x02; // Use two of the three PWM outputs

最後一步是配置並啟用週邊本身,包括 SPI 和 PWM。此外,針對任何通用 I/O (GPIO) 和 ADC 作業,也必須設定對應的 PxMDIN 和 PxMDOUT 暫存器。

這則是另一個話題了。

動態交叉開關(Crossbar)配置

目前,我們已經編寫了用於配置交叉開關的程式碼。只需在進入 while(1) 主循環之前呼叫一次該程式碼即可。對於大多數程式而言,這種做法已足夠,因為交叉開關通常只需配置一次,之後便無需再做改動。然而,並非所有程序都適用這種方式。

假設我們要為微控制器新增一個 LCD 字元顯示器。所選用的 SOIC-16 封裝元件接腳數量有限,無法同時支援 SPI 介面、LCD 顯示以及其他必要的通用 I/O 功能。

只要稍加巧思並進行精心的程式設計,外部硬體便可共用 I/O 接腳。在本專案中,SPI 的三個 I/O 接腳可與 LCD 共用。這種共用並非同時操作,而是採用時分複用(time-multiplexing)的方式;前提是 SPI 和 LCD 的通訊需求較低,從而不會導致明顯的延遲或乾擾。利用此多用機制,8051 可先向 LCD 發送指令,隨後切換 Crossbar(交叉開關)的配置,以便與 SPI 設備進行通訊。

回想一下,Crossbar 是通往 Busy Bee 微控制器 P0 和 P1 組 I/O 接腳的樞紐。此外,Crossbar 已配置為將 SPI 功能指派給 P0.0 至 P0.3 引腳。在此配置下,向 P0.0 等連接埠閂鎖器(port latch)執行寫入操作,將不會對實際的 I/O 接腳產生影響。

我們可以透過清除 XBR0.URT0E 位元來解除 SPI 與 I/O 引腳的關聯。遺憾的是,此操作會導致引腳重新分配,使得兩個 PWM 訊號向左移動三個位置,最終佔用 P0.6 和 P0.7 引腳。

讓我們重申這一關鍵機制:

如果在動態變更 XBRx 暫存器的同時不變更 PxSKIP 暫存器,將會導致不期望的引腳重新分配。

為了保持配置,我們必須指示交叉開關(Crossbar)跳過 SPI 的 P0.0 至 P0.3 引腳,以及原本已跳過的 I/O 引腳。圖 3 展示了這項新配置,具體的交叉開關配置如下。

    XBR2 = 0x00;           // Global disable of all I/O cells blocks

    P0SKIP = 0xFF;
    P1SKIP = 0x01;

    XBR0 = 0x00;
    XBR1 = 0x02;           // Use two of the three PWM outputs

    XBR2 = 0x40;           // Global enable of all I/O cells blocks

圖 3:SPI 關閉時保持引腳間距的 I/O 引腳對應。

技術提示:SPI 允許設備進行並行連接,前提是每個設備都有獨立的片選線。這意味著所有未選取的設備,其 MISO 接腳都會進入高阻態,確保在任一時刻只有單一設備在總線上進行通訊。儘管通常不建議這樣做,但主微控制器也可以將該線路用於其他用途——當然,前提是所有其他設備均已停用,且其 MISO 驅動引腳處於高阻態。

結語

撰寫這篇文章頗具挑戰性。回過頭來看,Crossbar(交叉開關)其實是一個非常簡單的機制,最困難的部分在於最初的 I/O 規劃。

您對微控制器或 8051 Busy Bee 有任何疑問嗎?如有,請在下方留言或提出您的想法。