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