第四講 串口通信之接收_第1頁
第四講 串口通信之接收_第2頁
第四講 串口通信之接收_第3頁
第四講 串口通信之接收_第4頁
第四講 串口通信之接收_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、上一講我們講解了串口的發(fā)送操作。這一講我們繼續(xù)講解串口的接收。在學(xué)習這個串口接收的過程中,我們要鞏固這個狀態(tài)機的寫法,也再熟悉熟悉前幾講講解的內(nèi)容。首先回顧一下異步串口通信的數(shù)據(jù)格式:由于在空閑狀態(tài)時,傳送線為邏輯“1”狀態(tài),而數(shù)據(jù)的傳送總是以一個起始位“0”開始,所以當接收器檢測到一個從“1”向“0”的跳變時,便視為可能的起始位(要排除干擾引起的跳變);起始位被確認后,就知道發(fā)送器已開始發(fā)送,接收器就可以按這個數(shù)據(jù)通信格式接收后續(xù)的數(shù)據(jù)了;當檢測到停止位“1”后就表明一幀字符數(shù)據(jù)已發(fā)送完畢。關(guān)于接收器的設(shè)計最主要的一點是如何提高采樣的準確率,最好是保證采樣點處于被采樣數(shù)據(jù)的時間中間點。所以,

2、在接收采樣時要用比數(shù)據(jù)波特率高n倍(n1)速率的時鐘對數(shù)據(jù)進行采樣。在本程序中用16倍波特率時鐘進行采樣。結(jié)合圖示,我們講解一下如何讓采樣時刻處于被采樣數(shù)據(jù)的時間中間點:1. 在t1時刻若檢測到低電平,就開始對這個低電平進行連續(xù)的檢測2. 當檢測了8個時鐘周期后,到達t2,此刻,若前面的8個周期都是低電平,則認為檢測到了起始脈沖。否則就認為是干擾,重新檢測。3. 在檢測到起始位后,再計數(shù)16個采樣時鐘周期就到達了第一個數(shù)據(jù)位的時間中間點t3,在此刻采樣數(shù)據(jù)并進行保存。4. 然后再經(jīng)過16個周期,就是第二個數(shù)據(jù)位的時間中間點,在此時刻進行采樣;然后,再經(jīng)過16個周期,就是第三個數(shù)據(jù)位的時間中間點

3、, 在此時刻進行采樣.一直這樣采樣,直到把所有的數(shù)據(jù)位采樣完畢。在理解完上面這個流程后,我們來按這個編制一下程序。 逐行解釋:11:bclk為波特率的16倍。這個同uart_t。12:一幀數(shù)據(jù)接收完畢信號,可以通知頂層模塊來提取數(shù)據(jù)。該信號在復(fù)位后為“0”,在接收完一幀數(shù)據(jù)后變高,然后直到下一次檢測到起始位后,即下一幀數(shù)據(jù)到來時才復(fù)位到“0”。頂層模塊可通過檢測該信號的上升沿來判斷一幀數(shù)據(jù)是否已經(jīng)接收完畢。19:用type聲明一種枚舉類型,用來表示接收狀態(tài)機的狀態(tài)。共有五狀態(tài):r_idle-空閑狀態(tài),r_sample_start_bit-采樣起始位狀態(tài),r_sample_data_bit-采樣

4、數(shù)據(jù)位狀態(tài),r_stop-采樣停止位狀態(tài)。24-31:通過一個D觸發(fā)器,先把串口的輸入信號整形一下,這樣可減少干擾引起的檢測誤判。D觸發(fā)器的原理的工作機制大家應(yīng)該明白吧,這里就不再贅述了。33-35:定義一些變量。count為時鐘bclk的計數(shù)器,因為采用了16倍頻的時鐘,所以一個數(shù)據(jù)位會維持16個bclk時鐘周期,需要用count來計數(shù)。rcnt是對接收到的數(shù)據(jù)位進行計數(shù)。這個和串口的發(fā)送程序有點類似的。32-95:通過狀態(tài)機來接收一幀數(shù)據(jù)。 37-41:系統(tǒng)復(fù)位。 38:復(fù)位后狀態(tài)機設(shè)置為空閑狀態(tài)。 39-40:清零計數(shù)器。41:置r_ready為0,表示數(shù)據(jù)還沒接收完畢。 42-93:系

5、統(tǒng)正常工作,通過狀態(tài)機的變化實現(xiàn)一幀數(shù)據(jù)的接收,用case語句實現(xiàn)狀態(tài)轉(zhuǎn)變。 44-53:描述空閑狀態(tài)時的執(zhí)行動作。 45-49:若傳送線上檢測到低電平則立即轉(zhuǎn)入r_sample_start_bit狀態(tài),并清零計數(shù)器。反之,若沒有檢測到低電平,則還是使系統(tǒng)處于r_idle狀態(tài),還需要不斷的去檢測傳送線的狀態(tài)。 55-68:描述采樣到起始位后執(zhí)行的動作。 56-68:假設(shè)在44-53句中檢測到的低電平是起始位,則這個低電平應(yīng)該持續(xù) 16個時鐘(因為是16倍頻采樣的)。在這16個時鐘周期內(nèi),若是干擾,則可能會在這16個時鐘的時間內(nèi)檢測到高電平。若有,那么狀態(tài)機就回到x_idle狀態(tài),否則就認為已經(jīng)

6、檢測到了起始位。 57-64:在檢測到起始位后的8個時鐘里總線若一直是低電平,則認為是檢測到了起始位,狀態(tài)機切換至r_sample_data_bit,并初始化一些計數(shù)器, 準備開始采樣數(shù)據(jù)位。 70-85:描述采樣數(shù)據(jù)位時執(zhí)行的動作。 71-73:連續(xù)計數(shù)16個bclk時鐘 74-85:當計數(shù)到16個bclk后,就開始采樣傳送線的電平狀態(tài)。 75-78:在檢測傳送線數(shù)據(jù)前首先判斷是否已經(jīng)接收完數(shù)據(jù)位,若是就使狀態(tài)機轉(zhuǎn)入r_stop 狀態(tài),并清零計數(shù)器。79-83:若數(shù)據(jù)位還沒有接收完畢,則80句,保持狀態(tài)機處于 r_sample_data_bit狀態(tài),并清零count。82句,把當前傳送線的電

7、平狀態(tài)送入到接收緩沖器rbufs,并通過83句將接收到的數(shù)據(jù)位計數(shù)器加1。86-89:描述采樣停止位時執(zhí)行的動作。在本程序中,我們省略了對停止位的采樣,這樣做對功能本身不會產(chǎn)生影響。 87:置r_ready為1,通知外部數(shù)據(jù)接收完畢 88:更新數(shù)據(jù)輸出緩沖器 89:使狀態(tài)機重新會到x_idle狀態(tài),開始下一輪的接收檢測。 90-91:描述狀態(tài)機處于其它狀態(tài)時的動作(假如狀態(tài)機跑飛)。在其它狀態(tài)時,將狀態(tài)機置為x_idle,使狀態(tài)機正常工作。以上只是編寫了一個串口接收的元件,現(xiàn)在編寫一個頂層調(diào)用模塊,調(diào)用這個接收元件來接收PC機上通過“串口調(diào)試助手”發(fā)送的數(shù)據(jù),并根據(jù)接收到的數(shù)據(jù)點亮不同的LED。代碼如下: 程序代碼比較簡單,就不再贅述了,大家可以自己去體會。若有什么不明白的,請聯(lián)系我們(qq:1438801646)。還是按串口發(fā)送中所說的那樣連接好串口線,選中串口調(diào)試助手的“按十六進制發(fā)送”。(否則在發(fā)送框里填入的是ASCII碼,無法與程序中的case條件匹配上)

溫馨提示

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

評論

0/150

提交評論