您好,歡迎進入深圳市穎特新科技有限公司官方網站!
串口協(xié)議基礎
串口由收發(fā)器組成。發(fā)送器是通過TxD引腳發(fā)送串行數(shù)據(jù),接收器是通過RxD引腳接收串行數(shù)據(jù)。發(fā)送器和接收器都利用了一個移位寄存器,這個移位寄存器可以將數(shù)據(jù)進行“并轉串”和“串轉并”。雖然一個UART接口通常都包含了發(fā)送器和接收器,而實際上一個全雙工串口UART控制器需要獨立的發(fā)送和接收通道。這是因為每個控制通道只控制了一個pin(一個通道要么配置成發(fā)送器,要么配置成接收器,不能同時配置成接收器和發(fā)送器)。沒有嚴格規(guī)定哪個通道可以是發(fā)送器、哪個通道可以使接收器。
UART協(xié)議(串口協(xié)議)允許選擇一個校驗位來檢測簡單的通信錯誤(transmission errors)。校驗位可以通過兩種不同的方式進行產生和檢測(generated and checked):奇校驗和偶校驗(odd and even parity)。UART協(xié)議功能支持所有的校驗方式。
串口協(xié)議對每個字節(jié)數(shù)據(jù)的bit數(shù)并不是固定不變的。盡管8-bit的字節(jié)是經常用到的,但是一些應用也用到7-bit、9-bit、或者更多bit的字節(jié)數(shù)據(jù)。串口功能可以使用每個字節(jié)長達1~23bit長度的字節(jié)數(shù)據(jù)。另外,串口協(xié)議還需要1個開始位(1 start bit)(發(fā)送一個從“高到低”動作,低電平需要保持1 bit的時間)和1個停止位(1 stop bit)(發(fā)送一個從“底到高”動作,高電平需要保持1 bit的時間)來封裝數(shù)據(jù)。
串口功能是雙緩沖的。不論是發(fā)送器還是接收器,它們都包含有一個移位寄存器和一個數(shù)據(jù)寄存器。Host CPU可以在數(shù)據(jù)正在發(fā)送時,將新數(shù)據(jù)寫入到發(fā)送器的數(shù)據(jù)寄存器;也可以在數(shù)據(jù)被接收時,從接收器的數(shù)據(jù)寄存器讀取數(shù)據(jù)。
串口發(fā)送器通過對通道的“中斷標志位”和數(shù)據(jù)發(fā)送器“需求標志位”置位來指示數(shù)據(jù)已經從“發(fā)送數(shù)據(jù)寄存器”傳送到“發(fā)送移位寄存器”了。發(fā)送器的CIS標志位和DTRS被置位時,標志著發(fā)送數(shù)據(jù)寄存器已經準備就緒可以接收新數(shù)據(jù)了。假如中斷標志位將被用于輪詢環(huán)境(polling environment),CIS標志位就必須在新數(shù)據(jù)被寫入發(fā)送器前被清零。同樣的,如果一個DMA通道被用于UART通道服務,那么DTRS標志位就應被DMA通道描述符清零(should be cleared by theDMA channel descriptor)。當數(shù)據(jù)別寫入到數(shù)據(jù)發(fā)送寄存器時,這24-bit的數(shù)據(jù)發(fā)送寄存器MSB必須寫為0。這個是iTPU串口的一個握手信號,這個握手信號表明了新的發(fā)送數(shù)據(jù)進行串行移位輸出已經寫好。
同樣的,串口接收器通過對CIS和DTRS標志位進行置位,來表明新數(shù)據(jù)已經到了。當數(shù)據(jù)從接收移位寄存器傳送到接收數(shù)據(jù)寄存器后,CIS和DTRS標志位就被置位了。假如中斷標志位將被用于輪詢環(huán)境(polling environment),接收器的CIS標志位就必須在新數(shù)據(jù)被讀取后被清零。如果一個DMA通道被用于UART通道服務,那么DTRS標志位就應被DMA通道描述符清零(should be cleared by theDMA channel descriptor)。為了避免數(shù)據(jù)丟失或者重復讀取同樣的數(shù)據(jù),所以必須在接收后續(xù)的數(shù)據(jù)前完成 檢測新接收到的數(shù)據(jù)、讀取數(shù)據(jù)、和清除接收CIS標志位和DRTS標志位。同樣的,在隨后數(shù)據(jù)接收前,與每個已接收到的數(shù)據(jù)位相關的“錯誤條件”(error condition)必須被檢測或者保存好,否則errorcondition將會丟失。
串口功能可以進行連續(xù)的傳輸(back-to-back transfer)。如果數(shù)據(jù)及時,發(fā)送器不會產生空閑信號(idle line signal),而是在一個stop位后,緊跟著下一幀數(shù)據(jù)的star位?臻e信號只有在傳送數(shù)據(jù)已經被串行移位輸出,發(fā)送數(shù)據(jù)寄存器為空時才會產生。發(fā)送器的空閑信號時間都是1 bit時間的整數(shù)倍。接收器可以處理任何長度的空閑信號。
每個數(shù)據(jù)都是由1個start位開始的,開始位始終是邏輯0。跟隨在開始位后面的是特定長度的數(shù)據(jù),數(shù)據(jù)是LSB模式發(fā)送的;如果校驗位被使能,那么1個校驗位也將產生,并被發(fā)送。數(shù)據(jù)的最后一位由1個stop位標志,結束位始終是邏輯1。一個空閑line就是由連續(xù)多個的stop位組成的,這也就意味著空閑信號其實就是信號線一直保持在邏輯1。
例子:一個ASCII字符“A”(8-bit,hex碼為0x41)一直都是以如下的方式進行傳送的。注意:數(shù)據(jù)是LSB first發(fā)送方式。
如圖2更多詳細內容:(注意:時序圖顯示0x41數(shù)據(jù)串行輸出時序,LSB first。)
文中用到的“bittime”位時間,指的是傳送或接受1bit數(shù)據(jù)所需要的時間。位時間是由波特率決定的,如下公式:
Bittime = 1/Baud Rate
接收器通過感知start位的下降沿,來檢測數(shù)據(jù)。因為UART功能總是把服務請求初始化后的第一個下降沿作為有效的起始條件,此時若line是空閑的,就必須使能接收器。接收位只采樣一次,大約半個bit time。在每次start bit時,接收器都將出現(xiàn)同步。
如圖2展示了TX和RX數(shù)據(jù),以及串行數(shù)據(jù)的時序。任何寫入到tx數(shù)據(jù)寄存器的數(shù)據(jù),必須將msb位置為0(其實就是開始位,startbit)。這表明UART的新數(shù)據(jù)已經準備好,可以進行移位輸出了。所有接收的數(shù)據(jù)通過API接收函數(shù)fs_etpu_uart_read _receive _data()進行右對齊。傳送的數(shù)據(jù)總是由1開始位(1 bittime low)和1停止位(1 bit time high)封裝。數(shù)據(jù)總是LSB FIRST移位輸出。當所有數(shù)據(jù)被傳送出去后,根據(jù)校驗位是否被使能,校驗位也將被選擇性的輸出。數(shù)據(jù)寬度被限制在23bits以內。這就意味著最大的數(shù)據(jù)大小、加上校驗位,以及開始位、結束位,一幀數(shù)據(jù)最長將達到26bits。接收到的數(shù)據(jù)MSB總是0。