第4章 異步串行通信_第1頁
第4章 異步串行通信_第2頁
第4章 異步串行通信_第3頁
第4章 異步串行通信_第4頁
第4章 異步串行通信_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章異步串行通信本章導讀:目前幾乎所有的臺式電腦都帶有9芯的異步串行通信口,簡稱串行口或COM口.由于歷史的原因,通常所說的串行通信就是指異步串行通信。USB、以太網等也用串行方式通信,但與這里所說的異步串行通信物理機制不同。有的臺式電腦帶有兩個串行口:COM1口和COM2口,部分筆記本電腦也帶有串行口。隨著USB接口的普及,串行口的地位逐漸降低,但是作為設備間簡便的通信方式,在相當長的時間內,串行口還不會消失,在市場上也可很容易購買到USB到串行口的轉接器因為簡單且常用的串行通信只需要三根線(發送線、接收線和地線),所以串行通信仍然是MCU與外界通信的簡便方式之一。實現異步串行通信功能的模塊在一部分MCU中被稱為通用異步收發器(UniversalAsynch-ronousReceiver/Transmitters,UART),在另一■些MCU中被稱為串行通信接口(SerialCommunicationInterface,SCI)。串行通信接口可以將終端或個人計算機連接到MCU,也可將幾個分散的MCU連接成通信網絡,本章的主要知識點有①闡述了串口相關的基礎知識;②描述了K60串口模塊的功能概要;③介紹了串口模塊驅動構件編程時涉及的相關寄存器;④設計并封裝了串行通信的驅動構件;⑤給出第一個中斷例程的執行過程和設計流程。本章介紹的K60UART模塊的工作原理以及編程實例,這些編程實例都使用了基于構件的編程思想,讀者在閱讀時可以仔細體會,以求得對編程方法有更深刻的理解本章所出現的UART字眼,在沒有其他說明的情況下,都是特指K60的UART模塊,本章串口驅動編程涉及的寄存器全部給出其詳細介紹,目的是讓讀者對嵌入式底層驅動編程設計的寄存器有個直觀的了解,以后各章節將不再給出相關寄存器的詳細介紹。4.1異步串行通信的基礎知識本節簡要概括了串行通信中常用的基本概念,為學習MCU的串行接口編程做準備。對于己經了解這方面知識的讀者,可以略讀本節。4.1.1基本概念“位”(bit)是單個二進制數字的簡稱,是可以擁有兩種狀態的最小二進制值,分別用“0〃和“1〃表示。在計算機中,通常一個信息單位用8位二進制表示,稱為一個“字節”(Byte)。串行通信的特點是:數據以字節為單位,按位的順序(例如最高位優先)從一條傳輸線上發送出去。這里至少涉及以下幾個問題:第一,每個字節之間是如何區分開的?第二,發送一位的持續時間是多少?第三,怎樣知道傳輸是正確的?第四,可以傳輸多遠?這些問題屬于串行通信的基本概念。串行通信分為異步通信與同步通信兩種方式,本節主要給出異步串行通信的一些常用概念。正確理解這些概念,對串行通信編程是有益的。異步串行通信的格式通常,異步串行通信采用的是NRZ數據格式,英文全稱是:“standardnon-retum-zeromark/spacedataformat”,可以譯為:"標準不歸零傳號/空號數據格式”。這是一個通信術語,“不歸零”的最初含義是:用負電平表示一種二進制值,正電平表示另一種二進制值,不使用零電平。“mark/space”即“傳號/空號”分別表示兩種狀態的物理名稱,邏輯名稱記為“1/0”。對學習嵌入式應用的讀者而言,只要理解這種格式只有“1”、“0”兩種邏輯值就可以了。圖4-1給出了8位數據、無校驗情況的傳送格式。圖4-1串行通信數據格式這種格式的空閑狀態為“I”,發送器通過發送一個“0”表示一個字節傳輸的開始,隨后是數據位(在MCU中一般是8位或9位,可以包含校驗位)。最后,發送器發送1到2位的停止位,表示一個字節傳送結束。若繼續發送下一字節,則重新發送開始位,開始一個新的字節傳送。若不發送新的字節,則維持“1”的狀態,使發送數據線處于空閑。從開始位到停止位結束的時間間隔稱為一幀(Frame),所以,也稱這種格式為頓格式。每發送一個字節,都要發送“開始位”與“停止位”,這是影響異步串行通信傳送速度的因素之一。同時因為每發送一個字節,必須首先發送“開始位”,所以稱之為“異步”(Asynchronous)通信。串行通信的波特率位長(BitLength),也稱為位的持續時間(BitDuration)。其倒數就是單位時間內傳送的位數。人們把每秒內傳送的位數叫做波特率(BaudRate),其單位是位/秒,記為bps,它是英文bitpersecond的縮寫,習慣上這個縮寫不用大寫,而用小寫。通常情況下,波特率的單位可以省略。通常使用的波特率有600、900、1200、1800、2400、4800、9600、19200、38400、57600、115200等。在包含開始位與停止位的情況下,發送一個字節需10位,很容易計算出,在各波特率下,發送1KB所需的時間。顯然,這個速度相對于目前許多通信方式而言是慢的,那么,異步串行通信的速度能否提得很高呢?答案是不能。因為隨著波特率的提高,位長變小,以致很容易受到電磁源的干擾,通信就不可靠了。當然,還有通信距離問題,距離小,可以適當提高波特率,但這樣畢竟提高的幅度非常有限,達不到大幅度提高的目的。奇偶校驗在異步串行通信中,我們是如何知道傳輸是正確的呢?最常見的方法是增加一個位(奇偶校驗位),供錯誤檢測使用。字符奇偶校驗檢查(CharacterParityChecking)稱為垂直冗余檢查(VerticalRedundancyChecking,VRC),它是為每個字符增加一個額外位使字符中“1〃的個數為奇數或偶數。奇數或偶數依據使用的是“奇校驗檢查”還是“偶校驗檢查”而定。當使用“奇校驗檢查”時,如果字符數據位中“1〃的數目是偶數,校驗位應為“1〃,如果“1〃的數目是奇數,校驗位應為“0〃。當使用“偶校驗檢查”時,如果字符數據位中“1〃的數目是偶數,則校驗位應為“0〃,如果是奇數則為“1〃。這里列舉奇偶校驗檢查的一個實例,看看ASCII字符“R〃,其位構成是1010010O由于字符“R〃中有3個位為“1〃,若使用奇校驗檢查,則校驗位為0;如果使用偶校驗檢查,則校驗位為1。在傳輸過程中,若有1位(或奇數個數據位)發生錯誤,使用奇偶校驗檢查,可以知道發生傳輸錯誤。若有2位(或偶數個數據位)發生錯誤,使用奇偶校驗檢查,就不能知道已經發生了傳輸錯誤。但是奇偶校驗檢查方法簡單,使用方便,發生1位錯誤的概率遠大于2位的概率,所以“奇偶校驗”這種方法還是最為常用的校驗方法。幾乎所有MCU的申行異步通信接口都提供這種功能。4.串行通信的傳輸方式在串行通信中,經常用到“單工”、“雙工”、“半雙工”等術語。它們是串行通信的不同傳輸方式。下面簡要介紹這些術語的基本含義。單工(Simplex):數據傳送是單向的,一端為發送端,另一端為接收端。這種傳輸方式中,除了地線之外,只要一根數據線就可以了。有線廣播就是單工的。全雙工(Full-duplex):數據傳送是雙向的,且可以同時接收與發送數據。這種傳輸方式中,除了地線之外,需要兩根數據線,站在任何一端的角度看,一根為發送線,另一根為接收線。一般情況下,MCU的異步串行通信接口均是全雙工的。半雙工(Half-duplex):數據傳送也是雙向的,但是在這種傳輸方式中,除地線之外,一般只有一根數據線。任何時刻,只能由一方發送數據,另一方接收數據,不能同時收發。4.1.2RS-232C總線標準現在回答“可以傳輸多遠”這個問題。MCU引腳輸入/輸出一般使用TTL(TransistorTransistorLogic)電平,即晶體管-晶體管邏輯電平。而TTL電平的“1〃和“0〃的特征電壓分別為2.4V和0.4V(目前使用3V供電的MCU中,該特征值有所變動),即大于2.4V則識別為“1”,小于0.4V則識別為“0〃。它適用于板內數據傳輸。若用TTL電平將數據傳輸到5m之外,那么可靠性就很值得考究了。為使信號傳輸得更遠,美國電子工業協會(ElectronicIndustryAssociation,EIA)制訂了串行物理接口標準RS-232C。RS-232C采用負邏輯,-15V?-3V為邏輯“1〃,+3V?+15V為邏輯“0〃。RS-232C的最大傳輸距離是30m,通信速率一般低于20kbps。當然,在實際應用中,也有人用降低通信速率的方法,通過RS-232電平,將數據傳送到300m之外,這是很少見的,且穩定性很不好。RS-232C總線標準最初是為遠程數據通信制訂的,但目前主要用于幾米到幾十米范圍內的

近距離通信。有專門的書籍介紹這個標準,但對于一般的讀者,不需要掌握RS-232C標準的全部內容,只要了解本節介紹的這些基本知識就可以使用RS-232。目前一般的PC均帶有1個到2個串行通信接口,人們也稱之為RS-232接口,簡稱“串口”,它主要用于連接具有同樣接口的室內設備。早期的標準串行通信接口是25芯插頭,這是RS-232C規定的標準連接器(其中,2條地線,4條數據線,11條控制線,3條定時信號,其余5條線備用或未定義)。后來,人們發現在計算機的串行通信中,25芯線中的大部分并不使用,逐漸改為使用9芯串行接口。一段時間內,市場上還有25芯與9芯串行接口。一段時間內,市場上還有25芯與9芯的轉接頭,方便了兩種不同類型之間的轉換。后來,使用25芯串行插頭極少見到,25芯與9芯轉接頭也極少有售。因此,目前幾乎所有計算機上的串行口都是9芯接口。圖4-2給出了9芯串行接口的排列位置,相應引腳含:。I。。。O圖4-2§芯串行接口排列u義見表4-1。在RS-232通信中,常常使用精簡的RS-232通信,通信時僅使用3根信號線:RXD(接收線)、TXD(發送線)和GND(地線)。其他為進行遠程傳輸時接調制解調器之用,有的信號也可作為硬件握手信號,初學時可以忽略這些信號的含義。表4-19芯串行接口引腳含義表引腳號功能引腳號功能1接收線信號檢測(載波檢測DCD)6數據通信設備準備就緒(DSR)2接收數據線(RXD)7請求發送(RTS)3發送數據線(TXD)8允許發送(CTS)4數據終端準備就緒(DTR)9振鈴指示5信號地(SG)4.1.3電平轉換電路原理在MCU中,若用RS-232C總線進行串行通信,則需外接電路實現電平轉換。在發送端,需要用驅動電路將TTL電平轉換成RS-232C電平;在接收端,需要用接收電路將RS-232C電平轉換為TTL電平。電平轉換器不僅可以由晶體管分元件構成,也可以直接使用集成電路。目前使用MAX3232芯片較多,該芯片使用單一+3V電源供電實現電平轉換。圖4-3給出了MAX3232的引腳。

引腳含義簡要說明如下。Vcc(16腳):正電源端,一般接+5V;GND(15腳):地;VS+(2W):VS+=2Vcc-1.5V=4.5V;VS-(6腳):VS-=-2Vcc-1.5V=-7.5V;C2+、C2-(4、5腳):一般接0.1nF的電解電容;C1+、Cl-(1、3腳):一般接0.1|iF的電解電容。輸入/輸出引腳分兩組,基本含義見表4-2。在實際使用時,若只需要一路串行通信接口,可以使用其中的任何一組。利用MAX3232將TTL電平轉換為RS-232電平的電路接法稍后結合串行通信接口的外圍硬件電路討論。焊接到PCB板上的MAX3232芯片檢測方法:正常情況下,①T1IN=3V,貝ijT10UT=-8V;T1IN=0V,貝UT10UT=5▽:②將R1IN與T10UT相連,令T1IN=3V,貝UR10UT=3V;令T1IN=0V,則R1OUT=0V。表4-2MAX3232芯片輸入輸出引腳分類與基本接法組別TTL電平引腳方向典型接口232電平引腳方向典型接口111輸入接MCU的TXD13輸入接到9芯接口的2腳RXD12輸出接MCU的RXD14輸出接到9芯接口的3腳TXD210輸入接MCU的TXD8輸入接到9芯接口的2腳RXD9輸出接MCU的RXD7輸出接到9芯接口的3腳TXD所有型號MCU的串行通信接口,都具有發送引腳TxD、接收引腳RxD,它們是TTL電平引腳。要利用這兩個引腳與外界實現異步串行通信,還必須將TTL電平轉為RS-232電平,這可利用上節介紹的MAX3232來完成。本節從通用角度討論串行通信接口的電路設計、基本編程結構與編程原理,為實際編程做準備。

具有串行通信接口的MCU,一般具有發送引腳(TXD)與接收引腳(RXD),不同公司或不同系列的MCU,使用的引腳縮寫名可能不一致,但含義相同。串行通信接口的外圍硬件電路,主要目的是將MCU的發送引腳TXD與接收引腳RXD的TTL電平,通過RS-232電平轉換芯片轉換為RS-232電平。圖4-4給出了基本串行通信接口的電平轉換電路。基本工作過程如下所述。發送過程:MCU的TXD(TTL電平)經過MAX3232的11腳(T1IN)送至0MAX3232內部,在內部TTL電平被“提升”為232電平,通過14腳(TIOUT)發送出去。接收過程:外部232電平經過MAX3232的13腳(R1IN)進入到MAX3232的內部,在內部232電平被“降低”為TTL電平,經過12腳(R10UT)送到0MCU的RXD,進入MCU內部。進行MCU的串行通信接口編程時,只針對MCU的發送與接收引腳,與MAX3232無關,MAX3232只是起到電平轉換作用。圖4-4串行通信接口電平轉換電路4ZK電平TTL電平RUMTHNTIOUTh]OUl161514131211109) MAX232CPEAB 圖4-4串行通信接口電平轉換電路4ZK電平TTL電平RUMTHNTIOUTh]OUl161514131211109) MAX232CPEAB E5f*7?T45Vy1HF_LTTTL畦平轉為232電平K60的通用異步收發器(UART)支持全雙工的數據傳輸,可編程8位或者9位數據格式,采用標準不歸零傳號/空號(NRZ)格式,可以選擇通過配置波特率采用可編程脈沖寬度的IrDA1.4歸零逆轉(RZI)格式;基于模塊時鐘頻率的1/32,有13位波特率的選擇;可以獨立地啟用發送器和接收器,分別設置發送器與接收器的極性,每一個發送和接收可支持1、4、8、16、32、64和128數據字的緩沖區,發送與接收有獨立的FIFO結構;支持SIM卡和智能卡接口的ISO7816協議;12個標志符的中斷驅動操作;UART發送器的硬件可產生并發送奇偶校驗位,而接收器的奇偶校驗硬件則能據此確保接收數據的完整性;同時,UART具有接收器幀錯誤檢測功能,帶有DMA接口。本節主要闡述K60的UART模塊的結構及功能,包括波特率的計算方法、發送器和接收器的內部結構等。K60包括6個相同且獨立的UART模塊,每個模塊都含有相互獨立的發送器和接收器。外部引腳UART的外部引腳有?發送數據引腳UTXDx;?接收數據引腳URXDx。引腳名中的“U〃是UART的簡寫,“x〃表示模塊的編號,取值為0?5。通常情況串行通信只使用發送數據引腳UTXDx與接收數據引腳URXDx。波特率發生器UART0和UART1時鐘源為內核時鐘,UART2?UART5的時鐘源為外設時鐘(總線時鐘)。波特率由一個13位的模數計數器和一個5位的分數微調計數器共同決定。13位的SBR[SBR]范圍為1?8191,它決定了模塊的時鐘分頻。微調計數器給波特率時鐘增加一個細微的延時,以便匹配系統波特率。波特率時鐘與模塊時鐘同步并驅動接收器。計算公式為UART波特率=UART模塊時鐘/(16x(SBR[SBR]+BRFA))收發器的工作UART發送器和接收器均可容納8、9或10位數據字符°C1[M]和C1[PE]位和C4[M10]的狀態決定了收發器容納數據字符的長度。MCU通過數據寄存器將數據寫到發送數據緩沖K,之后發送器進行移位發送。當發送結束后,會置位發送緩沖區空標志位S1[TDRE],同時也可以根據設置決定是否產生中斷。在UART接收期間,接收移位寄存器從異步接收器輸入信號移進一個幀。一個完整的幀移進接收移位寄存器后,幀的數據部分發送到UART接收緩沖區中。另外,接收進程期間可能的噪音和奇偶校驗錯誤標志也被復制到了UART接收緩沖區中。接收數據緩沖區通過數據寄存器和C3[T8]寄存器訪問。如果接收緩沖區中的數據字數目等于或多于RWF1FO[RXWATER]指定的數目,那么S1[RDRF]標志位會被置1。如果C2[RIE]也設為1,則會產生一個接收中斷。4.3UART模塊的編程結構表4-3給出了K60的UART模塊中的UART0各寄存器的映射地址、名稱、訪問權限以及復位值,它們的位寬均為8。對于其他5個UART,同名寄存器的地址相對于UART0的偏移量分另U為0x0000_1000、0x0000_2000、0x0000_3000、0x0008_0000、0x0008—1000。例如,UARTO的波特率高字節寄存器的基址為0x4006_A000,則UART1為0x4006_B000,UART2為0x4006_C000,UART3為0x4006D000,UART4為0x400EA000UART5為0x400EB000,其他寄存器類似。表4-3UART模塊存儲映射寄存器基址UART0寄存器權限復位值0x4006_A000波特率高字節寄存器(UARTx_BDH)讀/寫0x00

0x4006_A001波特率低字節寄存器(UARTx_BDL)讀/寫0x040x4006_A002控制寄存器1(UARTx_Cl)讀/寫0x000x4006_A003控制寄存器2(UARTx_C2)讀/寫0x000x4006_A004狀態寄存器1(UARTx_Sl)只讀0xC00x4006_A005狀態寄存器2(UARTx_S2)讀/寫0x000x4006_A006控制寄存器3(UARTx_C3)讀/寫0x000x4006A007數據寄存器((UARTx_D)讀/寫0x000x4006_A008地址匹配寄存器1(UARTx_MAl)讀/寫0x000x4006_A009地址叫配寄存器2(UARTx_MA2)讀/寫0x000x4006_A00A控制寄存器4(UARTx_C4)讀/寫0x00寄存器基址寄存器權限復位值UART00x4006_A00B控制寄存器5(UARTx_C5)讀/寫0x000x4006_A00C擴展數據寄存器(UARTx_ED)只讀0x000x4006_A00D調制解調器寄存器(UARTx_MODEM)讀/寫0x000x4006_A00E紅外寄存器(UARTxJR)讀/寫0x000x4006_A010FIFO參數寄存器(UARTx_PFIFO)讀/寫0x000x4006_A011FIFO控制寄存器(UARTx_CFIFO)讀/寫0x000x4006_A012FIFO狀態寄存器(UARTx_SFlFO)讀/寫0xC00x4006_A013FIFO發送水位寄存器(UARTx_TWFlFO)讀/寫0x000x4006_A014FIFO發送計數寄存器(UARTx_TCFIFO)只讀0x000x4006_A015FIFO接收水位寄存器(UARTx_RWFIFO)讀/寫0x010x4006_A016FIFO接收計數寄存器(UARTx_RCFIFO)只讀0x000x4006_A0187816控制數寄存器(UARTx_C7816)讀/寫0x000x4006_A0197816中斷使能寄存器(UARTx_IE7816)讀/寫0x000x4006_A01A7816中斷狀態寄存器(UARTx_lS7816)讀/寫0x000x4006_A0IB7816等待參數寄存器(UARTx_WP7816T0)讀/寫OxOA0x4006_A01B7816等待參數寄存器(UARTx_WP7816Tl)讀/寫OxOA0x4006_A01C7816等待N寄存器(UARTx_WN7816)讀/寫0x000x4006_A01D7816等待FD寄存器(UARTx_WF7816)讀/寫0x010x4006_A01E7816錯誤閾值寄存器(UARTx_ET7816)讀/寫0x000x4006_A0IF7816發送長度寄存器(UARTx_TL7816)讀/寫0x00以上寄存器的用法在K60的芯片手冊上有詳細的說明,下面按初始化順序闡述基本編程需要使用的寄存器。注意:下面所列寄存器名中的“x”表示UART模塊編號,取05。1?控制寄存器2(UARTx_C2)數據位D7D6D5D4D3D2D1DO定義TIETCIERIEILIETERERWUSBK復位0D7—TIE,發送器中斷或DMA傳送使能。TIE根據C5[TDMAS]使能S1[TDRE]標志產生中斷請求或者DMA傳送請求。0:TDRE中斷和DMA傳送請求禁止。1:TDRE中斷或者DMA傳送使能。D6—TCIE,傳送結束中斷使能。TCIE使能S1[TC]傳送完成標志產生中斷請求。0:TC中斷請求禁止。1:TC中斷請求使能。D5—RIE,接收器滿中斷或DMA傳送使能。RIE根據C5[RDMAS]使能S1[RDRF]標志產生中斷請求或DMA傳送請求。0:RDRF中斷和DMA傳送請求禁止。1:RDRF中斷或DMA傳送請求使能。D4—ILIE,空閑線中斷使能。1LIE根據C5[ILDMAS]的狀態使能S1[IDLE]空閑線標志產生中斷請求。0:IDLE中斷請求禁止。1:IDLE中斷請求使能。D3-TE,發送器使能。TE使能UART發送器。TE位可以通過清0然后置位TE位來排列一個空閑前導。當7816E被置位(使能)并且C7816[TTYPE]=1時,TE位在請求塊被發送之后會被自動清0。當TL7816[TLEN]=0并且四個附加字符被發送時,TE位自動清0的條件會一直被檢測是否達到。0:發送器關閉。1:發送器開啟。D2—RE,接收器使能。RE使能UART接收器。0:接收器關閉。1:接收器開啟。D1—RWU,接收器喚醒控制。RWU可以被置位來使得UART接收器處于備用狀態。當RWU事件(C1[WAKE]被清0的IDLE事件或者C1[WAKE]被置位時的地址匹配)發生時,RWU自動清0。當7816E被置位時,此位必須被清0。0:正常操作。1:RWU使能喚醒功能并禁止接收器中斷請求。通常,硬件通過自動清0RWU來喚醒接收器。DO—SBK,發送中止。鎖住的SBK發送一個中止字符(S2[BRK13]清0時,10、11或12個邏輯0;S2[BRK13]置位時,13或14個邏輯0)。鎖住意味著在中止字符發送結束之前清除SBK位。只要SBK被置位,發送器就會繼續發送完整的中止字符。當7816E被置位時,此位必須被清0。0:正常發送器操作。1:發送排列好的中止字符。2.控制寄存器1(UARTx_C1)數據位D7D6D5D4D3D2D1DO定義LOOPSUARTSWAIRSRCMWAKEILTPEPT復位0D7—LOOPS,循環模式選擇。當LOOPS被置位時,RxD引腳從UART分離,發送器輸出內部連接到接收器輸入。發送器和接收器必須使能來使用循環功能。0:正常操作。1:發送器輸出內部連接到接收器輸入的循環模式。接收器輸入由RSRC位決定。D6—UARTSWAI,UART在等待模式停止。0:在等待模式UART時鐘繼續運行。1:當CPU處于等待模式時,UART時鐘凍結。D5—RSRC,接收器信號源選擇。這個位在LOOPS位被置位時才有意義。當LOOPS被置位時,RSRC位決定接收器移位寄存器輸入的信號源。0:選擇內部回環模式,接收器輸入內部連接到發送器輸出。h單線UART模式,接收器輸入連接到發送器引腳輸入信號。D4-M,9位或8位模式選擇。當7816E被置位(使能)時,此位必須被置位。0:正常模式-起始位+8位數據位(由MSBF決定MSB/LSB優先)+停止位。1:使用模式-起始位+9位數據位(由MSBF決定MSB/LSB優先)+停止位。D3-WAKE,接收器喚醒方法選擇°WAKE決定哪種條件喚醒UART:接收數據字符最高位的地址標記或者接收引腳輸入信號上的空閑情況。0:空閑線喚醒。1:地址標記喚醒。D2-ILT,空閑線類型選擇。ILT決定接收器何時開始計數當作空閑字符的邏輯1。在一個有效的起始位或者停止位之后計數開始。如果起始位之后計數開始,那么停止位前的邏輯1的字符串可能導致空閑字符的錯誤識別。停止位后開始計數避免了錯誤的空閑字符識別,但是需要合適的同步傳輸。。:起始位后開始計數空閑字符位。1:停止位后開始計數空閑字符位。D1-PE,奇偶校驗使能。使能奇偶校驗功能。當奇偶校驗使能時,停止位前會被插入一個奇偶校驗位。7816E被置位(使能)時,此位必須被置位。0:奇偶校驗功能禁止。1:奇偶校驗功能使能。DO-PT,校驗類型。PT決定了UART是否產生并檢查奇校驗位或者偶校驗位。偶校驗位中,偶數個1會清校驗位,奇數個1會置位校驗位。奇校驗位中,奇數個1會清校驗位,偶數個1會置位校驗位。當7816E被置位(使能)時,此位必須清0。0:偶校驗。1:奇校驗。3.波特率高字節寄存器(UARTx_BDH)UARTx_BDH寄存器與UARTx_BDL寄存器一起控制UART波特率發生器的預分頻因子。更新13位波特率設置(SBR[12:0p時,首先寫BDH緩沖新值的高半部分,然后寫BDL。直到BDL被寫入時BDH中的值才會變。數據位D7D6D5D4D3D2D1DO定義LBKDIERXEDGIESBR復位0D7-LBKDIE,LIN中止檢測中斷使能。LBKDIE根據LBKDDMAS的狀態使能LIN中止檢測標識LBKDIF來產生中斷請求。0:LBKDIF中斷請求禁止。1:LBKDIF中斷請求使能。D6-RXEDGIE,RxD輸入有效邊沿中斷使能。RXEDGIE使能接收輸入有效邊沿RXEDGIF來產生中斷請求。0:RXEDGIF硬件中斷禁止(使用輪詢)。1:RXEDGIF中斷請求使能。D4D0-SBR,UART波特率位。UART的波特率由這5位和UARTx_BDL共13位決定。UARTxBDL的復位值為0x04。3.控制寄存器4(UARTx_C4)數據位D7D6D5D4D3D2D1DO定義MAEN1MAEN2M10BRFA復位0D7-MAEN1,地址匹配模式使能1。0:如果MAEN2清0,所有接收到的數據被傳送到數據緩沖區中。1:所有最高有效位被清的接收數據被丟棄。所有最高有效位被置位的接收數據與MA1寄存器中的內容比較。如果沒有匹配成功,則數據被丟棄。如果匹配,那么數據傳送到數據緩沖區。當C7816[IS07816E]被置位(使能)時,此位必須清0。D6-MAEN2,地址匹配模式使能2。0:如果MAEN1清0,則所有接收的數據被傳送到數據緩沖區。1:所有最高有效位清0的接收數據被丟棄。所有最高有效位置位的接收數據,跟MA2寄存器中的內容比較。如果沒有匹配成功,數據被丟棄。如果匹配,數據被傳送到數據緩沖區。當C7816[IS07816E]被置位(使能),此位必須清0。D5-M10,10位模式選擇。M10位使得第10位非存儲器映射位到串行傳輸中。第10位為奇偶校驗位°M10位并不影響LIN發送或者檢測中止。如果M10被置位,C1[M]和C1[PE]必須被置位。當C7816[IS07816E]被置位(使能),此位必須清0。0:奇偶校驗位是串行傳輸中的第9位。1:奇偶校驗位是串行傳輸中的第10位。D4DO—BRFA,波特率微調。這個位用來對平均波特率以1/32的增量增加時間精度。5.狀態寄存器1(UARTx_S1)數據位D7D6D5D4D3D2D1DO定義TDRETCRDRFIDLEORNFFEPF復位11000000UARTx_Sl寄存器為UART中斷或DMA請求提供MCU的輸入。這個寄存器也可以由MCU進行輪詢來檢測。可以通過讀狀態寄存器之后讀或寫(取決于中斷標志類型)UART數據寄存器來清除標志。其他的指令只要不影響I/O處理也可以插入到上述兩步中執行。D7-TDRE,發送數據寄存器空標志。當發送緩沖區(D和C3[T8p中的數據字的數目等于或少于TWFIFO[TXWATER]中的數目時,TDRE會被置位。正在傳輸過程中的字符不包含在此計數中。TDRE置位時讀S1,然后寫UART數據寄存器(D)會清TDRE。為了能夠獲得更有效的中斷服務,除了寫到緩沖區的最終值之外的所有數據應該都寫入D/C3[T8]。然后在寫最終數據前讀S1可以清TRDE標志。0:發送緩沖區中的數據數目比TWFIFO[TXWATER]中的數目大。1:自從標志清0后,發送緩沖區中的數據數目等于或少于TWFIFO[TXWATER]中的數目。D6-TC,發送完成標志。當有效數據傳輸過程在進行或有前導符或中止符被加載時,TC被清0。當發送緩沖區為空并且沒有數據,也沒有前導或者中止符正在傳輸時,TC被置位。當TC為1時,發送數據輸出信號變成空閑狀態(邏輯1)。當7816E被置位(使能)時,此位在任何一個NACK信號接收到了之后但在任何相應的保護期期滿之前被置位。清0TC,需要在TC為1時讀S1,或者將新的發送數據寫入UART數據寄存器(D)或者通過清0C2[TE]位后置位來排隊一個前導或者置位C2的SBK來排隊一個中止符。。:發送進行中(發送數據、前導符或者中止字符)。1:發送空閑中(發送完成)D5-RDRF,接收數據寄存器滿標志。當接收緩沖區中數據字數目等于或多于TWFIFO[TXWATER]中的數目時,RDRF被置位。正在接收中的字符不包含在此計數中。當S2[LBKDE]為1時,RDRF只能為0。另外,當S2[LBKDE]為1時,接收的數據字會被存儲在接收緩沖區中但會彼此覆蓋。RDRF為1時讀S1,然后讀UART數據寄存器(D)會清RDRF。為了獲得更有效的中斷和DMA操作,除了最終從緩沖區讀出的數據之外的所有數據都使用D/C3[T8]/ED。讀S1和最終數據值會清RDRF。。:接收緩沖區中數據字的數目少于RXWATER中的數目。1:此標志被清之后,接收緩沖區中數據字的數目等于或多于RXWATER中的數目。D4-IDLE,空閑線標志。當10個連續的邏輯1(如果C1[M]=0)、11個連續的邏輯1(C1[M]=1、C4[M10]=0)或者12個連續的邏輯1(C1[M]=1、C4[M10]=KC1[PE]=1)出現在接收器輸入時,IDLE為1。IDLE標志清0后,必須接收一個幀(雖然C2[RWU]為I時沒有必要存儲在數據緩沖中)或者一個L1N中止字符必須在一個空閑狀態可以置位IDLE標志之前置位S2[LBKDIF]標志。在IDLE為1時讀UART狀態S1然后讀D可以清IDLE。當7816E被置位(使能)時,空閑檢測不被支持,因此這個標志被忽略。0:自從IDLE標志上一次清0后,接收器輸入現在沒有數據或者從來都沒有數據。1:自從上一次被置位后,接收器輸入變成空閑的或者一直都沒有被清。D3-OR,接收器溢出標志。當軟件沒有成功防止接收數據寄存器數據溢出時,OR為1。OR位會在數據字溢出緩沖區,并收到停止位后被置位。此時,所有其他錯誤標志(FE、NF和PF)都不能被置位。移位寄存器中的數據丟失,但是已經在UART數據寄存器中的數據沒有收到影響。如果OR標志被置位,即使有足夠的空間也不會有數據存儲在數據緩沖區中。OR被置位時讀S1然后讀UART數據寄存器(D)會清OR。在7816模式中,可以通過編程C7816[ONACK]位配置返回的NACK。0:自從上一次標志被清后沒有溢出發生。1:自從上一次溢出發生后,溢出發生或者溢出標志沒被清除。D2-NF,噪聲標志。UART在接收器輸入檢測到噪聲時,NF被置位。在溢出或LIN中止檢測功能使能(S2[LBKDE]=1)時,NF不會被置位。NF被置位表明自從它上次被清后接收到帶有噪聲的數據字。讀S1然后讀UART數據寄存器(D)可以清NF。0:自從上次標志被清后沒有檢測到噪聲。如果接收緩沖區深度大于1,那么收器緩沖區的數據可能帶有噪聲。1:自從上次標志被清后至少有一個接收到的數據字帶有噪聲。Dl-FE,幀錯誤標志。當邏輯0被接收當作停止位時,FE被置位。在溢出或LIN中止檢測功能使能(S2[LBKDE]=1)時,FE不會被置位。FE阻止進一步的數據接收直到它被清0。FE為1時讀S1然后讀UART數據寄存器(D)可以清FE。數據緩沖區中最后一個數據代表了幀錯誤使能的接收數據。然而,當7816E被置位(使能)時,幀錯誤不被支持。0:沒有檢測到幀錯誤。1:幀錯誤。DO-PF,奇偶校驗錯誤標志。當PE被置位、S2[LBKDE]禁用并且接收到的數據不能和它的奇偶校驗位匹配時,PF被置位。在溢出條件下PF不會被置位。PF位被置位僅表示自從它上次被清0后,接收到奇偶校驗錯誤的數據字。讀S1然后讀UART數據寄存器(D),可以清PF。0:自從上次這個標志清0后,沒有檢測到奇偶檢驗錯誤。如果接收緩沖區深度大于1,那么接收緩沖區中有可能有數據帶有奇偶校驗錯誤。1:自從上次這個標志被清0后,至少接收一個帶有奇偶校驗錯誤的數據字。6.數據寄存器(UARTx_D)UARTx_D其實是兩個單獨的寄存器,讀時會返回只讀接收數據寄存器中的內容,寫時會寫到只寫發送&據寄存器。4.5以查詢方式接收的UART模塊測試實例在嵌入式軟件中,mainx和isrx這兩個文件反映了軟件系統的整體執行流程。當系統啟動并初始化后,程序根據mainx中定義的主循環順序執行;一旦遇到中斷請求,立即轉去執行isrx中定義的相應中斷處理程序;當中斷處理程序運行結束后,再返回中斷處繼續順序執行。在mainx和isrx中,可通過調用4.4節介紹的8個功能接U函數實現UART模塊收發數據,實現方式有兩種:查詢方式和中斷方式。查詢方式:UARTO模塊首先向PC發送字符串"HelloWorld!”,然后等待接收PC從串口發送來的數據,若成功接收到1個數據,則立即將該數據回發給PC,隨后繼續等待接收1個數據并回發,如此循環。主函數文件mainx編寫如下。圖4-5為測試串行通信的高端程序運行界面,建議讀者熟練使用串口工具圖4-5串口調試工具軟件界面4.6以中斷方式接收的UART模塊測試實例采用中斷方式收發數據時,需編寫中斷處理程序。在CW10.1環境下使用K60芯片中斷的步驟為在mainx中,依照“關總中斷一開模塊中斷一開總中斷”的順序打開模塊中斷;在isrc文件中,編寫中斷服務程序;在vectors.h文件中,修改中斷向量表。K60開始運行后,系統狀態寄存器SR中16、17和18這三位的默認值都是“1”,即關閉所有中斷,所以要使用中斷,必須更改這三位的值。它就相當于一個總閘,如果總閘不開,CPSIEi 〃關總中斷CPSIDi //開總中斷所有中斷都不可能發生。操作狀態寄存器SR,需要匯編指令來實現。為了方便代碼移植,在common.h中做了如下定義。下面以UART0接收中斷為例,實現以下功能:UART0模塊

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論