C8051F學習筆記3:優先權交叉開關譯碼器
數字和模擬資源可以通過25個I/O引腳(C8051F320)每個埠引腳都可以被定義為通用I/O(GPIO)或模擬輸入。P0.0 ~ P2.3可以被分配給內部數字資源
特點:
所有埠I/O都耐5V電壓。
埠I/O單元可以被配置為漏極開路或推輓方式。
埠I/O初始化埠 I/O 初始化包括以下步驟:
1.用埠輸入方式暫存器(PnMDIN)選擇所有埠引腳的輸入方式(模擬或數字)。
2.用埠輸出方式暫存器(PnMDOUT)選擇所有埠引腳的輸出方式(漏極開路或推輓)。
3.用埠跳過暫存器(PnSKIP)選擇應被交叉開關跳過的那些引腳。
4.將引腳分配給要使用的外設(XBR0、XBR1)。
5.使能交叉開關(
下面以埠P0為例
PnMDIN:埠輸入方式暫存器
對應的P0MDIN[n] =0 模擬輸入
P0MDIN[n]=1 數字輸入(預設)
PnMDOUT:端口出方式暫存器
對應的P0MDOUT[n] =0 漏極開路(預設)
P0MDOUT[n] =1 推輓輸出
推輓輸出,push-pull,不需要外加驅動電路,可以直接驅動外面的晶片。
推輓輸出的時候,埠輸出高電平,NMOS截止,PMOS導通,把IO口拉高;埠輸出為低電平,PMOS截止,NMOS導通,把IO口拉低,適合驅動一些TTL負載,LED,或是通訊時用作資料或時鐘傳送;
漏極開路,open-drain,需要外加電阻上拉到電源。
漏極開漏輸出時PMOS被禁止,只有保留NMOS,當埠輸出低電平時,NMOS導通,把IO拉低;但輸出埠為高電平時,NMOS截止,埠沒有輸出了高阻浮空狀態),如果加上外部上拉電阻,輸出就變成了高電平1,適合線與或是用作I2C通訊。
模擬輸入,Analog in
模擬輸入被使能時,其它IO方式將被禁止,模擬訊號直接經過一個Pass Gate 送入MCU內部的ADC;
數字輸入,Digital in
當數字輸入時,IO口輸出禁止,數字訊號經過 Schmitt Trigger(施密特觸發器)送入內部邏輯。
特別需要注意的是當IO口用作輸入埠時:
有兩種方法:
1、禁止IO輸出,配置為數字輸入。注意是所有的IO埠的輸出方式都被禁止
2、配置為OD方式。這時外部的高電平會保持,低電平會把IO拉低。
通常中斷輸入,資料輸入時可以這樣配置
不管交叉開關是否將埠引腳分配給某個數字外設,都需要對埠驅動器的輸出方式進行設定。例外情況是SMBus上的SDA和SCL及UART的RXD引腳,這些引腳被自動配置為漏極開路。
關於推免和漏極開漏可參考
1)C8051F微控制器中IO的使用
2)漏級開路 VS 推輓方式
3)8051 P0口
P0SKIP:埠0跳過暫存器
PnSKIP[n]=0 引腳不被交叉開關跳過;(預設)
PnSKIP[n]=0 引腳被交叉開關跳過。
XTAL1(P0.2)腳和XTAL2(P0.3)腳用作外部振盪器輸入管腳時,要跳過交叉開關優先權譯碼錶(P0SKIP = 0x0C)。
XBR0:埠I/O交叉開關暫存器0
XBR1:埠I/O交叉開關暫存器1
交叉開關負責SMBus、SPI、UART、定時器捕捉模組、外部PCA輸入、比較器輸出、定時器外部輸入、/SYSCLK以及A/D轉換啟動輸入的引腳分配。必須在訪問這些外設的I/O之前配置和允許交叉開關
未指定的埠引腳作為通用I/O 。
XBARE=0 交叉開關禁止;
XBARE=1 交叉開關使能。
在交叉開關被使能之前,外部引腳保持標準埠I/O方式(輸入)。
沒有引腳被跳過的交叉開關優先權譯碼錶
可以通過Silicon Labs IDE軟體的配置嚮導(Configuration Wizard)配置I/O管腳,如下圖,配置UART0和SPI0和SMBus。UART0的TX0、RX0固定在P0.4和P0.5上,由於SPI0的優先順序比SYSCLK高,所以SPI的SCK和MISO依次配置到管腳P0.0、P0.1、(P0.1的優先順序比P0.1高,依次類推)。P0.2和P0.3跳過交叉開關,用於外部振盪器輸入(XTAL1和XTAL2)。由於P0.4和P0.5已佔,所以SPI剩下的MOSI和NSS配置在P0.6和P0.7。SYSCLK配置在P1.0。
void Port_IO_Init()
{
// P0.0 - SCK (SPI0), Push-Pull, Digital
// P0.1 - MISO (SPI0), Push-Pull, Digital
// P0.2 - Skipped, Push-Pull, Digital
// P0.3 - Skipped, Push-Pull, Digital
// P0.4 - TX0 (UART0), Push-Pull, Digital
// P0.5 - RX0 (UART0), Push-Pull, Digital
// P0.6 - MOSI (SPI0), Push-Pull, Digital
// P0.7 - NSS (SPI0), Push-Pull, Digital
// P1.0 - SYSCLK, Push-Pull, Digital
P0MDOUT = 0xFF;
P1MDOUT = 0x01;
P0SKIP = 0x0C;
XBR0 = 0x0B;
XBR1 = 0x40;
}
要注意的是,首先要使能優先權交叉譯碼器(Enable Crossbar)。
1)為使埠P0、P1和P2.0 ~ P2.3工作在標準埠I/O輸入/輸出方式,交叉開關必須被使能。當交叉開關被禁止時,埠輸出驅動器被禁止。P2.4 ~ P2.7和P3.0總是作為標準GPIO使用。
2)未被交叉開關分配的埠引腳和未被模擬外設使用的埠引腳都可以作為通用I/O。