串口協議基礎
1 串口概述
串口由收發器組成。發送器是通過TxD引腳發送串行數據,接收器是通過RxD引腳接收串行數據。發送器和接收器都利用了一個移位寄存器,這個移位寄存器可以將數據進行“并轉串”和“串轉并”。雖然一個UART接口通常都包含了發送器和接收器,而實際上一個全雙工串口UART控制器需要獨立的發送和接收通道。這是因為每個控制通道只控制了一個pin(一個通道要么配置成發送器,要么配置成接收器,不能同時配置成接收器和發送器)。沒有嚴格規定哪個通道可以是發送器、哪個通道可以使接收器。
UART協議(串口協議)允許選擇一個校驗位來檢測簡單的通信錯誤(transmission errors)。校驗位可以通過兩種不同的方式進行產生和檢測(generated and checked):奇校驗和偶校驗(odd and even parity)。UART協議功能支持所有的校驗方式。
串口協議對每個字節數據的bit數并不是固定不變的。盡管8-bit的字節是經常用到的,但是一些應用也用到7-bit、9-bit、或者更多bit的字節數據。串口功能可以使用每個字節長達1~23bit長度的字節數據。另外,串口協議還需要1個開始位(1 start bit)(發送一個從“高到低”動作,低電平需要保持1 bit的時間)和1個停止位(1 stop bit)(發送一個從“底到高”動作,高電平需要保持1 bit的時間)來封裝數據。
串口功能是雙緩沖的。不論是發送器還是接收器,它們都包含有一個移位寄存器和一個數據寄存器。Host CPU可以在數據正在發送時,將新數據寫入到發送器的數據寄存器;也可以在數據被接收時,從接收器的數據寄存器讀取數據。
串口發送器通過對通道的“中斷標志位”和數據發送器“需求標志位”置位來指示數據已經從“發送數據寄存器”傳送到“發送移位寄存器”了。發送器的CIS標志位和DTRS被置位時,標志著發送數據寄存器已經準備就緒可以接收新數據了。假如中斷標志位將被用于輪詢環境(polling environment),CIS標志位就必須在新數據被寫入發送器前被清零。同樣的,如果一個DMA通道被用于UART通道服務,那么DTRS標志位就應被DMA通道描述符清零(should be cleared by theDMA channel descriptor)。當數據別寫入到數據發送寄存器時,這24-bit的數據發送寄存器MSB必須寫為0。這個是iTPU串口的一個握手信號,這個握手信號表明了新的發送數據進行串行移位輸出已經寫好。
同樣的,串口接收器通過對CIS和DTRS標志位進行置位,來表明新數據已經到了。當數據從接收移位寄存器傳送到接收數據寄存器后,CIS和DTRS標志位就被置位了。假如中斷標志位將被用于輪詢環境(polling environment),接收器的CIS標志位就必須在新數據被讀取后被清零。如果一個DMA通道被用于UART通道服務,那么DTRS標志位就應被DMA通道描述符清零(should be cleared by theDMA channel descriptor)。為了避免數據丟失或者重復讀取同樣的數據,所以必須在接收后續的數據前完成 檢測新接收到的數據、讀取數據、和清除接收CIS標志位和DRTS標志位。同樣的,在隨后數據接收前,與每個已接收到的數據位相關的“錯誤條件”(error condition)必須被檢測或者保存好,否則errorcondition將會丟失。
串口功能可以進行連續的傳輸(back-to-back transfer)。如果數據及時,發送器不會產生空閑信號(idle line signal),而是在一個stop位后,緊跟著下一幀數據的star位。空閑信號只有在傳送數據已經被串行移位輸出,發送數據寄存器為空時才會產生。發送器的空閑信號時間都是1 bit時間的整數倍。接收器可以處理任何長度的空閑信號。
每個數據都是由1個start位開始的,開始位始終是邏輯0。跟隨在開始位后面的是特定長度的數據,數據是LSB模式發送的;如果校驗位被使能,那么1個校驗位也將產生,并被發送。數據的最后一位由1個stop位標志,結束位始終是邏輯1。一個空閑line就是由連續多個的stop位組成的,這也就意味著空閑信號其實就是信號線一直保持在邏輯1。
例子:一個ASCII字符“A”(8-bit,hex碼為0x41)一直都是以如下的方式進行傳送的。注意:數據是LSB first發送方式。

如圖2更多詳細內容:(注意:時序圖顯示0x41數據串行輸出時序,LSB first。)
文中用到的“bittime”位時間,指的是傳送或接受1bit數據所需要的時間。位時間是由波特率決定的,如下公式:
Bittime = 1/Baud Rate
接收器通過感知start位的下降沿,來檢測數據。因為UART功能總是把服務請求初始化后的第一個下降沿作為有效的起始條件,此時若line是空閑的,就必須使能接收器。接收位只采樣一次,大約半個bit time。在每次start bit時,接收器都將出現同步。
2 基本時序
如圖2展示了TX和RX數據,以及串行數據的時序。任何寫入到tx數據寄存器的數據,必須將msb位置為0(其實就是開始位,startbit)。這表明UART的新數據已經準備好,可以進行移位輸出了。所有接收的數據通過API接收函數fs_etpu_uart_read _receive _data()進行右對齊。傳送的數據總是由1開始位(1 bittime low)和1停止位(1 bit time high)封裝。數據總是LSB FIRST移位輸出。當所有數據被傳送出去后,根據校驗位是否被使能,校驗位也將被選擇性的輸出。數據寬度被限制在23bits以內。這就意味著最大的數據大小、加上校驗位,以及開始位、結束位,一幀數據最長將達到26bits。接收到的數據MSB總是0。

版權聲明:本文為博主原創文章,未經允許不得轉載。 https://blog.csdn.net/kaly_liu/article/details/
串口協議基礎
1 串口概述
串口由收發器組成。發送器是通過TxD引腳發送串行數據,接收器是通過RxD引腳接收串行數據。發送器和接收器都利用了一個移位寄存器,這個移位寄存器可以將數據進行“并轉串”和“串轉并”。雖然一個UART接口通常都包含了發送器和接收器,而實際上一個全雙工串口UART控制器需要獨立的發送和接收通道。這是因為每個控制通道只控制了一個pin(一個通道要么配置成發送器,要么配置成接收器,不能同時配置成接收器和發送器)。沒有嚴格規定哪個通道可以是發送器、哪個通道可以使接收器。
UART協議(串口協議)允許選擇一個校驗位來檢測簡單的通信錯誤(transmission errors)。校驗位可以通過兩種不同的方式進行產生和檢測(generated and checked):奇校驗和偶校驗(odd and even parity)。UART協議功能支持所有的校驗方式。
串口協議對每個字節數據的bit數并不是固定不變的。盡管8-bit的字節是經常用到的,但是一些應用也用到7-bit、9-bit、或者更多bit的字節數據。串口功能可以使用每個字節長達1~23bit長度的字節數據。另外,串口協議還需要1個開始位(1 start bit)(發送一個從“高到低”動作,低電平需要保持1 bit的時間)和1個停止位(1 stop bit)(發送一個從“底到高”動作,高電平需要保持1 bit的時間)來封裝數據。
串口功能是雙緩沖的。不論是發送器還是接收器,它們都包含有一個移位寄存器和一個數據寄存器。Host CPU可以在數據正在發送時,將新數據寫入到發送器的數據寄存器;也可以在數據被接收時,從接收器的數據寄存器讀取數據。
串口發送器通過對通道的“中斷標志位”和數據發送器“需求標志位”置位來指示數據已經從“發送數據寄存器”傳送到“發送移位寄存器”了。發送器的CIS標志位和DTRS被置位時,標志著發送數據寄存器已經準備就緒可以接收新數據了。假如中斷標志位將被用于輪詢環境(polling environment),CIS標志位就必須在新數據被寫入發送器前被清零。同樣的,如果一個DMA通道被用于UART通道服務,那么DTRS標志位就應被DMA通道描述符清零(should be cleared by theDMA channel descriptor)。當數據別寫入到數據發送寄存器時,這24-bit的數據發送寄存器MSB必須寫為0。這個是iTPU串口的一個握手信號,這個握手信號表明了新的發送數據進行串行移位輸出已經寫好。
同樣的,串口接收器通過對CIS和DTRS標志位進行置位,來表明新數據已經到了。當數據從接收移位寄存器傳送到接收數據寄存器后,CIS和DTRS標志位就被置位了。假如中斷標志位將被用于輪詢環境(polling environment),接收器的CIS標志位就必須在新數據被讀取后被清零。如果一個DMA通道被用于UART通道服務,那么DTRS標志位就應被DMA通道描述符清零(should be cleared by theDMA channel descriptor)。為了避免數據丟失或者重復讀取同樣的數據,所以必須在接收后續的數據前完成 檢測新接收到的數據、讀取數據、和清除接收CIS標志位和DRTS標志位。同樣的,在隨后數據接收前,與每個已接收到的數據位相關的“錯誤條件”(error condition)必須被檢測或者保存好,否則errorcondition將會丟失。
串口功能可以進行連續的傳輸(back-to-back transfer)。如果數據及時,發送器不會產生空閑信號(idle line signal),而是在一個stop位后,緊跟著下一幀數據的star位。空閑信號只有在傳送數據已經被串行移位輸出,發送數據寄存器為空時才會產生。發送器的空閑信號時間都是1 bit時間的整數倍。接收器可以處理任何長度的空閑信號。
每個數據都是由1個start位開始的,開始位始終是邏輯0。跟隨在開始位后面的是特定長度的數據,數據是LSB模式發送的;如果校驗位被使能,那么1個校驗位也將產生,并被發送。數據的最后一位由1個stop位標志,結束位始終是邏輯1。一個空閑line就是由連續多個的stop位組成的,這也就意味著空閑信號其實就是信號線一直保持在邏輯1。
例子:一個ASCII字符“A”(8-bit,hex碼為0x41)一直都是以如下的方式進行傳送的。注意:數據是LSB first發送方式。

如圖2更多詳細內容:(注意:時序圖顯示0x41數據串行輸出時序,LSB first。)
文中用到的“bittime”位時間,指的是傳送或接受1bit數據所需要的時間。位時間是由波特率決定的,如下公式:
Bittime = 1/Baud Rate
接收器通過感知start位的下降沿,來檢測數據。因為UART功能總是把服務請求初始化后的第一個下降沿作為有效的起始條件,此時若line是空閑的,就必須使能接收器。接收位只采樣一次,大約半個bit time。在每次start bit時,接收器都將出現同步。
2 基本時序
如圖2展示了TX和RX數據,以及串行數據的時序。任何寫入到tx數據寄存器的數據,必須將msb位置為0(其實就是開始位,startbit)。這表明UART的新數據已經準備好,可以進行移位輸出了。所有接收的數據通過API接收函數fs_etpu_uart_read _receive _data()進行右對齊。傳送的數據總是由1開始位(1 bittime low)和1停止位(1 bit time high)封裝。數據總是LSB FIRST移位輸出。當所有數據被傳送出去后,根據校驗位是否被使能,校驗位也將被選擇性的輸出。數據寬度被限制在23bits以內。這就意味著最大的數據大小、加上校驗位,以及開始位、結束位,一幀數據最長將達到26bits。接收到的數據MSB總是0。

版權聲明:本文為博主原創文章,未經允許不得轉載。 https://blog.csdn.net/kaly_liu/article/details/串行通訊波特率和定時器的關系 波特率代表數據的傳輸速率,即每秒鐘傳送的二進制位數,單位為位/秒。若波特率為1200,則代表每秒鐘有1200個二進制位在數據線上傳輸,換句話說,即每個二進制位信號電平在數據線上保持的時間為1/11200s