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