跳轉到內容

序列程式設計/典型 RS232 硬體配置

來自 Wikibooks,開放的書籍,開放的世界

本頁面概述了各種計算機和裝置中常見的序列 RS232 硬體配置。它應該作為一些序列硬體直接程式設計的指南和介紹。

提供的資訊具有通用性,因為某些裝置或計算機中找到的實際序列硬體可能有所不同。如今,硬體通常整合在一個晶片中,甚至具有許多其他功能,例如並行埠,與序列通訊無關。然而,本模組提供了關於哪些邏輯或物理元件執行什麼以及序列硬體的實際程式設計發生位置的良好概述。

相關元件

[編輯 | 編輯原始碼]

下圖概述了相關元件及其連線方式

RS232      +-----------+   +-----------+   +-----------+   +-----------+
Interface  | Line      |   |           |   | Interface |   |           |
-----------+ Driver /  +---+   UART    +---+ Logic     +---+    CPU    |
           | Receiver  |   |           |   |           |   |           |
           +-----------+   +-----+-----+   +-----+-----+   +-----------+
                                 |               |
                                 |               |
                           +-----+-----+         |
                           | Baud Rate |         |
                           | Generator +---------+
                           |           |
                           +-----------+

我們將依次討論這些元件及其用途。

線路驅動器/接收器

[編輯 | 編輯原始碼]

RS-232 通訊使用高達 ±15V 的電壓(一些早期規格甚至使用 ±25V)。它使用反向邏輯(高/真/1 是負電壓,低/假/0 是正電壓)。這些電壓對於現代(甚至更舊的)計算機邏輯來說太高了。因此,RS-232 介面通常包含特殊的硬體,即所謂的線路驅動器和線路接收器。

線路驅動器負責將典型的計算機電壓邏輯轉換為 RS-232 線路上使用的較高電壓,並反轉邏輯。這在計算機硬體傳輸序列資料時使用。電壓輸出通常是連續短路安全的,因為這是 RS-232 標準的要求。

線路接收器負責執行線路驅動器的反向操作。它將傳入的 RS-232 訊號轉換為對計算機邏輯安全的電壓,當然也反轉邏輯。

實際上,通常使用不止一個線路驅動器和接收器,因為 RS-232 電纜中的每個傳入 RS-232 訊號都需要它自己的接收器,每個傳出 RS-232 訊號都需要它自己的驅動器。但是,通常多個驅動器/接收器組合在一個晶片中。該晶片本身還保護計算機邏輯免受可能發生在序列線上的尖峰電壓。一些線路驅動器/接收器晶片甚至在晶片上產生必要的 RS-232 電壓,而另一些則需要外部電源來提供這些電壓。

線路驅動器/接收器通常不可程式設計。它們被硬連線到邏輯中,因此對於程式設計師來說無關緊要。

另請參閱

UART(通用非同步接收器/傳送器)是序列硬體的核心。它是一個晶片或晶片的一部分,其目的是在並行資料和序列資料之間轉換。RS-232 UART 通常還會在傳輸時新增必要的起始/停止位和奇偶校驗位,並在接收時解碼這些資訊。

UART 通常完全在計算機邏輯電壓下工作。其序列資料輸入/輸出電壓是計算機邏輯電壓,而不是序列線路電壓。它們將實際線路介面留給特定的線路驅動器/接收器。該線路驅動器/接收器不一定需要是 RS-232 線路驅動器/接收器,也可以是 RS-422 差分驅動器/接收器。這是 UART 被稱為通用的原因,以及波特率、奇偶校驗、停止位數量、資料位數量可程式設計也是原因。如果 UART 和線路驅動器/接收器都放置在同一個晶片中,它們之間的區別就會變得模糊。此類晶片通常也以“UART”的標籤出售。

UART 被稱為非同步,因為它們不使用特殊的時鐘訊號與遠端端同步。相反,它們使用起始/停止位來識別序列流中的資料位。
由於 UART,其餘硬體以及軟體應用程式都可以處理普通位元組來儲存通訊資料。UART 的工作是在傳送時將一個位元組切分成一系列序列位,並在接收時將一系列位組裝成一個位元組。UART 通常包含 8 位寬的接收器和傳送器緩衝區。如果使用 7 位傳輸等,則可能不會使用所有位。接收到的序列資料以並行方式提供給接收器緩衝區,要傳送的資料以並行方式寫入傳送器緩衝區。根據 UART 的不同,緩衝區可能只有一位元組深,也可能只有幾字節深(在 15 或 16 位元組範圍內)。緩衝區越淺,與 CPU 的通訊就越需要精確。例如,如果接收器緩衝區只有一位元組深,並且資料沒有被及時獲取,則下一個接收到的資料可能會覆蓋接收器緩衝區中先前接收到的資料,並且先前接收到的資料將丟失。

由於序列介面上的時序很重要,因此 UART 通常連線到波特率發生器,可以是 UART 晶片中的內部波特率發生器,也可以是外部波特率發生器。

USART(通用同步/非同步接收器/傳送器)是 UART 的一個版本,它也可以同步通訊。許多現代 IC 具有此功能。但是,由於 RS232 非同步工作,因此 USART 的同步功能不用於序列通訊。根據 USART 的特定型別,同步功能要麼在啟動時關閉,要麼需要關閉。一旦關閉,USART 在進行 RS232 通訊時就是 UART。

波特率發生器

[編輯 | 編輯原始碼]

工作原理

[編輯 | 編輯原始碼]

波特率發生器是一個振盪器。它提供一個頻率訊號,用於控制序列介面的時序。由於不同的線路速度需要不同的時序,因此波特率生成需要靈活。

實現靈活的波特率生成一般有兩種方法:波特率生成器本身可程式設計,可以生成所需的各種頻率;或者 UART 有可程式設計的分頻器或倍頻器,將波特率生成器的頻率轉換為所需的頻率。觀察者可能已經注意到,典型的波特率(300bps、600bps、1200bps、2400bps、9600bps(4 x 2400bps)等)之間存在固定關係。這簡化了使用分頻器或倍頻器來生成所需時序的過程。

根據 UART 的具體情況,波特率生成器可能需要一些外部元件,也可能直接整合到 UART 晶片中。從外部來看,對波特率生成進行程式設計改變是控制序列連線速度的方法。在對波特率進行程式設計時,通常不直接提供所需的波特率“明文”,而是需要提供一些分頻器或係數。要提供正確的分頻器或係數,需要了解所用波特率生成器的基本頻率。

振盪器和魔法石英晶體值

[編輯 | 編輯原始碼]

RS-232 通訊是非同步的。因此,發射機和接收機之間沒有顯式的方法,也沒有共享的時鐘訊號來進行同步。相反,它們透過起始位進行同步,並進一步假設一定的位元長度。位元長度是波特率的直接函式。例如,RS-232 上的 9600 波特意味著每秒傳輸 9600 個位元。因此,每個位元的長度為 1/9600 秒。為了確保發射機和接收機假設相同的位元長度,它們需要使用相同的波特率。並且通訊雙方的波特率需要精確到一定程度。否則資料傳輸將會失敗。當雙方的波特率沒有很好地對齊時,常見的錯誤包括幀錯誤、接收錯誤或丟失位元。

波特率生成器,因為它生成傳送和接收資料的時鐘頻率,負責提供所需的波特率精度。作為經驗法則,通常情況下,波特率的總偏差在最壞情況下不應超過 +/- 4%。如果將這個“誤差預算”平均分配到兩邊,這意味著每邊的波特率需要保持在標稱值的 +/- 2% 以內。實際上,應該避免這種最壞情況,並將波特率至少保持在每邊的 +/- 1% 以內。

通常使用晶體振盪器來構建波特率生成器,該生成器具有適用於 RS-232 的初始精度、溫度漂移和長期漂移。也就是說,波特率生成器基於一個振盪器,該振盪器反過來使用石英晶體作為參考。更簡單的振盪器,例如 RC 振盪器,通常不夠好。

通常,所有晶體振盪器電子裝置都整合在波特率生成器 IC 中。如果使用具有整合波特率生成器的 UART,該 UART 通常包含這些電子裝置。通常只需要新增石英晶體。

為了實現常見的波特率,石英晶體的頻率值需要具有某些“魔法”值。乍一看,這些值似乎相當奇怪。但是,它們通常是 300(通常是支援的最低波特率)或 25(對於 25、50、75、150 的極低波特率)和二的冪的倍數。使用二的冪是因為將頻率除以二的冪很容易,從而使可配置或可程式設計波特率生成器成為可能。

例如,將相當奇怪的晶體頻率 4.915200 MHz 除以 256(二的冪),得到 19200 Hz 的不錯值。頻率為 4.915200 MHz 的晶體被稱為波特率晶體魔法晶體。下表列出了常見的波特率晶體頻率。

  • 1.8432 MHz、3.6864 MHz、4.9152 MHz、5.5296 MHz、6.1440 MHz、7.3728 MHz、9.8304 MHz
  • 11.0592 MHz、12.2880 MHz、12.9024 MHz、14.7456 MHz、16.5888 MHz、18.4320 MHz、19.6608 MHz
  • 20.2752 MHz、22.1184 MHz、23.9616 MHz、25.8048 MHz、27.6480 MHz、29.4912 MHz
  • 31.3344 MHz、33.1776 MHz、35.0208 MHz、36.8640 MHz

使用哪個晶體頻率取決於所用的波特率生成器/UART。應參考波特率生成器/UART 的資料手冊以獲取詳細資訊。

介面邏輯

[編輯 | 編輯原始碼]

UART 和波特率生成器只是晶片,或者可以是更大晶片的元件。為了簡化討論,我們假設它們是一個晶片。該晶片通常有一堆引腳,這些引腳需要以某種方式由 CPU 寫入或讀取。因此,需要一些方法讓 CPU 定址該晶片以與其通訊。還需要一些方法讓晶片在某些情況下發出聲音。

介面邏輯的任務是提供這種連線。邏輯因系統架構的不同而異。一種常見的技術是將 UART 的傳送和接收緩衝區對映到 CPU 的記憶體地址空間中。這樣一來,它們對於 CPU 來說就像普通的記憶體一樣。另一種方法是將這些緩衝區連線到某些 CPU 特定的 I/O 埠。除了傳送和接收緩衝區外,CPU 還必須能夠訪問 UART 的控制線、波特率、奇偶校驗和字元大小程式設計介面。

由於 UART 不能緩衝無限量的傳入資料(有些只能在接收緩衝區中緩衝一個位元組),CPU(或其他硬體)需要“足夠快”地從 UART 讀取資料。CPU 可以連續輪詢 UART 以檢查是否有新資料可用,或者 UART 可以通知何時有新資料準備好。這種通知通常透過 CPU 中斷來完成。介面邏輯的任務是代表 UART 觸發此類中斷。兩種機制(輪詢或中斷驅動)都有優點和缺點。

在另一個方向上,傳送資料時,存在類似的問題。CPU 需要“足夠快”地傳遞資料,以防止緩衝區下溢。這不是致命的,但會降低序列通訊的效能和效率。CPU 也可以“過快”地將資料傳遞給 UART,導致 UART 中的發射機緩衝區溢位。這可以透過輪詢(CPU 檢查 UART 是否準備好傳送)或中斷(UART 通知 CPU 它需要更多資料)來控制。同樣,介面邏輯必須提供實現這兩種工作模式中的一種或兩種的方法。

介面邏輯決定了程式設計師如何以及在何處找到他/她要程式設計的 UART,以及他/她可以以何種工作模式(輪詢、中斷驅動)傳送和接收資料。例如,現代 PC 中的介面邏輯在某種程度上是可程式設計的。但是,這通常由 BIOS 完成(設定 I/O 地址和中斷號)。在較舊的 PC 和許多其他計算機中,介面邏輯不可程式設計。從應用程式開發人員的角度來看,很少有必要對介面邏輯進行程式設計。通常,它被視為硬連線邏輯。

為了對特定的硬體進行程式設計,需要了解

  • 如何訪問 UART 和波特率生成器(介面邏輯如何工作)。這通常需要了解一些 I/O 或記憶體地址。
  • UART 和波特率生成器的通訊方式(介面邏輯是否提供輪詢或中斷,或者兩者都提供?)。
  • 如何對 UART 進行程式設計。為此,提供 UART 的資料手冊非常有用。
  • 如何對波特率生成器進行程式設計,這可能只是 UART 晶片的一部分。

或者,可以使用作業系統的序列程式設計 API,該 API 應該知道所有這些,並“做正確的事情”。

進一步閱讀

[編輯 | 編輯原始碼]
  • 頁面程式設計 8250 UART提供了在特定硬體組合中對特定 UART 進行程式設計的詳細資訊。
華夏公益教科書