模擬DS80C320和其他高速微控制器具有兩個相同的串行端口。本應用筆記向用戶介紹微控制器中使用的通用同步/異步接收器/發送器(USART)。應用筆記討論了波特時鐘源、輪詢和中斷模式、波特率生成、異步10位操作和雙串行端口操作。代碼示例用于突出顯示用作波特率生成器的計時器的使用。
介紹
高速微控制器的串行接口在功能上與其他性能較低的8051處理器上的接口相同。它們基于通用同步/異步接收器/發射器 (USART) 實現。顧名思義,USART 將并行數據與同步或異步串行位流相互轉換。器件的并行數據側與處理器的內部數據總線接口,串行端與外界接口。本應用筆記描述了該接口最常見的工作模式的設置和操作。
由于其普遍適用性,高速微型串行通道最常用的配置是其10位異步模式。在本應用筆記中,將詳細描述此配置。將提供港口操作的一般概述,并提供詳細的軟件示例。還將介紹說明使用雙串行端口和11位地址識別功能的示例。通過這三個示例,將討論串口操作的不同方面。
最常見的串行通信模式是基于異步數據傳輸。在這種傳輸模式下,沒有單獨的時鐘信號。圖1所示的經典串行異步數據通信格式無需時鐘信號即可提供必要的同步。在這種格式中,8或9個數據位伴隨著一個起始位和一個或兩個停止位。第 9 個數據位經常用作奇偶校驗位。開始位和停止位提供必要的同步信息。此模式下的串行比特流內容與流行的RS-232協議兼容。但是,信號電平不是。為了兼容信號電平,必須使用DS232A等電平轉換器將TTL/CMOS電平轉換為RS-232電平。
圖1.異步數據格式。
請注意,高速微控制器系列的許多成員具有兩個功能相同的串行端口。隨著新成員添加到處理器家族中,有些成員可能沒有兩個串行端口。有關具體功能,請參閱各個器件的數據手冊。本應用筆記將重點介紹單個串行端口(端口0)的使用,但在示例中,所介紹的想法同樣適用于兩個端口。一個示例程序演示了這兩個串行端口的使用。
波特鐘源
雖然本文檔的目的不是討論高速微型內部定時器的細節,但必須對它們進行一些討論,因為它們經常被用作波特率時鐘的來源。高速微型包含三個內部定時器,其中兩個可用作波特率發生器。以下各節簡要介紹這些定時器及其最常用于波特率的模式 代。
有關定時器設置的詳細信息將通過下面的軟件示例進行說明。
在這兩個定時器上,自動重新加載模式經常用于波特率生成,因為它不需要處理器的干預。初始化后,定時器自動運行,根據加載到定時器重加載寄存器中的值生成波特率時鐘。在此模式下,計時器 1 使用 SFR 寄存器 TL1 進行計數,使用 TH1 存儲重新加載值。軟件必須使用所需的重新加載值初始化 TH1,如果第一個時間間隔是正確的,TL1 也必須使用相同的值加載。定時器2使用寄存器TL2和TH2進行計數,并寄存器RCAP2L和RCAP2H用于保存重新加載值。同樣,這些寄存器必須由軟件初始化。啟用后,計時器將根據所選時鐘源開始計數。定時器1的時鐘是振蕩器/12或振蕩器/4。對于定時器2,振蕩器/2是波特時鐘生成模式下的唯一可能性。當計數寄存器從其最大計數滾動到 0 時,它們將自動重新加載,并帶有重新加載寄存器中的值。除非由軟件修改,否則重新加載值保持不變。每次發生翻轉時,都會產生一個時鐘脈沖。該時鐘脈沖被串行端口用作波特率時鐘。通過改變重載值,可以實現多種波特率。
輪詢模式與中斷驅動模式
高速微型的串行通道在SFR地址空間中具有指示通道狀態的標志位。對于每個串行通道,都有一個指示何時接收字符的標志 (RI) 和一個指示何時傳輸字符的標志 (TI)。無論是否啟用關聯的中斷,都會設置這些標志,因此可以在輪詢操作模式下使用。或者,如果啟用了中斷,則這些標志中的任何一個的設置都將導致跳轉到串行通道的關聯中斷向量。
由于串行中斷是異步的,基于與外部設備的串行通信,大多數應用將受益于使用中斷驅動的通信方案。這樣,處理器可以在等待接收中斷時完成其他任務。如果使用輪詢方法,則會花費時間不斷檢查標志位以查看是否已設置。本應用筆記的示例說明了這兩種方法。第一個示例演示了典型的中斷驅動操作模式。第二個示例執行一組非常結構化的事件,因此它非常適合輪詢操作。
插入中斷字符
中斷字符是通信流中很長的 null。確切的長度因所使用的通信格式而異。軟件可以通過將邏輯 0 寫入相應串行端口的 RX 引腳的端口鎖存位來輕松創建空值。請注意,將 00h 寫入 SBUF0 或 SBUF1 不會達到預期效果,因為數據流中使用的開始位和停止位是邏輯 1。在斷字符結束時,軟件只需要將邏輯1寫入相應串行端口的RX引腳的端口鎖存位。
異步 10 位模式示例
異步 10 位工作模式可以說是 8051 系列中最常用的串行通信方法。這是因為此模式與熟悉的RS-232協議兼容。雖然信號電平不同,但使用簡單的電平轉換器將允許與任何個人計算機的標準串行端口進行通信。事實上,本應用筆記中的所有軟件都使用PC與DS80C320測試板接口進行測試。
此特定串行模式可以使用定時器 1 為串行端口 1 生成波特率,或為串行端口 1 生成定時器 2 或 0。在本例中,定時器2在自動重新加載模式下運行,以生成串行端口0的波特率。
建立定時器的工作模式后,重新加載值必須存儲在重新加載寄存器中。重載寄存器的內容可以使用以下公式計算所需的波特率和振蕩器頻率:
使用該公式,可以計算出任何所需波特率和振蕩器頻率的重載值。對于本軟件示例,假設振蕩器頻率為 11.0592 MHz。下表顯示了基于該晶體頻率的幾種常見波特率的重載值。應該注意的是,并非每個晶體值都會產生可接受的波特率。如果需要特定的波特率,則在為系統選擇晶體之前,可能需要對上述方程進行一些評估。
波特率 | RCAP2H | RCAP2L |
57600 | 0FFh | 0FAh |
9600 | 0FFh | 0直流小時 |
2400 | 0FFh | 070小時 |
1200 | 0飛揚 | 0E0h |
一旦確定了重載值,就必須將其加載到定時器的重載寄存器中,以建立定時器的輸出時鐘頻率。
初始化定時器后,可以根據需要設置串行端口。要為串行端口 0 建立正確的操作模式,必須正確設置 SCON 寄存器的 SM0 和 SM1 位(地址 098h)。下表顯示了這些位的可能設置和生成的模式。如圖所示,對于 0 位異步操作,SM1 和 SM0(SCON1.0 和 SCON0.0)必須分別設置為 1 和 10。
SM0 | SM1 | 模式 | 功能 | 長度 | 時期 |
0 | 0 | 0 | 同步 | 8 位 | 4/12 噸時鐘 |
0 | 1 | 1 | 異步 | 10 位 | 定時器 1 或 2* |
1 | 0 | 2 | 異步 | 11 位 | 64/32 噸時鐘 |
1 | 1 | 3 | 異步 | 11 位 | 定時器 1 或 2* |
*定時器2僅適用于串行端口0上的波特率生成。 |
由于串行端口將在中斷驅動模式下運行,因此必須正確設置中斷使能。通過將 ES0(地址 0ACh)和 EA(地址 0AFh)位設置為 1,串行端口 0 將在傳輸字符或接收字符時生成中斷。
作為初始化的最后一步,通過設置位 TR2(地址 0CAh)來啟動計時器。此時,串行通信可能開始。為了傳輸字符,將字符寫入 SBUF(字節地址 099h),并執行其他任務,直到收到中斷(在本例中為緊密循環)。在接收字符時,在發生中斷之前不需要執行任何操作。由于發送或接收都可能導致跳轉到同一中斷向量,因此中斷服務例程 (ISR) 必須確定哪個是原因。這是通過讀取SCON寄存器的TI(位地址099h)和RI(位地址098h)狀態位來完成的。如果設置了 TI,則“傳輸完成”會導致中斷。如果設置了 RI,則“接收”會導致中斷。如果傳輸導致中斷,則 TI 位可能被清除并退出 ISR。如果接收導致中斷,則必須清除 RI 位,并且必須從 SBUF 讀取接收的字符。
下面示例 1 的軟件列表說明了實現此串行操作模式的詳細信息。
雙串行端口示例
本例演示DS80C320上兩個串行端口的用法。該示例的主要目的是說明如何初始化和使用第二個端口。如前所述,有關串行端口 0 的許多信息同樣適用于串行端口 1。但是,此示例將有助于澄清有關使用此資源的任何混淆。
在此示例中,端口 1 (TXD1) 的輸出以“環回”配置連接到其輸入 (RXD1)。編寫該軟件以創建以端口 0 作為輸入和輸出的閉合串行環。運行終端仿真器的終端或 PC 連接到端口 0 的輸入 (RXD0) 和輸出 (TXD0)。最初,軟件通過端口0向終端輸出三行消息,DS80C320等待輸入。當終端向DS80C320發送字符時,設置RI位。當軟件識別出此位已設置時,它會讀取接收到的字符并將其傳輸到端口 1 的傳輸緩沖區。出于說明目的,字符在傳輸之前將轉換為大寫(如果尚未轉換為大寫)。由于端口 1 的輸出與其輸入相關聯,因此傳輸的字符會自動進入接收緩沖區。然后,軟件將此字符復制到端口 0 的傳輸緩沖區,從而使其從處理器傳輸出去。最后,字符作為大寫字符到達終端,從而完成循環。
在此軟件示例中,兩個串行端口都設置為從定時器1生成的波特時鐘運行。定時器設置為自動重新加載模式,計數和重新加載寄存器加載適當的值。定時器 1 用于計算重載值的公式與定時器 2 的公式不同,如下所示:
使用上述公式,可以計算所需波特率和振蕩器頻率的重載值。可以看出,重載值是 2 提高到 SMOD 的冪的函數。由于 SMOD 可以是 0 或 1,因此該項可以是 1 或 2 (20= 1, 21= 2)。因此,將 SMOD 設置為 1 具有使波特率加倍的效果。同樣,對于本軟件示例,假設振蕩器頻率為11.0592 MHz。下表3顯示了基于該晶體頻率為幾種常見波特率計算的重載值。
波特率 | SMOD | 重新加載 |
57600 | 1 | FF |
19200 | 1 | FD |
9600 | 0 | FD |
2400 | 0 | F4 |
1200 | 0 | E8 |
如上式所示,重載值是根據 SMOD 波特率倍增器位的設置計算的。如果該位對于所需的波特率為 0,則無需在初始化軟件中清除它 因為這是它的重置默認設置。但是,為清楚起見,示例中包含了清除兩個端口的此位的說明。由于SMOD位不是“位可尋址”的,因此必須寫入整個PCON寄存器。示例代碼顯示了使用單個邏輯指令清除和設置 SMOD 位的指令。程序中未使用的指令被注釋掉。
在該示例中,初始化定時器模式,加載計數和重新加載寄存器,清除兩個SMOD位,并禁用定時器中斷。這完全配置了波特時鐘生成。將兩個串行控制寄存器設置為所需模式后,定時器啟動,串行通信開始。
此示例處理串行通信的方式與前面的示例所示不同。此示例使用輪詢模式來監視串行狀態。由于此示例的操作更加結構化,因此這種輪詢方法是合適的。傳輸字符的基本函數是 GETCH 和 PUTCH。這兩個函數都執行一個緊密循環,等待設置適當的標志。當它出現時,程序將繼續。這通常被認為是浪費時間,但在此應用程序和其他類似應用程序中,輪詢操作是有意義的。
示例 2 的軟件列表說明了實現此串行操作模式的詳細信息。
地址識別示例
本例演示了高速微型串行通道的地址識別功能。此外,它還說明了一種不涉及使用定時器(即 串行模式 2)。
高速微型的地址識別功能經常用于多處理器通信。總線上的每個處理器都可以分配一個唯一的地址。配置后,處理器將無法識別任何串行通信,除非其地址匹配。有關此工作模式的完整詳細信息,請參閱《高速微控制器用戶指南》。
在此示例中,地址設置為識別控件 C 字符 (03h)。在控件 C 之前接收的任何字符都將被忽略。但是,當收到控件 C 時,會立即打印一個字符串, 在 RXD0 上收到的后續字符將回顯到 TXD0。
如前所述,圖示的產生波特率的模式不涉及定時器(即串行模式2)。波特率可選,如下式所示:
從等式中可以看出,如果需要特定的波特率,則這種串行模式的晶體頻率選擇比其他模式受到更多的限制。事實上,產生標準波特率的晶體頻率相對較少。在本例中,假設振蕩器頻率為 7.372 MHz,這將導致速率為 115,200 波特,SMOD 清除為 0。看到 12.0 MHz 的振蕩器將產生 187,500 波特的速率,SMOD 清除為 0 是很常見的。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7542瀏覽量
151316 -
計時器
+關注
關注
1文章
420瀏覽量
32690 -
發送器
+關注
關注
1文章
259瀏覽量
26816
發布評論請先 登錄
相關推薦
評論