基于USB接口的數(shù)據(jù)通信演示板的軟硬件實(shí)現(xiàn)方案
——
在開發(fā)USB設(shè)備時(shí)最難的就是固件和驅(qū)動(dòng)程序的開發(fā),要想成功的開發(fā)這兩部分必須完全熟悉USB協(xié)議,而這至少需要五到六個(gè)月的時(shí)間。南京沁恒公司的CH371芯片是一塊屏蔽了USB協(xié)議的接口芯片,該芯片固化了設(shè)備驅(qū)動(dòng)程序和單片機(jī)程序中的協(xié)議處理部分,因此不需要去了解復(fù)雜的設(shè)備驅(qū)動(dòng)程序和USB協(xié)議,大大減少了開發(fā)周期,也降低了開發(fā)難度。本文介紹的演示板就是基于該公司的CH371和CH451芯片的一個(gè)簡(jiǎn)單USB外設(shè),通過這塊演示板,不僅可以了解基于USB接口的基本結(jié)構(gòu),而且還可以熟悉基于這種接口的PC和單片機(jī)通信的單片機(jī)控制程序和計(jì)算機(jī)應(yīng)用程序的編寫。
芯片介紹
USB接口芯片CH371
CH371是一個(gè)USB 總線的通用接口芯片。在本地端,CH371 具有8位數(shù)據(jù)總線和讀、寫、片選控制線以及中斷輸出,可以方便地掛接到單片機(jī)、DSP、MCU 等控制器的系統(tǒng)總線上;在計(jì)算機(jī)系統(tǒng)中,CH371 的配套軟件提供了簡(jiǎn)潔易用的操作接口,與本地端的單片機(jī)通訊就如同讀寫硬盤中的文件。CH371 屏蔽了USB 通訊中的所有協(xié)議,在計(jì)算機(jī)應(yīng)用層與本地端控制器之間提供端對(duì)端的連接。基于CH371,不需要了解任何USB 協(xié)議或者固件程序,甚至驅(qū)動(dòng)程序,就可以輕松地將并口、串口的產(chǎn)品升級(jí)到USB 接口。
使用時(shí),在本地端CH371具有8位數(shù)據(jù)總線和讀、寫、片選控制線以及中斷輸出,就像操作一般外設(shè)芯片一樣方便地掛接到DSP、MCU等控制器的系統(tǒng)總線上;在計(jì)算機(jī)端,CH371的配套軟件包括通用驅(qū)動(dòng)程序以及應(yīng)用軟件包,提供了簡(jiǎn)潔易用的操作接口。
根據(jù)不同的工作方式,芯片的接口類型可以有以下幾種:被動(dòng)并行接口、I2C主接口、主控方式接口。按照芯片特點(diǎn),CH371芯片通過被動(dòng)并行接口與本地端控制器連接,通過USB接口與計(jì)算機(jī)連接,如圖1所示。
圖1 單片機(jī)、CH371芯片以及PC連接示意圖
鍵盤控制和數(shù)碼管驅(qū)動(dòng)芯片CH451
CH451 是一個(gè)多功能外圍芯片,通過可以級(jí)聯(lián)的4 線串行接口與單片機(jī)、DSP、微處理器等控制器交換數(shù)據(jù)。CH451 包含三個(gè)功能:數(shù)碼管顯示驅(qū)動(dòng)、鍵盤掃描控制、 P 監(jiān)控,三個(gè)功能之間相互獨(dú)立,控制器可以通過操作命令分別啟用、關(guān)閉、設(shè)定CH451 的任何一個(gè)功能。CH451 的串行接口是由硬件實(shí)現(xiàn)的,控制器可以頻繁地通過串行接口進(jìn)行高速操作。CH451主要功能包括動(dòng)態(tài)掃描功能和鍵盤掃描功能。
在計(jì)算機(jī)應(yīng)用層,通過應(yīng)用程序來(lái)演示CH451的各種功能。應(yīng)用程序把控制命令通過CH371傳送給單片機(jī),單片機(jī)接收到命令后再來(lái)控制CH451。CH451通過四線串行接口與單片機(jī)連接,如圖2所示。
圖2 單片機(jī)、CH451芯片和鍵盤、數(shù)碼管的連接示意圖
USB設(shè)備配置和數(shù)據(jù)傳輸過程描述
USB即插即用的自動(dòng)配置過程是由CH371 芯片和驅(qū)動(dòng)程序共同完成的。將帶有CH371芯片的USB產(chǎn)品插入到計(jì)算機(jī)的USB插槽中,當(dāng)PC機(jī)檢測(cè)到USB 插入事件,操作系統(tǒng)有選擇地復(fù)位USB 產(chǎn)品,并讀取USB 產(chǎn)品的設(shè)備描述符,在CH371 芯片返回設(shè)備描述符后,操作系統(tǒng)根據(jù)設(shè)備描述符加載CH371 驅(qū)動(dòng)程序;CH371 驅(qū)動(dòng)程序讀取CH371 芯片的設(shè)備描述符和配置描述符;在CH371 芯片返回設(shè)備描述符和配置描述符之后,CH371 驅(qū)動(dòng)程序根據(jù)配置描述符請(qǐng)求操作系統(tǒng)對(duì)CH371 芯片進(jìn)行配置。在完成配置后,PC機(jī)給CH371 芯片分配一個(gè)USB 設(shè)備地址,并指定一個(gè)USB 配置。以上是CH371 芯片的自動(dòng)配置過程,在完成自動(dòng)配置后,CH371 驅(qū)動(dòng)程序向應(yīng)用層開放操作接口。
數(shù)據(jù)傳輸過程是USB 產(chǎn)品的應(yīng)用層軟件與USB 產(chǎn)品的控制器之間的數(shù)據(jù)進(jìn)行傳輸?shù)倪^程。首先計(jì)算機(jī)應(yīng)用層將數(shù)據(jù)請(qǐng)求發(fā)送給CH371 芯片,CH371 芯片以中斷方式通知本地端控制器,并使之進(jìn)入中斷程序,查看傳輸狀態(tài)信息寄存器中的數(shù)據(jù)傳輸方向標(biāo)志位,如果是上傳,則將上傳數(shù)據(jù)長(zhǎng)度寄存器置為15,然后退出中斷程序;如果是下傳,則查看下傳數(shù)據(jù)長(zhǎng)度寄存器,從數(shù)據(jù)下傳緩沖區(qū)中讀取數(shù)據(jù)塊,并分析接收到的數(shù)據(jù)塊,將應(yīng)答數(shù)據(jù)和應(yīng)答數(shù)據(jù)的長(zhǎng)度分別寫入數(shù)據(jù)上傳緩沖區(qū)和上傳數(shù)據(jù)長(zhǎng)度寄存器中,然后退出中斷程序。在退出中斷程序之后, CH371 芯片將應(yīng)答數(shù)據(jù)返回給計(jì)算機(jī),此時(shí)計(jì)算機(jī)應(yīng)用層將會(huì)接收到應(yīng)答數(shù)據(jù)。
演示板硬件電路設(shè)計(jì)
本演示板采用USB 總線接口芯片CH371、數(shù)碼管驅(qū)動(dòng)和鍵盤控制芯片CH451和通用的MCS51 系列單片機(jī)構(gòu)成,用于演示CH371 的USB 數(shù)據(jù)通訊功能,CH451 的數(shù)碼管驅(qū)動(dòng)/鍵盤掃描功能,以及CH371 與單片機(jī)的連接,CH451 與單片機(jī)的連接。演示板通過USB 接口與PC 機(jī)進(jìn)行通訊,并由PC 機(jī)控制它的執(zhí)行,演示板電路設(shè)計(jì)如圖所3示。
圖3中,元器件說(shuō)明如下:
晶振X1 為標(biāo)準(zhǔn)的12MHz,晶振的金屬外殼應(yīng)該接地,以減少來(lái)自外界的干擾;振蕩電容C1、C2 的容量為20pF(可以在5pF 至30pF 之間選擇);另外,建議在CH371 的XI引腳(第14 腳)前串接一個(gè)阻值為1K 的電阻(可以在200 至3K 之間選擇),即X1與C2 相連接后通過1K 電阻連接到CH371 的XI 引腳。
阻抗匹配電阻R1、R2 為100 (可以在80 至150 之間選擇),如果CH371 的工作電壓略低于5V ,則R1、R2 的阻值可以適當(dāng)減少。
U4(單片機(jī)89C51)用于測(cè)試CH371 的USB 數(shù)據(jù)通信功能,本例中CH371 工作于復(fù)用地址方式,U4 的ALE 與CH371 的ALE 相連接,CH371 的INT#與U4 的INT0 相連接,U4通過CH371 的被動(dòng)并行接口與CH371 進(jìn)行數(shù)據(jù)交換。
U3(EEPROM 器件24C02)作為I2C 接口的目標(biāo)設(shè)備,用于測(cè)試CH371 的I2C 接口功能,PC 機(jī)的應(yīng)用層程序可以直接對(duì)該器件進(jìn)行讀寫測(cè)試。
L1(發(fā)光二極管LED)用于測(cè)試CH371 的主控方式的功能,即使CH371 不連接任何單片機(jī)(例如在本例中取出單片機(jī)U4),PC 機(jī)的應(yīng)用層程序仍然可以直接控制CH371 的A3引腳輸出低電平或者高電平,從而點(diǎn)亮LED 或者熄滅LED。
圖3 CH371和CH451演示板硬件電路圖
跳線J1 用于測(cè)試CH371的片選線CS#的兩種用法,在本例中單片機(jī)沒有其它外圍器件,所以CS#引腳可以懸空,作為默認(rèn)選擇,如果單片機(jī)還有其它并行接口的外圍器件,則CS#應(yīng)該作為片選控制線,例如由單片機(jī)的地址線A15 驅(qū)動(dòng),從而將CH371 定位于單片機(jī)U4 的0000H-7FFFH 地址空間。
跳線J3 用于測(cè)試CH371 的USB 帶電下線功能,當(dāng)單片機(jī)U4 的P1.4 引腳輸出高電平時(shí),可以控制CH371 模擬從USB 總線上斷開,當(dāng)單片機(jī)U4 的P1.4 引腳輸出低電平時(shí),可以控制CH371 模擬連接到USB 總線。
跳線J2 用于選擇單片機(jī)U4 上電復(fù)位信號(hào)的來(lái)源,CH371 和CH451 都具有上電復(fù)位和看門狗功能,由J2 可以分別測(cè)試兩個(gè)芯片的上電復(fù)位功能。電阻R4 用于調(diào)節(jié)CH451的上電復(fù)位門限,阻值為200K 時(shí)上電復(fù)位門限約為4V,測(cè)試時(shí)請(qǐng)注意防止干擾。
電阻R5 為數(shù)碼管的限流電阻,阻值可以在60 至500 之間選擇,阻值為200 時(shí)限定段電流為13mA 左右;電阻R6 為按鍵掃描的限流電阻,阻值可以在1K 至10K 之間選擇,本例中為2K ,如果不使用CH451 的按鍵掃描功能,則電阻R6 可以省去。
CH451的SEG0~SEG7引腳和DIG0~ DIG7引腳相互配合,可以最大擴(kuò)展8個(gè)共陰數(shù)碼管和64個(gè)輕觸按鈕。這部分?jǐn)U展電路比較容易,由于版面所限,以上電路圖省去了這部分。 程序的軟件設(shè)計(jì)一般USB設(shè)備的開發(fā),USB接口程序設(shè)計(jì)包括三部分:?jiǎn)纹瑱C(jī)程序開發(fā),USB設(shè)備驅(qū)動(dòng)程序開發(fā),主機(jī)應(yīng)用程序開發(fā)。由于CH371接口芯片固化了設(shè)備驅(qū)動(dòng)程序和單片機(jī)程序中的協(xié)議處理部分,因此軟件設(shè)計(jì)僅僅包括兩部分,即單片機(jī)中的數(shù)據(jù)交換部分和主機(jī)的應(yīng)用程序。
單片機(jī)控制程序
應(yīng)用程序和單片機(jī)控制程序之間有這樣的協(xié)議約定:應(yīng)用程序發(fā)送給單片機(jī)的數(shù)據(jù)中的第一個(gè)字節(jié)是命令,單片機(jī)接收到PC發(fā)送過來(lái)的數(shù)據(jù)后,先對(duì)第一個(gè)字節(jié)做出響應(yīng),根據(jù)命令的不同進(jìn)入不同的子程序。例如:定義DEMOTESTDATA EQU 90H,這表示90H這個(gè)十六進(jìn)制數(shù)據(jù)代表測(cè)試命令,當(dāng)單片機(jī)接收到來(lái)自PC的數(shù)據(jù)的第一個(gè)字節(jié)是90H時(shí),就會(huì)進(jìn)入將PC 發(fā)來(lái)的數(shù)據(jù)取反的子程序,并將取反后的數(shù)據(jù)返回。
在整個(gè)方案中單片機(jī)控制程序的作用主要有:(1)當(dāng)評(píng)估板上的按鍵按下時(shí),CH451通過中斷通知單片機(jī),然后單片機(jī)從CH451的緩沖區(qū)中讀取鍵碼值,單片機(jī)再通過中斷通知PC機(jī),PC進(jìn)入相應(yīng)的中斷程序進(jìn)行處理;2)當(dāng)PC發(fā)送命令時(shí),CH371通過中斷通知單片機(jī),單片機(jī)對(duì)該命令做出響應(yīng),或控制CH451,或返回應(yīng)答數(shù)據(jù),流程圖如圖4所示。
圖4 單片機(jī)控制程序流程圖
PC端應(yīng)用程序設(shè)計(jì)
為了檢驗(yàn)硬件設(shè)計(jì)和單片機(jī)控制程序編寫的可行性,需要在PC端用VB編寫一個(gè)測(cè)試程序,用以測(cè)試硬件電路在數(shù)據(jù)通信方面是否暢通。程序用到了4個(gè)窗體,2個(gè)模塊。其中兩個(gè)模塊主要是定義一些全局變量、函數(shù),以及API函數(shù)的聲明(因?yàn)檫@些函數(shù)只有在聲明以后才能調(diào)用),設(shè)計(jì)4個(gè)窗體是為了更好地完成演示板的各項(xiàng)功能。
(1)主界面設(shè)計(jì)
演示主界面如圖5所示。
圖5 主界面
功能說(shuō)明:在電路板上有三個(gè)按鍵,對(duì)應(yīng)這三個(gè)按鍵有三個(gè)不同的演示程序。根據(jù)該界面的提示,每按下一個(gè)按鍵就進(jìn)入相應(yīng)的演示程序,而演示完一個(gè)程序后可以退回該界面進(jìn)行另外演示程序的選擇。 2)同步可調(diào)實(shí)時(shí)時(shí)鐘演示程序
界面設(shè)計(jì)如圖6所示。
圖6 與真實(shí)時(shí)間同步的可調(diào)時(shí)鐘演示界面
功能說(shuō)明:進(jìn)入該演示程序后,PC會(huì)通過命令使數(shù)碼管上顯示當(dāng)前時(shí)間,但時(shí)鐘不走動(dòng)。
“啟動(dòng)時(shí)鐘”:?jiǎn)螕粼撁畎粹o時(shí)鐘開始走動(dòng)。
“校準(zhǔn)時(shí)鐘”:?jiǎn)螕粼撁畎粹o后,文本框下的六個(gè)命令按鈕會(huì)被激活,它們分別對(duì)應(yīng)六個(gè)數(shù)碼管。單擊修改時(shí)間對(duì)應(yīng)的按鈕,會(huì)彈出對(duì)話框,要求輸入要修改的時(shí)間。
“校時(shí)確定”:當(dāng)時(shí)間校準(zhǔn)好以后,單擊命令按鈕,這時(shí)會(huì)彈出對(duì)話框提示是否已經(jīng)校準(zhǔn)時(shí)間,否則可以繼續(xù)修改。若確定以后,時(shí)鐘又可以正常走動(dòng)。
“返回主窗體”:?jiǎn)螕粼撁畎粹o回到窗體一,以便繼續(xù)進(jìn)行其他程序的演示。
(3)CH451各項(xiàng)功能演示程序
界面設(shè)計(jì)如圖7所示。
圖7 鍵盤控制和數(shù)碼管驅(qū)動(dòng)芯片CH451各項(xiàng)功能演示界面
功能說(shuō)明:當(dāng)進(jìn)入該演示程序后,會(huì)自動(dòng)在數(shù)碼管上加在字?jǐn)?shù)據(jù)“HELPHELP”。
“右(左)移位”:?jiǎn)螕裘畎粹o,數(shù)碼管上的字會(huì)向右(左)移動(dòng),左(右)邊移出的空位會(huì)加0。
“右(左)循環(huán)移位”:?jiǎn)螕裘畎粹o會(huì)使數(shù)碼管的數(shù)據(jù)分別向右(左)循環(huán)移位。
“加載字?jǐn)?shù)據(jù)”:?jiǎn)螕粼撁畎粹o后,會(huì)彈出對(duì)話框提示“要加載字?jǐn)?shù)據(jù)請(qǐng)單擊相應(yīng)的文本框”。此時(shí)文本框會(huì)被激活,當(dāng)單擊文本框后,會(huì)再次彈出對(duì)話框,要求輸入要加載的字?jǐn)?shù)據(jù)。輸入完并確定后,數(shù)碼管上就會(huì)顯示加載的字?jǐn)?shù)據(jù)了。 “閃爍”:?jiǎn)螕粼撁畎粹o后,會(huì)彈出對(duì)話框提示“要是數(shù)碼管閃爍請(qǐng)單擊對(duì)應(yīng)的單選按鈕”,同時(shí)8個(gè)單選按鈕會(huì)被激活。每個(gè)單選按鈕對(duì)應(yīng)一個(gè)數(shù)碼管,選中相應(yīng)的單選按鈕后,對(duì)應(yīng)的數(shù)碼管就會(huì)閃爍。當(dāng)再選中另外的單選按鈕后,前一個(gè)就會(huì)停止閃爍。
“亮度控制按鈕”:?jiǎn)螕粼撁畎粹o后,彈出對(duì)話框提示“請(qǐng)單擊相應(yīng)的單選按鈕進(jìn)行亮度的選擇”,同時(shí),十六個(gè)單選按鈕會(huì)被激活,它們對(duì)應(yīng)控制數(shù)碼管的十六級(jí)亮度顯示,當(dāng)選中第一個(gè)按鈕時(shí),數(shù)碼管會(huì)變的最暗,當(dāng)依次選中其他的按鈕時(shí),亮度會(huì)依次遞增。
“DEFAULT”:?jiǎn)螕粼撁畎粹o后,會(huì)回到默認(rèn)狀態(tài)。即:字?jǐn)?shù)據(jù)顯示為“HELPHELP”;閃爍的數(shù)碼管會(huì)停止閃爍;數(shù)碼管的亮度會(huì)變?yōu)?6級(jí)亮度。
“熄滅數(shù)碼管”:?jiǎn)螕粼撁畎粹o后,數(shù)碼管會(huì)熄滅。
“退出”:?jiǎn)螕粼撁畎粹o后,會(huì)返回主窗體。
批量數(shù)據(jù)傳輸演示程序
界面設(shè)計(jì)如圖8所示。
圖8 PC和AT89C51之間通過USB接口芯片CH371的數(shù)據(jù)塊傳輸界面
功能說(shuō)明:
“發(fā)送數(shù)據(jù)”:?jiǎn)螕粼撁畎粹o后,會(huì)彈出對(duì)話框,首先要求輸入要發(fā)送的數(shù)據(jù)的個(gè)數(shù),然后會(huì)彈出對(duì)話框要求輸入要發(fā)送的數(shù)據(jù)。同時(shí)發(fā)送的數(shù)據(jù)會(huì)在文本框中顯示,以便和接收到的數(shù)據(jù)進(jìn)行比較,看單片機(jī)是否做出了正確的應(yīng)答。
“接收數(shù)據(jù)”:?jiǎn)螕粼撁畎粹o后,PC會(huì)首先發(fā)送一個(gè)命令給單片機(jī),要求單片機(jī)對(duì)剛才發(fā)送的命令做出響應(yīng)。單片機(jī)接收到此命令后會(huì)對(duì)接收到的數(shù)據(jù)按位取反,然后返回給計(jì)算機(jī)。當(dāng)計(jì)算機(jī)接收到返回的數(shù)據(jù)后會(huì)在文本框中顯示出來(lái)。
“退出”:?jiǎn)螕粼摪粹o后會(huì)返回主窗體。
程序調(diào)試的體會(huì)
該演示程序最關(guān)鍵的就是要使得PC和單片機(jī)之間能夠通過CH371接口芯片進(jìn)行通信,這必須用到該公司提供的API函數(shù)。調(diào)試時(shí)需要事先理解這些函數(shù)的作用以及各個(gè)參數(shù)的具體意義。PC的命令和數(shù)據(jù)能夠很容易就傳給單片機(jī),但單片機(jī)得到的按鍵值卻無(wú)法傳到PC機(jī)。后來(lái)筆者在查閱了一本關(guān)于在Visual Basic中調(diào)用API函數(shù)的書后終于找到了問題的原因所在,通過修改一下API函數(shù)的中的參數(shù),終于使得PC和單片機(jī)之間能夠進(jìn)行雙向的通信,這一步成功后其余的調(diào)試就比較容易進(jìn)行了。
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
晶振相關(guān)文章:晶振原理
評(píng)論