專利名稱:一種通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)uart通信接口的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種軟件模擬實(shí)現(xiàn)UART通信的方法,特別是涉及一種嵌入式系統(tǒng)中通過(guò)軟件模擬實(shí)現(xiàn)UART通信接口數(shù)據(jù)的發(fā)送和接收的處理方法。
背景技術(shù):
隨著嵌入式技術(shù)發(fā)展和嵌入式設(shè)備的多樣化,由嵌入式設(shè)備構(gòu)成的多機(jī)系統(tǒng)取得了長(zhǎng)足的發(fā)展,多個(gè)嵌入式設(shè)備之間以串行口 UART (Universal Asynchronous Receiver/ Transmitter,通用異步接收和發(fā)送器)進(jìn)行數(shù)據(jù)傳輸,構(gòu)成復(fù)雜的主從式通訊網(wǎng)。在實(shí)際應(yīng)用中,經(jīng)常遇到一個(gè)主機(jī)設(shè)備需要同時(shí)連接各種不同的從機(jī)設(shè)備,而主機(jī)設(shè)備與從機(jī)設(shè)備之間的通信方式經(jīng)常采用UART通信接口,UART通信接口只能一對(duì)一通信,不能多個(gè)通信接口并接在一起通信,以往的實(shí)現(xiàn)方式1.在設(shè)計(jì)開(kāi)發(fā)主機(jī)設(shè)備時(shí)選擇具有多路UART通信接口的微處理器,而實(shí)際上具有多路UART通信接口的微處理器的型號(hào)比較少,帶來(lái)器件選型上的限制,而且比較昂貴,增加產(chǎn)品成本;2.采用串口擴(kuò)展芯片實(shí)現(xiàn),如ST16C550、ST16C554、SP2538、MAX3110等,雖然成本較高,但系統(tǒng)的可靠性得到了保證,適用于數(shù)據(jù)量較大、串口需求較多的系統(tǒng);3.采用分時(shí)切換的方法將一個(gè)串口擴(kuò)展與多個(gè)串口設(shè)備通信,分時(shí)復(fù)用的方法成本低,但只適用于數(shù)據(jù)量不大的場(chǎng)合,并且只能由這個(gè)單片機(jī)主動(dòng)和多個(gè)設(shè)備通信,實(shí)時(shí)性差;4.用軟件模擬的方法擴(kuò)展串口,其優(yōu)勢(shì)是成本低、實(shí)時(shí)性好,但需要占用一些CPU時(shí)間。例如申請(qǐng)?zhí)枮?00710172965. 9的發(fā)明提供了基于無(wú)線通信模塊的軟件模擬UART 的方法,該方法包括中斷處理方法、位于中斷處理方法流程末端的數(shù)據(jù)發(fā)送方法和數(shù)據(jù)接收方法,該發(fā)明使用2個(gè)普通的I/O和一個(gè)定時(shí)器來(lái)實(shí)現(xiàn),且?guī)IFO功能,擴(kuò)展模擬UART的收發(fā)數(shù)據(jù)在中斷服務(wù)中完成。但其實(shí)現(xiàn)方法存在多個(gè)缺點(diǎn),1.判斷數(shù)據(jù)起始位的方法是采用中斷定時(shí)采樣監(jiān)測(cè)方式,中斷定時(shí)間隔為波特率定時(shí)間隔的1/3,以3倍的波特率對(duì)接收數(shù)據(jù)進(jìn)行采樣監(jiān)測(cè),這樣導(dǎo)致定時(shí)器中斷過(guò)于頻繁,而且在無(wú)數(shù)據(jù)收發(fā)的情況下也需要定時(shí)采樣監(jiān)測(cè)通信總線是否有數(shù)據(jù),耗費(fèi)系統(tǒng)資源;2.每次采樣的位數(shù)據(jù)都是采集位的末尾位置,數(shù)據(jù)接收的容錯(cuò)性差,準(zhǔn)確率低,因?yàn)樵诙〞r(shí)器精度較低或?qū)Ψ桨l(fā)送的位數(shù)據(jù)寬度誤差較大的情況下,會(huì)出現(xiàn)采集錯(cuò)位導(dǎo)致接收數(shù)據(jù)出錯(cuò);3.按照該方案描述,在發(fā)送數(shù)據(jù)時(shí), 將定時(shí)進(jìn)行3分頻,中斷定時(shí)間隔等于波特率間隔,這樣每一次定時(shí)中斷就發(fā)送一位,從而可以看出,在發(fā)送數(shù)據(jù)過(guò)程中無(wú)法以3倍的波特率定時(shí)頻率對(duì)接收數(shù)據(jù)進(jìn)行采樣監(jiān)測(cè),無(wú)法實(shí)現(xiàn)數(shù)據(jù)接收,因此,無(wú)法達(dá)到全雙工數(shù)據(jù)收發(fā)通信模式;4.當(dāng)模擬多個(gè)UART通信接口且各通信接口波特率不同時(shí),每一個(gè)通信接口都需要有一個(gè)定時(shí)器,無(wú)法實(shí)現(xiàn)多個(gè)UART通信接口共享一個(gè)定時(shí)器,因此可模擬的UART通信接口個(gè)數(shù)受限于微處理器的定時(shí)器個(gè)數(shù), 而通常情況下微處理器的定時(shí)器個(gè)數(shù)都是比較少的;5.當(dāng)一個(gè)字節(jié)的數(shù)據(jù)接收完畢后在定時(shí)器中斷服務(wù)程序中將接收數(shù)據(jù)存儲(chǔ)到接收FIFO隊(duì)列,這樣將導(dǎo)致定時(shí)器中斷服務(wù)程序執(zhí)行時(shí)間過(guò)長(zhǎng),降低系統(tǒng)的準(zhǔn)確度,降低最高可支持的通信波特率。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題是,提供一種通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,在同等系統(tǒng)主頻和硬件資源條件下提高通信波特率、提升通信準(zhǔn)確率,實(shí)現(xiàn)真正全雙工通信,并可擴(kuò)展多個(gè)UART通信接口,滿足各種不同通信波特率的要求,解決UART通信接口不足問(wèn)題,降低產(chǎn)品成本,提高產(chǎn)品競(jìng)爭(zhēng)力。為解決上述技術(shù)問(wèn)題,本發(fā)明的思路是在硬件方面,使用1個(gè)定時(shí)器和2個(gè)I/O 端口,利用定時(shí)器的定時(shí)中斷功能實(shí)現(xiàn)精確的波特率定時(shí),發(fā)送和接收都在定時(shí)中斷的控制之下進(jìn)行。數(shù)據(jù)發(fā)送的思想是當(dāng)啟動(dòng)字節(jié)發(fā)送時(shí),通過(guò)發(fā)送管腳T)(D先發(fā)起始位,然后發(fā)數(shù)據(jù)位和奇偶效驗(yàn)位,最后再發(fā)停止位,發(fā)送過(guò)程由發(fā)送狀態(tài)機(jī)控制,每次中斷根據(jù)計(jì)算延時(shí)計(jì)數(shù)器到期只發(fā)送1個(gè)位,經(jīng)過(guò)若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)數(shù)據(jù)的發(fā)送。數(shù)據(jù)接收的思想是,當(dāng)不在字節(jié)數(shù)據(jù)接收過(guò)程時(shí),將接收管腳RXD配置成I/O低電平中斷方式,監(jiān)測(cè)起始位,當(dāng)檢測(cè)到起始位,則開(kāi)始啟動(dòng)一次字節(jié)數(shù)據(jù)接收,字節(jié)數(shù)據(jù)接收過(guò)程由接收狀態(tài)機(jī)控制,每次中斷根據(jù)計(jì)算延時(shí)計(jì)數(shù)器到期接收1個(gè)位,經(jīng)過(guò)若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)數(shù)據(jù)的接收。為了提高串口的性能,在發(fā)送和接收上都實(shí)現(xiàn)了 FIFO功能,提高通信的實(shí)時(shí)性。具體的,本發(fā)明所采用的技術(shù)方案是一種通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,包括數(shù)據(jù)接收方法和數(shù)據(jù)發(fā)送方法,其中數(shù)據(jù)接收方法包括以下步驟
配置芯片一 I/O管腳為接收管腳RXD的步驟將接收管腳RXD配置為低電平中斷模式并打開(kāi)I/O中斷使能;
實(shí)時(shí)監(jiān)測(cè)接收管腳R)(D接收數(shù)據(jù)的步驟當(dāng)接收到數(shù)據(jù)時(shí),首先檢測(cè)該數(shù)據(jù)的起始位, 如果起始位為高電平則繼續(xù)實(shí)時(shí)監(jiān)測(cè),如果起始位為低電平,則觸發(fā)接收管腳RXD發(fā)生I/O 低電平中斷;
I/O低電平中斷處理步驟配置接收管腳RXD為通用I/O輸入模式并關(guān)閉I/O中斷使能,啟動(dòng)定時(shí)器,啟動(dòng)字節(jié)數(shù)據(jù)接收,其中所述定時(shí)器的定時(shí)時(shí)間間隔設(shè)置為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)的1/n (η ^ 2),即定時(shí)器中斷頻率為多個(gè)UART通信接口中最高波特率的η (η > 2)倍,定時(shí)器的定時(shí)時(shí)間到時(shí)觸發(fā)定時(shí)器中斷;優(yōu)選的,其中η的取值為 2 ;
定時(shí)器中斷處理步驟根據(jù)定時(shí)器定時(shí)中斷接收數(shù)據(jù),每次中斷根據(jù)計(jì)算延時(shí)計(jì)數(shù)器到期接收一個(gè)位,經(jīng)過(guò)若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)數(shù)據(jù)的接收,并判斷接收到的字節(jié)的有效性,如果接收到的字節(jié)無(wú)效則返回“配置芯片一 I/O管腳為接收管腳RXD的步驟”,如果接收到的字節(jié)有效則觸發(fā)軟件中斷,返回“配置芯片一 I/O管腳為接收管腳R)(D的步驟”,退出定時(shí)器中斷后進(jìn)入軟件中斷,在軟件中斷中存儲(chǔ)接收的字節(jié)數(shù)據(jù);
軟件中斷處理步驟將接收到的有效字節(jié)數(shù)據(jù)存儲(chǔ)到接收FIFO緩存隊(duì)列中; 數(shù)據(jù)發(fā)送方法包括以下步驟
配置芯片另一 I/O管腳為發(fā)送管腳T)(D的步驟將發(fā)送管腳T)(D配置為通用I/O輸出模式;
準(zhǔn)備發(fā)送數(shù)據(jù)的步驟將待發(fā)送的數(shù)據(jù)存儲(chǔ)到發(fā)送FIFO緩存隊(duì)列中,觸發(fā)軟件中斷; 軟件中斷處理步驟獲取發(fā)送FIFO緩存隊(duì)列中字節(jié)數(shù)據(jù),啟動(dòng)字節(jié)數(shù)據(jù)發(fā)送,并按照定時(shí)器的定時(shí)時(shí)間來(lái)觸發(fā)定時(shí)器中斷;
定時(shí)器中斷處理步驟根據(jù)定時(shí)器定時(shí)中斷發(fā)送數(shù)據(jù),每次中斷根據(jù)計(jì)算延時(shí)計(jì)數(shù)器到期發(fā)送一個(gè)位,經(jīng)過(guò)若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)數(shù)據(jù)的發(fā)送;如果字節(jié)數(shù)據(jù)發(fā)送完畢, 觸發(fā)軟件中斷,進(jìn)入軟件中斷處理步驟。進(jìn)一步的,所述I/O低電平中斷處理步驟,包括
配置芯片接收管腳R )的步驟,將接收管腳RXD配置為通用I/O輸入模式并關(guān)閉I/O 中斷使能;
計(jì)算并設(shè)置定時(shí)器參數(shù)的步驟所述定時(shí)器的定時(shí)時(shí)間間隔設(shè)置為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)的1/ n(n > 2),即定時(shí)器中斷頻率為多個(gè)UART通信接口中最高波特率的η (η ^ 2)倍,通過(guò)定時(shí)器中斷頻率/UART通信接口的波特率計(jì)算獲得一個(gè)位需要定時(shí)中斷的次數(shù);優(yōu)選的,其中η的取值為2 ;
啟動(dòng)起始位接收的步驟設(shè)置接收位數(shù)等于起始位數(shù),啟動(dòng)起始位接收; 啟動(dòng)定時(shí)器的步驟啟動(dòng)定時(shí)器開(kāi)始計(jì)時(shí)。進(jìn)一步的,所述I/O低電平中斷處理步驟還包括數(shù)據(jù)采樣步驟,所述數(shù)據(jù)采樣步驟延時(shí)半個(gè)位時(shí)間后在定時(shí)中斷處理步驟中再次采集起始位是否為低電平,具體來(lái)說(shuō),設(shè)置延時(shí)計(jì)數(shù)器為一個(gè)位需要定時(shí)中斷的次數(shù)的1/2,即可實(shí)現(xiàn)延時(shí)半個(gè)位時(shí)間后采集起始位。進(jìn)一步的,所述定時(shí)器中斷處理步驟,包括判斷處于接收狀態(tài)還是發(fā)送狀態(tài),根據(jù)判斷結(jié)果選擇進(jìn)入數(shù)據(jù)接收流程或數(shù)據(jù)發(fā)送流程,并判斷數(shù)據(jù)收發(fā)是否結(jié)束,如果在設(shè)定的一段時(shí)間內(nèi)沒(méi)有數(shù)據(jù)收發(fā),則停止定時(shí)器;所述I/O低電平中斷處理步驟中的啟動(dòng)定時(shí)器的步驟還包括以下過(guò)程判斷定時(shí)器是否已啟動(dòng),如果未啟動(dòng)則啟動(dòng)定時(shí)器。進(jìn)一步的,在設(shè)定的一段時(shí)間內(nèi)沒(méi)有數(shù)據(jù)收發(fā)則停止定時(shí)器,所述設(shè)定的一段時(shí)間是根據(jù)通信數(shù)據(jù)量和頻繁度來(lái)設(shè)定,本發(fā)明中設(shè)為10個(gè)定時(shí)器中斷時(shí)間。進(jìn)一步的,所述軟件中斷處理步驟,包括判斷處于接收狀態(tài)還是發(fā)送狀態(tài),根據(jù)判斷結(jié)果選擇進(jìn)入數(shù)據(jù)接收的軟件中斷處理和數(shù)據(jù)發(fā)送的軟件中斷處理,其中
所述數(shù)據(jù)接收的軟件中斷處理是將接收到的有效字節(jié)數(shù)據(jù)存儲(chǔ)到接收FIFO緩存隊(duì)列
中;
所述數(shù)據(jù)發(fā)送的軟件中斷處理是判斷FIFO緩存隊(duì)列中是否仍有數(shù)據(jù)待發(fā)送,如果沒(méi)有,則直接中斷返回,如果有,則獲取發(fā)送FIFO緩存隊(duì)列中字節(jié)數(shù)據(jù);設(shè)置定時(shí)器的參數(shù)所述定時(shí)器的定時(shí)時(shí)間間隔設(shè)置為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)的1/ η (n ^ 2),即定時(shí)器中斷頻率為多個(gè)UART通信接口中最高波特率的η (η彡2)倍,通過(guò)定時(shí)器中斷頻率/UART通信接口的波特率計(jì)算獲得一個(gè)位需要定時(shí)中斷的次數(shù);啟動(dòng)字節(jié)數(shù)據(jù)發(fā)送;中斷退出。優(yōu)選的,其中η的取值為2。本發(fā)明采用上述方法,與現(xiàn)有技術(shù)相比,具有以下優(yōu)點(diǎn)
1.本發(fā)明的所述定時(shí)器的定時(shí)時(shí)間間隔設(shè)置為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)的1/η,即定時(shí)器中斷頻率為多個(gè)UART通信接口中最高波特率的η倍,而計(jì)算一個(gè)位需要定時(shí)中斷的次數(shù)=定時(shí)器中斷頻率/UART通信接口的波特率,這樣,對(duì)于各種不同通信波特率的多個(gè)UART通信接口,計(jì)算得到的各個(gè)UART通信接口的一個(gè)位需要定時(shí)中斷的次數(shù),保證了模擬多個(gè)UART通信接口可以共享一個(gè)定時(shí)器,降低了定時(shí)器中斷頻率,降低了系統(tǒng)資源損耗;同時(shí),使用本發(fā)明模擬一個(gè)UART通信接口時(shí)僅需要1個(gè)定時(shí)器、2個(gè)I/O端口,1個(gè)軟件中斷,當(dāng)模擬多個(gè)UART通信接口時(shí),可以共用一個(gè)定時(shí)器和一個(gè)軟件中斷,每增加一個(gè)UART通信接口只需要增加2個(gè)I/O端口即可,降低了產(chǎn)品成本,提高了產(chǎn)品競(jìng)爭(zhēng)力;
2.本發(fā)明的所述I/O低電平中斷處理步驟還包括數(shù)據(jù)采樣步驟,所述數(shù)據(jù)采樣步驟是設(shè)置延時(shí)計(jì)數(shù)器為一個(gè)位需要定時(shí)中斷的次數(shù)的1/2,即延時(shí)半個(gè)位時(shí)間后在定時(shí)中斷處理步驟中再次采集起始位是否為低電平,嚴(yán)格判斷起始位的正確性,提高接收數(shù)據(jù)的檢錯(cuò)能力;
3.本發(fā)明的所述定時(shí)器中斷處理步驟還包括數(shù)據(jù)采樣步驟,所述數(shù)據(jù)采樣步驟是設(shè)置延時(shí)計(jì)數(shù)器為一個(gè)位需要定時(shí)中斷的次數(shù),即在起始位采樣后每延時(shí)一個(gè)位時(shí)間采集一個(gè)位數(shù)據(jù),從而使每次采樣的位數(shù)據(jù)都是采集位的中間位置,避免因定時(shí)器精度誤差造成的采樣位出錯(cuò),提高數(shù)據(jù)接收的容錯(cuò)性和準(zhǔn)確率;
4.本發(fā)明的接收/發(fā)送數(shù)據(jù)過(guò)程根據(jù)定時(shí)器定時(shí)中斷接收/發(fā)送數(shù)據(jù),每次中斷根據(jù)計(jì)算延時(shí)計(jì)數(shù)器到期接收/發(fā)送一個(gè)位,經(jīng)過(guò)若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)數(shù)據(jù)的接收/ 發(fā)送,從而可以實(shí)現(xiàn)真正的全雙工通信;
5.本發(fā)明在一段時(shí)間內(nèi)檢測(cè)到?jīng)]有數(shù)據(jù)收發(fā),則停止定時(shí)器,從而降低在無(wú)數(shù)據(jù)通信情況下的系統(tǒng)資源損耗;
6.本發(fā)明在數(shù)據(jù)接收的過(guò)程中,當(dāng)一個(gè)字節(jié)的數(shù)據(jù)接收完畢后不在定時(shí)器中斷處理中對(duì)FIFO緩存隊(duì)列進(jìn)行操作,從而提高定時(shí)器精度,保障了系統(tǒng)通信的準(zhǔn)確度。
圖1是本發(fā)明的數(shù)據(jù)接收方法的流程。圖2是本發(fā)明的數(shù)據(jù)發(fā)送方法的流程。圖3是本發(fā)明的定時(shí)器中斷處理步驟。圖4是本發(fā)明的定時(shí)器中斷處理步驟中的數(shù)據(jù)接收流程。圖5是本發(fā)明的定時(shí)器中斷處理步驟中的數(shù)據(jù)發(fā)送流程。圖6是本發(fā)明的軟件中斷處理步驟。圖7是本發(fā)明的實(shí)施例的系統(tǒng)模塊框圖。
具體實(shí)施例方式
現(xiàn)結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明進(jìn)一步說(shuō)明。本發(fā)明方法模擬一個(gè)UART通信接口僅需要1個(gè)定時(shí)器,2個(gè)I/O端口,1個(gè)軟件中斷。模擬多個(gè)UART通信接口可以共用一個(gè)定時(shí)器和一個(gè)軟件中斷,因此,每擴(kuò)展一個(gè)UART 通信接口,僅需要增加2個(gè)I/O端口。其中,定時(shí)器的作用是利用定時(shí)器定時(shí)中斷功能提供精確的波特率定時(shí)??紤]到模擬多個(gè)UART通信接口共享一個(gè)定時(shí)器且通信波特率有可能不同的情況,定時(shí)器的定時(shí)時(shí)間間隔(T_TIMER)設(shè)定為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)1/2,即定時(shí)器中斷頻率(FjIMER)僅為最高波特率的2倍,降低定時(shí)器中斷頻率,降低系統(tǒng)資源損耗。在一段時(shí)間內(nèi)如果無(wú)數(shù)據(jù)收發(fā),則停止定時(shí)器,從而降低在無(wú)數(shù)據(jù)通信情況下的系統(tǒng)資源的耗費(fèi), 一段時(shí)間定義為無(wú)數(shù)據(jù)收發(fā)界定時(shí)間(T_IDLE),可默認(rèn)定義為10個(gè)定時(shí)器中斷時(shí)間,具體可根據(jù)通信數(shù)據(jù)量和頻繁度來(lái)配置。當(dāng)然上述定時(shí)器中斷頻率(FjIMER)為最高波特率的2倍,也可以設(shè)置為η倍,η > 2,考慮到定時(shí)器中斷越頻繁,系統(tǒng)的負(fù)荷就越大,影響系統(tǒng)正常運(yùn)行,本實(shí)施例取η的優(yōu)選值為2。2個(gè)I/O端口,其中一個(gè)I/O端口作為接收管腳(RXD),該I/O端口可配置成低電平中斷模式或通用I/O端口模式,另外一個(gè)I/O端口作為發(fā)送管腳(T)(D),配置成通用I/O 端口模式。軟件中斷,主要作用有兩個(gè)一是當(dāng)完整接收完一個(gè)有效字節(jié)數(shù)據(jù)時(shí),程序主動(dòng)觸發(fā)軟件中斷,在軟件中斷處理步驟中將該有效字節(jié)數(shù)據(jù)存儲(chǔ)到接收FIFO緩存隊(duì)列中;二是當(dāng)發(fā)送完一個(gè)字節(jié)數(shù)據(jù)后,程序主動(dòng)觸發(fā)軟件中斷,在軟件中斷處理步驟中判斷發(fā)送FIFO 緩存隊(duì)列中是否還有數(shù)據(jù)要發(fā)送,如果有,則取出發(fā)送FIFO緩存隊(duì)列中一個(gè)字節(jié)數(shù)據(jù)繼續(xù)發(fā)送。具體的,本發(fā)明的一種通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,包括數(shù)據(jù)接收方法和數(shù)據(jù)發(fā)送方法。其中數(shù)據(jù)接收方法如圖1所示,包括以下過(guò)程
接收管腳(RXD)用來(lái)接收數(shù)據(jù),在無(wú)數(shù)據(jù)接收的情況下配置成低電平中斷模式并打開(kāi) I/O中斷使能,用于監(jiān)測(cè)接收數(shù)據(jù),當(dāng)有數(shù)據(jù)到來(lái)時(shí),首先會(huì)檢測(cè)到起始位,而起始位為低電平,因此立即發(fā)生I/O低電平中斷;
進(jìn)入I/O低電平中斷處理步驟,判斷定時(shí)器是否已啟動(dòng),未啟動(dòng)則啟動(dòng)定時(shí)器,啟動(dòng)字節(jié)數(shù)據(jù)接收;
進(jìn)入定時(shí)器中斷處理步驟,按位接收存儲(chǔ)形成字節(jié)數(shù)據(jù),并判斷數(shù)據(jù)起始位、停止位、 奇偶校驗(yàn)有效性,接收到一個(gè)有效字節(jié)數(shù)據(jù),接收標(biāo)志(RX_FLAG)設(shè)置為有效狀態(tài),接著觸發(fā)軟件中斷,返回配置芯片接收管腳R )的步驟,退出定時(shí)器中斷后進(jìn)入軟件中斷,在軟件中斷中存儲(chǔ)接收的字節(jié)數(shù)據(jù);
進(jìn)入軟件中斷處理步驟,判斷接收標(biāo)志(RX_FLAG)是否為有效狀態(tài),如果為有效狀態(tài), 則清除該有效狀態(tài)標(biāo)志,并將接收的字節(jié)數(shù)據(jù)存儲(chǔ)到接收FIFO緩存隊(duì)列中。進(jìn)一步的,如圖2所示,數(shù)據(jù)發(fā)送方法包括以下過(guò)程
發(fā)送管腳(T)(D)用來(lái)發(fā)送數(shù)據(jù),配置成通用I/O輸出模式,在無(wú)數(shù)據(jù)發(fā)送的情況下,發(fā)送管腳控制輸出高電平;
發(fā)送數(shù)據(jù)時(shí),將待發(fā)送的數(shù)據(jù)存儲(chǔ)到發(fā)送FIFO緩存隊(duì)列中,發(fā)送標(biāo)志(TX_FLAG)設(shè)置為有效狀態(tài),觸發(fā)軟件中斷,進(jìn)入軟件中斷處理步驟;
進(jìn)入軟件中斷處理步驟,判斷發(fā)送標(biāo)志(TX_FLAG)是否為有效狀態(tài),如果為有效狀態(tài),則清除該有效狀態(tài)標(biāo)志,并獲取發(fā)送FIFO緩存隊(duì)列中字節(jié)數(shù)據(jù),賦值到發(fā)送變量(TX_ SHIFT),啟動(dòng)發(fā)送;
進(jìn)入定時(shí)器中斷處理步驟,按位發(fā)送字節(jié)數(shù)據(jù),字節(jié)數(shù)據(jù)發(fā)送完畢,發(fā)送標(biāo)志(TX_ FLAG)設(shè)置為有效狀態(tài),觸發(fā)軟件中斷。進(jìn)一步的,所述1/0低電平中斷處理步驟,包括以下流程 配置接收管腳(RXD)為通用1/0輸入模式,關(guān)閉1/0中斷使能;
計(jì)算一個(gè)位需要定時(shí)中斷的次數(shù)(C_MUL) =定時(shí)器中斷頻率(FjIMER)/波特率 (BAUD);
設(shè)置延時(shí)計(jì)數(shù)器(RX_DELAY) = C_MUL/2,這里除以2的作用是為了延時(shí)半個(gè)位時(shí)間后在定時(shí)中斷處理步驟中再次采集起始位是否為低電平,嚴(yán)格判斷起始位的正確性,提高接收數(shù)據(jù)的檢錯(cuò)能力;
設(shè)置接收位數(shù)(RX_BIT)=起始位數(shù)(START_BIT),設(shè)置接收步驟(RX_STEP) =0,啟動(dòng)起始位接收;
判斷定時(shí)器是否已啟動(dòng),未啟動(dòng)則啟動(dòng)定時(shí)器,無(wú)數(shù)據(jù)收發(fā)的計(jì)數(shù)器(C_IDLE)清0。進(jìn)一步的,如圖3所示,所述定時(shí)器中斷處理步驟,包括以下流程
判斷接收位數(shù)(RX_BIT)是否大于0,接收位數(shù)(RX_BIT)大于0則說(shuō)明處于字節(jié)數(shù)據(jù)接收過(guò)程,進(jìn)入數(shù)據(jù)接收流程;
判斷發(fā)送位數(shù)(TX_BIT)是否大于0,發(fā)送位數(shù)(TX_BIT)大于0則說(shuō)明處于數(shù)據(jù)發(fā)送過(guò)程,進(jìn)入數(shù)據(jù)發(fā)送流程;
無(wú)數(shù)據(jù)收發(fā)的計(jì)數(shù)器(C_IDLE)加1,接著判斷無(wú)數(shù)據(jù)收發(fā)計(jì)數(shù)器(C_IDLE)是否大于無(wú)數(shù)據(jù)收發(fā)界定時(shí)間(T_IDLE),是則停止定時(shí)器,接著中斷退出,否則直接中斷退出。由于無(wú)數(shù)據(jù)收發(fā)的計(jì)數(shù)器(C_IDLE)在進(jìn)入數(shù)據(jù)接收流程和進(jìn)入數(shù)據(jù)發(fā)送流程中會(huì)清0,因此在數(shù)據(jù)收發(fā)過(guò)程中不會(huì)停止定時(shí)器。具體的,如圖4所示,定時(shí)器中斷處理步驟中的數(shù)據(jù)接收流程如下 步驟1
進(jìn)入數(shù)據(jù)接收流程,跳到步驟2 ; 步驟2
無(wú)數(shù)據(jù)收發(fā)的計(jì)數(shù)器(C_IDLE)清0,延時(shí)計(jì)數(shù)器(RX_DELAY)減1,接著判斷RX_DELAY 是否等于0,是則跳到步驟3 ;否則退出; 步驟3
延時(shí)計(jì)數(shù)器(RX_DELAY)等于0,則說(shuō)明延時(shí)到期,接收位數(shù)(RX_BIT)減1,通過(guò)接收步驟(RX_STEP)值判斷接收步驟。如果RX_STEP等于0,則處于接收起始位步驟,跳到步驟4 ; 如果RX_STEP等于1,則處于接收數(shù)據(jù)位步驟,跳到步驟5 ;如果RX_STEP等于2,則處于接收奇偶校驗(yàn)位步驟,跳到步驟6 ;如果RX_STEP等于3,則處于接收停止位步驟,跳到步驟7 ; 步驟4
接收起始位,讀取RXD管腳當(dāng)前狀態(tài),判斷起始位有效性,低電平表示有效,高電平表示無(wú)效;
起始位有效,延時(shí)計(jì)數(shù)器(RX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后開(kāi)始采集數(shù)據(jù)位,由于I/O中斷處理步驟中延時(shí)半位采集起始位,因此,每次采樣的位數(shù)據(jù)都是采集位的中間位置,降低對(duì)定時(shí)器精準(zhǔn)度的要求,提高數(shù)據(jù)接收的容錯(cuò)性, 提高準(zhǔn)確率。接收位數(shù)(RX_BIT)設(shè)置為數(shù)據(jù)位數(shù)(DATA_BIT),表示后續(xù)需要接收的數(shù)據(jù)位數(shù)。數(shù)據(jù)接收變量(RX_SHIFT)清0,為后續(xù)存儲(chǔ)數(shù)據(jù)邏輯位做好準(zhǔn)備。接收步驟(RX_STEP) 設(shè)置為1,啟動(dòng)數(shù)據(jù)位接收,退出; 起始位無(wú)效,跳到步驟8; 步驟5
接收數(shù)據(jù)位,采集當(dāng)前RXD管腳的狀態(tài),按位接收存放在變量(RX_SHIFT)中,延時(shí)計(jì)數(shù)器(RX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后接收下一個(gè)邏輯位,接著判斷接收位數(shù)(RX_BIT)是否等于0 ;接收位數(shù)(RX_BIT)等于0,表示數(shù)據(jù)位接收完畢,接著判斷是否有奇偶校驗(yàn),是則下一步接收奇偶校驗(yàn)位,接收步驟(RX_STEP)設(shè)置為2,接收位數(shù)(RX_BIT)設(shè)置為奇偶校驗(yàn)位數(shù) (PARITY_BIT),啟動(dòng)奇偶校驗(yàn)位接收,退出;否則下一步接收停止位,接收步驟(RX_STEP) 設(shè)置為3,接收位數(shù)(RX_BIT)設(shè)置為停止位數(shù)(ST0P_BIT),啟動(dòng)停止位接收,退出;
接收位數(shù)(RX_BIT)不等于0,表示數(shù)據(jù)位未接收完畢,繼續(xù)接收下一個(gè)邏輯位,退出; 步驟6
接收奇偶校驗(yàn)位,采集當(dāng)前R )管腳的狀態(tài),按位接收存放在變量(RX_PARITY)中,延時(shí)計(jì)數(shù)器(RX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后接收下一個(gè)邏輯位,接著判斷接收位數(shù)(RX_BIT)是否等于0 ;
接收位數(shù)(RX_BIT)等于0,表示奇偶校驗(yàn)位接收完畢,接收步驟(RX_STEP)設(shè)置為3,接收位數(shù)(RX_BIT)設(shè)置為停止位數(shù)(ST0P_BIT),啟動(dòng)停止位接收,退出;
接收位數(shù)(RX_BIT)不等于0,表示奇偶校驗(yàn)位未接收完畢,繼續(xù)接收下一個(gè)邏輯位,退
出;
步驟7
接收停止位,采集當(dāng)前R )管腳的狀態(tài),延時(shí)計(jì)數(shù)器(RX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后接收下一個(gè)邏輯位,接著判斷停止位是否有效;
停止位有效則判斷接收位數(shù)(RX_BIT)是否等于0,等于0表示停止位接收完畢,接收標(biāo)志(RX_FLAG)設(shè)置為1,RXD接收管腳配置成低電平中斷模式并打開(kāi)I/O中斷使能,繼續(xù)監(jiān)測(cè)接收數(shù)據(jù),觸發(fā)軟件中斷,退出;接收位數(shù)(RX_BIT)不等于0表示停止位未接收完畢,繼續(xù)接收下一個(gè)邏輯位,退出; 停止位無(wú)效,跳到步驟8; 步驟8
接收位數(shù)(RX_BIT)清0,表示退出數(shù)據(jù)接收過(guò)程;R)(D接收管腳配置成低電平中斷模式并打開(kāi)I/O中斷使能,重新開(kāi)始監(jiān)測(cè)接收數(shù)據(jù),退出。
具體的,如圖5所示,定時(shí)器中斷處理步驟中的數(shù)據(jù)發(fā)送流程 步驟1
進(jìn)入數(shù)據(jù)發(fā)送流程,跳到步驟2 ; 步驟2
無(wú)數(shù)據(jù)收發(fā)的計(jì)數(shù)器(C_IDLE)清0,延時(shí)計(jì)數(shù)器(TX_DELAY)減1,接著判斷TX_DELAY 是否等于0,是則跳到步驟3 ;否則退出; 步驟3
延時(shí)計(jì)數(shù)器(TX_DELAY)等于0,則說(shuō)明延時(shí)到期,發(fā)送位數(shù)(TX_BIT)減1,通過(guò)發(fā)送步驟(TX_STEP)值判斷發(fā)送步驟。如果TX_STEP等于0,則處于發(fā)送起始位步驟,跳到步驟4 ; 如果TX_STEP等于1,則處于發(fā)送數(shù)據(jù)位步驟,跳到步驟5 ;如果TX_STEP等于2,則處于發(fā)送奇偶校驗(yàn)位步驟,跳到步驟6 ;如果TX_STEP等于3,則處于發(fā)送停止位步驟,跳到步驟7 ; 步驟4
發(fā)送起始位,控制T)(D管腳輸出低電平,表示發(fā)送起始位,延時(shí)計(jì)數(shù)器(TX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后開(kāi)始發(fā)送下一個(gè)邏輯位,接著判斷發(fā)送位數(shù)(TX_BIT)是否等于0 ;
10發(fā)送位數(shù)(TX_BIT)等于0,表示起始位發(fā)送完畢,發(fā)送位數(shù)(TX_BIT)設(shè)置為數(shù)據(jù)位數(shù) (DATA_BIT),表示后續(xù)需要發(fā)送的數(shù)據(jù)位數(shù)。發(fā)送步驟(TX_STEP)設(shè)置為1,啟動(dòng)數(shù)據(jù)位發(fā)送,退出;
發(fā)送位數(shù)(TX_BIT)不等于0,表示起始位未發(fā)送完畢,繼續(xù)發(fā)送下一個(gè)邏輯位,退出; 步驟5
發(fā)送數(shù)據(jù)位,按位發(fā)送存放在變量(TX_SHIFT)中邏輯位,根據(jù)變量(TX_SHIFT)中邏輯位值控制T)(D管腳輸出對(duì)應(yīng)電平,邏輯1輸出高電平,邏輯0輸出低電平。延時(shí)計(jì)數(shù)器 (TX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后發(fā)送下一個(gè)邏輯位, 接著判斷發(fā)送位數(shù)(TX_BIT)是否等于0 ;
發(fā)送位數(shù)(TX_BIT)等于0,表示數(shù)據(jù)位發(fā)送完畢,接著判斷是否有奇偶校驗(yàn),是則下一步發(fā)送奇偶校驗(yàn)位,發(fā)送步驟(TX_STEP)設(shè)置為2,發(fā)送位數(shù)(TX_BIT)設(shè)置為奇偶校驗(yàn)位數(shù) (PARITY_BIT),啟動(dòng)奇偶校驗(yàn)位發(fā)送,退出;否則下一步發(fā)送停止位,發(fā)送步驟(TX_STEP) 設(shè)置為3,發(fā)送位數(shù)(TX_BIT)設(shè)置為停止位數(shù)(ST0P_BIT),啟動(dòng)停止位發(fā)送,退出;
發(fā)送位數(shù)(TX_BIT)不等于0,表示數(shù)據(jù)位未發(fā)送完畢,繼續(xù)發(fā)送下一個(gè)邏輯位,退出; 步驟6
發(fā)送奇偶校驗(yàn)位,按位發(fā)送存放在變量(TX_PARITY)中邏輯位,根據(jù)變量(TX_ PARITY)中邏輯位值控制T)(D管腳輸出對(duì)應(yīng)電平,邏輯1輸出高電平,邏輯0輸出低電平。 延時(shí)計(jì)數(shù)器(TX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后發(fā)送下一個(gè)邏輯位,接著判斷發(fā)送位數(shù)(TX_BIT)是否等于0 ;
發(fā)送位數(shù)(TX_BIT)等于0,表示奇偶校驗(yàn)位發(fā)送完畢,發(fā)送步驟(TX_STEP)設(shè)置為3,發(fā)送位數(shù)(TX_BIT)設(shè)置為停止位數(shù)(ST0P_BIT),啟動(dòng)停止位發(fā)送,退出;
發(fā)送位數(shù)(TX_BIT)不等于0,表示奇偶校驗(yàn)位未發(fā)送完畢,繼續(xù)發(fā)送下一個(gè)邏輯位,退
出;
步驟7
發(fā)送停止位,控制T)(D管腳輸出高電平,表示發(fā)送停止位,延時(shí)計(jì)數(shù)器(TX_DELAY)設(shè)置為位定時(shí)中斷的次數(shù)(C_MUL),表示延時(shí)一個(gè)位時(shí)間后發(fā)送下一個(gè)邏輯位,接著判斷發(fā)送位數(shù)(TX_BIT)是否等于0 ;
發(fā)送位數(shù)(TX_BIT)等于0,表示停止位發(fā)送完畢,到此,一個(gè)字節(jié)數(shù)據(jù)發(fā)送完畢,發(fā)送標(biāo)志(TX_FLAG)設(shè)置為1,觸發(fā)軟件中斷,退出;
發(fā)送位數(shù)(TX_BIT)不等于0,表示停止位未發(fā)送完畢,繼續(xù)發(fā)送下一個(gè)邏輯位,退出。
具體的,軟件中斷處理步驟,如圖6所示,執(zhí)行以下流程
判斷接收標(biāo)志(RX_FLAG)是否等于1,接收標(biāo)志(RX_FLAG)等于1則說(shuō)明已接收到一個(gè)完整字節(jié)數(shù)據(jù),接收標(biāo)志(RX_FLAG)清0,將接收變量(RX_SHIFT)值存儲(chǔ)到接收FIFO緩存隊(duì)列中;
判斷發(fā)送標(biāo)志(TX_FLAG)是否等于1,發(fā)送標(biāo)志(TX_FLAG)等于1則說(shuō)明已發(fā)送完一個(gè)字節(jié)數(shù)據(jù),發(fā)送標(biāo)志(TX_FLAG)清0,判斷發(fā)送FIFO緩存隊(duì)列是否還有數(shù)據(jù)要發(fā)送;
發(fā)送FIFO緩存隊(duì)列中有數(shù)據(jù)待發(fā)送,獲取發(fā)送FIFO緩存隊(duì)列中字節(jié)數(shù)據(jù)賦值給發(fā)送變量(TX_SHIFT),判斷定時(shí)器是否已啟動(dòng),未啟動(dòng)則啟動(dòng)定時(shí)器,無(wú)數(shù)據(jù)收發(fā)的計(jì)數(shù)器(C_ IDLE)清0 ;計(jì)算一個(gè)位需要定時(shí)中斷的次數(shù)(C_MUL)=定時(shí)器中斷頻率(F_TIMER) /波特率(BAUD);設(shè)置延時(shí)計(jì)數(shù)器(TX_DELAY) = C_MUL ;設(shè)置發(fā)送位數(shù)(TX_BIT)=起始位數(shù)(START_ BIT),設(shè)置發(fā)送步驟(TX_STEP) =0,啟動(dòng)起始位發(fā)送; 發(fā)送FIFO緩存隊(duì)列中無(wú)數(shù)據(jù)待發(fā)送,中斷退出。上述過(guò)程中,共3個(gè)中斷事件定時(shí)器中斷、I/O 口電平中斷、軟件中斷。其中定時(shí)器中斷優(yōu)先級(jí)設(shè)為最高,I/O 口電平中斷優(yōu)先級(jí)居中,軟件中斷優(yōu)先級(jí)最低。高優(yōu)先級(jí)的中斷可以打斷低優(yōu)先級(jí)中斷,即在執(zhí)行低優(yōu)先級(jí)中斷處理步驟過(guò)程中,如果發(fā)生了高優(yōu)先級(jí)中斷事件,系統(tǒng)立即響應(yīng)高優(yōu)先級(jí)中斷,程序立即跳轉(zhuǎn)到高優(yōu)先級(jí)中斷處理步驟中執(zhí)行。因此定時(shí)器的中斷事件將得以實(shí)時(shí)響應(yīng)執(zhí)行,提高定時(shí)器精準(zhǔn)度,為提升通信準(zhǔn)確率和提高通信波特率提供前提條件。下面結(jié)合具體應(yīng)用實(shí)例來(lái)描述上述方法的應(yīng)用,如圖7所示,本實(shí)例是一個(gè)由微處理器、IXD顯示屏、衛(wèi)星定位模塊、移動(dòng)通信模塊及其他設(shè)備組成的GPS車載終端,IXD顯示屏、衛(wèi)星定位模塊、移動(dòng)通信模塊及其他設(shè)備通過(guò)UART通信接口與微處理器電性連接。 下面根據(jù)實(shí)際應(yīng)用場(chǎng)景來(lái)闡述本發(fā)明的一種通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法的應(yīng)用
GPS車載終端是一個(gè)安裝在車輛上的設(shè)備,包含了微處理器、存儲(chǔ)器RAM、FLASH、外圍輸入輸出接口、UART通信接口、移動(dòng)通信模塊和衛(wèi)星定位模塊等子系統(tǒng),主要起到移動(dòng)網(wǎng)絡(luò)無(wú)線數(shù)據(jù)通信、GPS衛(wèi)星定位功能、人機(jī)界面交互等功能。微處理器具有1個(gè)物理UART通信接口,多個(gè)I/O 口,2個(gè)定時(shí)器,1個(gè)軟件中斷等硬件資源。本實(shí)施例中具有四個(gè)設(shè)備LCD顯示屏、衛(wèi)星定位模塊、移動(dòng)通信模塊及其他設(shè)備,那么微處理器還需要模擬擴(kuò)展3個(gè)UART通信接口才能連接這四個(gè)硬件設(shè)備,UART2連接移動(dòng)通信模塊,UART3連接IXD顯示屏,UART4連接衛(wèi)星定位模塊。微處理器UARTl為物理UART通信接口,連接其他設(shè)備,由于設(shè)備不固定性,因此通信參數(shù),通信波特率等都不確定,而物理UART可支持很高通信波特率,因此預(yù)留連接其他設(shè)備。微處理器UART2為模擬UART通信接口,用來(lái)連接移動(dòng)通信模塊,移動(dòng)通信模塊通信波特率為19200bps、8位數(shù)據(jù)位、無(wú)奇偶校驗(yàn)、1位停止位。微處理器UART3為模擬UART通信接口,用來(lái)連接IXD顯示屏,IXD顯示屏通信波特率為38400bps、8位數(shù)據(jù)位、無(wú)奇偶校驗(yàn)、1位停止位。微處理器UART4為模擬UART通信接口,用來(lái)連接衛(wèi)星定位模塊,衛(wèi)星定位模塊通信波特率為9600bps、8位數(shù)據(jù)位、無(wú)奇偶校驗(yàn)、1位停止位?;谝陨辖榻B,微處理器需要通過(guò)UART通信接口連接各種單元模塊,而且各單元模塊通信波特率都不一樣,而微處理器只有一個(gè)物理UART通信接口,需要擴(kuò)展UART通信接口同時(shí)盡量控制產(chǎn)品成本。采用本發(fā)明的一種通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,能夠解決以上所述問(wèn)題,實(shí)現(xiàn)真正全雙工通信,可擴(kuò)展多個(gè)UART通信接口,滿足各種不同通信波特率的要求,解決UART通信接口不足問(wèn)題,降低產(chǎn)品成本,提高產(chǎn)品競(jìng)爭(zhēng)力。當(dāng)然本發(fā)明的方法不局限于擴(kuò)展三個(gè)UART通信接口,也可以擴(kuò)展為其他數(shù)目的 UART通信接口,每擴(kuò)展一個(gè)UART通信接口,僅需要增加2個(gè)I/O端口。盡管結(jié)合優(yōu)選實(shí)施方案具體展示和介紹了本發(fā)明,但所屬領(lǐng)域的技術(shù)人員應(yīng)該明白,在不脫離所附權(quán)利要求書所限定的本發(fā)明的精神和范圍內(nèi),在形式上和細(xì)節(jié)上可以對(duì)本發(fā)明做出各種變化,均為本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于包括數(shù)據(jù)接收方法和數(shù)據(jù)發(fā)送方法,其中數(shù)據(jù)接收方法包括以下步驟配置芯片一 I/O管腳為接收管腳RXD的步驟將接收管腳RXD配置為低電平中斷模式并打開(kāi)I/O中斷使能;實(shí)時(shí)監(jiān)測(cè)接收管腳R)(D接收數(shù)據(jù)的步驟當(dāng)接收到數(shù)據(jù)時(shí),首先檢測(cè)該數(shù)據(jù)的起始位, 如果起始位為高電平則繼續(xù)實(shí)時(shí)監(jiān)測(cè),如果起始位為低電平,則觸發(fā)接收管腳RXD發(fā)生I/O 低電平中斷;I/O低電平中斷處理步驟配置接收管腳RXD為通用I/O輸入模式并關(guān)閉I/O中斷使能,啟動(dòng)定時(shí)器,啟動(dòng)字節(jié)數(shù)據(jù)接收,其中所述定時(shí)器的定時(shí)時(shí)間間隔設(shè)置為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)的1/n,即定時(shí)器中斷頻率為多個(gè)UART通信接口中最高波特率的η倍,定時(shí)器的定時(shí)時(shí)間到時(shí)觸發(fā)定時(shí)器中斷,其中η > 2 ;定時(shí)器中斷處理步驟根據(jù)定時(shí)器定時(shí)中斷接收數(shù)據(jù),每次中斷根據(jù)計(jì)算延時(shí)計(jì)數(shù)器到期接收一個(gè)位,經(jīng)過(guò)若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)數(shù)據(jù)的接收,并判斷接收到的字節(jié)的有效性,如果接收到的字節(jié)無(wú)效則返回“配置芯片一 I/O管腳為接收管腳RXD的步驟”,如果接收到的字節(jié)有效則觸發(fā)軟件中斷,返回“配置芯片一 I/O管腳為接收管腳R)(D的步驟”,退出定時(shí)器中斷后進(jìn)入軟件中斷,在軟件中斷中存儲(chǔ)接收的字節(jié)數(shù)據(jù);軟件中斷處理步驟將接收到的有效字節(jié)數(shù)據(jù)存儲(chǔ)到接收FIFO緩存隊(duì)列中; 數(shù)據(jù)發(fā)送方法包括以下步驟配置芯片另一 I/O管腳為發(fā)送管腳T)(D的步驟將發(fā)送管腳T)(D配置為通用I/O輸出模式;準(zhǔn)備發(fā)送數(shù)據(jù)的步驟將待發(fā)送的數(shù)據(jù)存儲(chǔ)到發(fā)送FIFO緩存隊(duì)列中,觸發(fā)軟件中斷; 軟件中斷處理步驟獲取發(fā)送FIFO緩存隊(duì)列中字節(jié)數(shù)據(jù),啟動(dòng)字節(jié)數(shù)據(jù)發(fā)送,并按照定時(shí)器的定時(shí)時(shí)間來(lái)觸發(fā)定時(shí)器中斷;定時(shí)器中斷處理步驟根據(jù)定時(shí)器定時(shí)中斷發(fā)送數(shù)據(jù),每次中斷根據(jù)計(jì)算延時(shí)計(jì)數(shù)器到期發(fā)送一個(gè)位,經(jīng)過(guò)若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)數(shù)據(jù)的發(fā)送;如果字節(jié)數(shù)據(jù)發(fā)送完畢, 觸發(fā)軟件中斷,進(jìn)入軟件中斷處理步驟。
2.根據(jù)權(quán)利要求1所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于 所述I/O低電平中斷處理步驟,包括配置芯片接收管腳RXD的步驟將接收管腳RXD配置為通用I/O輸入模式并關(guān)閉I/O 中斷使能;計(jì)算并設(shè)置定時(shí)器參數(shù)的步驟所述定時(shí)器的定時(shí)時(shí)間間隔設(shè)置為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)的1/n,即定時(shí)器中斷頻率為多個(gè)UART通信接口中最高波特率的 η倍,通過(guò)定時(shí)器中斷頻率/UART通信接口的波特率計(jì)算獲得一個(gè)位需要定時(shí)中斷的次數(shù), 其中η彡2;啟動(dòng)起始位接收的步驟設(shè)置接收位數(shù)等于起始位數(shù),啟動(dòng)起始位接收; 啟動(dòng)定時(shí)器的步驟啟動(dòng)定時(shí)器開(kāi)始計(jì)時(shí)。
3.根據(jù)權(quán)利要求1或2所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于η的取值為2。
4.根據(jù)權(quán)利要求2所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于所述I/O低電平中斷處理步驟還包括數(shù)據(jù)采樣步驟,所述數(shù)據(jù)采樣步驟是延時(shí)半個(gè)位時(shí)間后在定時(shí)中斷處理步驟中再次采集起始位是否為低電平。
5.根據(jù)權(quán)利要求3所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于 所述I/O低電平中斷處理步驟還包括數(shù)據(jù)采樣步驟,所述數(shù)據(jù)采樣步驟是延時(shí)半個(gè)位時(shí)間后在定時(shí)中斷處理步驟中再次采集起始位是否為低電平。
6.根據(jù)權(quán)利要求1所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于 所述定時(shí)器中斷處理步驟,包括判斷處于接收狀態(tài)還是發(fā)送狀態(tài),根據(jù)判斷結(jié)果選擇進(jìn)入數(shù)據(jù)接收流程或數(shù)據(jù)發(fā)送流程,并判斷數(shù)據(jù)收發(fā)是否結(jié)束,如果在設(shè)定的一段時(shí)間內(nèi)沒(méi)有數(shù)據(jù)收發(fā),則停止定時(shí)器;所述I/O低電平中斷處理步驟中的啟動(dòng)定時(shí)器的步驟還包括以下過(guò)程判斷定時(shí)器是否已啟動(dòng),如果未啟動(dòng)則啟動(dòng)定時(shí)器。
7.根據(jù)權(quán)利要求6所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于 在設(shè)定的一段時(shí)間內(nèi)沒(méi)有數(shù)據(jù)收發(fā)則停止定時(shí)器,所述設(shè)定的一段時(shí)間是根據(jù)通信數(shù)據(jù)量和頻繁度來(lái)設(shè)定。
8.根據(jù)權(quán)利要求1所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于 所述軟件中斷處理步驟,包括判斷處于接收狀態(tài)還是發(fā)送狀態(tài),根據(jù)判斷結(jié)果選擇進(jìn)入數(shù)據(jù)接收的軟件中斷處理和數(shù)據(jù)發(fā)送的軟件中斷處理,其中所述數(shù)據(jù)接收的軟件中斷處理是將接收到的有效字節(jié)數(shù)據(jù)存儲(chǔ)到接收FIFO緩存隊(duì)列中;所述數(shù)據(jù)發(fā)送的軟件中斷處理是判斷FIFO緩存隊(duì)列中是否仍有數(shù)據(jù)待發(fā)送,如果沒(méi)有,則直接中斷返回,如果有,則獲取發(fā)送FIFO緩存隊(duì)列中字節(jié)數(shù)據(jù);設(shè)置定時(shí)器的參數(shù) 所述定時(shí)器的定時(shí)時(shí)間間隔設(shè)置為多個(gè)UART通信接口中最高波特率的位時(shí)長(zhǎng)的1/n,即定時(shí)器中斷頻率為多個(gè)UART通信接口中最高波特率的η倍,通過(guò)定時(shí)器中斷頻率/UART通信接口的波特率計(jì)算獲得一個(gè)位需要定時(shí)中斷的次數(shù),其中η ^ 2 ;啟動(dòng)字節(jié)數(shù)據(jù)發(fā)送;中斷退出。
9.根據(jù)權(quán)利要求8所述的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,其特征在于 η的取值為2。
全文摘要
本發(fā)明涉及一種嵌入式系統(tǒng)中通過(guò)軟件模擬實(shí)現(xiàn)UART通信接口數(shù)據(jù)的發(fā)送和接收的處理方法。本發(fā)明的通過(guò)軟件模擬實(shí)現(xiàn)多個(gè)UART通信接口的方法,包括數(shù)據(jù)接收方法和數(shù)據(jù)發(fā)送方法,利用定時(shí)器的定時(shí)中斷功能實(shí)現(xiàn)精確的波特率定時(shí),發(fā)送和接收都在定時(shí)中斷的控制之下進(jìn)行。本發(fā)明中模擬一個(gè)UART通信接口僅需要1個(gè)定時(shí)器,2個(gè)I/O端口,1個(gè)軟件中斷。模擬多個(gè)UART通信接口可以共用一個(gè)定時(shí)器和一個(gè)軟件中斷,因此,每增加擴(kuò)展一個(gè)UART通信接口,僅需要增加2個(gè)I/O端口。本發(fā)明應(yīng)用于軟件模擬實(shí)現(xiàn)UART通信接口。
文檔編號(hào)G06F13/24GK102546843SQ201210013739
公開(kāi)日2012年7月4日 申請(qǐng)日期2012年1月17日 優(yōu)先權(quán)日2012年1月17日
發(fā)明者葉德焰, 李基勇, 賴榮東, 陳余菲, 陳挺 申請(qǐng)人:廈門雅迅網(wǎng)絡(luò)股份有限公司