基于52單片機(jī)的嵌入式Web控制系統(tǒng)設(shè)計(jì)詳解
當(dāng)前工業(yè)控制系統(tǒng)中流行的控制方式:底層設(shè)備采用RS232總線結(jié)構(gòu),而上層的管理層一般采用以太網(wǎng)結(jié)構(gòu)。該控制方式使信號(hào)可以在企業(yè)的Intranet上及時(shí)發(fā)布和共享,還可以在Internet/Intranet的任何位置對(duì)現(xiàn)場智能設(shè)備進(jìn)行在線控制、功能組態(tài)以及遠(yuǎn)程診斷等,實(shí)現(xiàn)了控制網(wǎng)絡(luò)真正意義上的開放性和互操作性。而RS485總線是一種基于平衡發(fā)送和差分接收的串行總線,具有很強(qiáng)的抗共模干擾能力,在適當(dāng)?shù)牟ㄌ芈氏聜鬏斁嚯x很遠(yuǎn)。同時(shí)由于其硬件設(shè)計(jì)簡單、控制方便、易于進(jìn)行網(wǎng)絡(luò)擴(kuò)展,被廣泛的應(yīng)用在很多工業(yè)現(xiàn)場。
本文所研究的嵌入式以太網(wǎng)適配器,就是要解決嵌入式設(shè)備網(wǎng)絡(luò)通信的問題,方便嵌入式系統(tǒng)與計(jì)算機(jī)網(wǎng)絡(luò)的通信,實(shí)現(xiàn)遠(yuǎn)程監(jiān)控、訪問及數(shù)據(jù)的傳輸。
一、主要芯片選擇及簡介
1、單片機(jī)AT89S52
本設(shè)計(jì)中AT89S52作為核心處理器。AT89S52是Atmel公司生產(chǎn)的低功耗、高性能CMOS8位單片機(jī),片內(nèi)含有8k字節(jié)的EPROM和256字節(jié)的RAM。具有ISP(在系統(tǒng)編程)功能。它具有靈活性高、使用方便、價(jià)格低廉等優(yōu)點(diǎn)。因此,該芯片在嵌入式控制系統(tǒng)中得到了廣泛應(yīng)用。單片機(jī)AT89S52經(jīng)過以太網(wǎng)傳到PC機(jī)實(shí)現(xiàn)遠(yuǎn)程控制。利用AT89S52的ISP(在系統(tǒng)編程)功能,很方便地把編好的程序?qū)懙絾纹瑱C(jī)中,并且調(diào)試、修改和升級(jí)很容易。由于AT89S52單片機(jī)本身提供了一組全雙工串行傳輸口,由TXD引腳來傳送串行數(shù)據(jù),而由RXD引腳來接收數(shù)據(jù),可是其工作邏輯電平皆為TTL電平(0V,5V)。AT89S52最小系統(tǒng)如圖1所示。
圖1 AT89S52最小系統(tǒng)
2、網(wǎng)絡(luò)控制芯片ENC624J600
ENC624J600網(wǎng)絡(luò)控制器是一款帶有行業(yè)標(biāo)準(zhǔn)串行接口和并行接口的,專為嵌入式應(yīng)用系統(tǒng)設(shè)計(jì)的獨(dú)立以太網(wǎng)控制芯片。ENC624J600通過SPI或并行接口與單片機(jī)通信,數(shù)據(jù)傳輸速率為14Mbit/s(對(duì)于SPI)至160Mbit/s(對(duì)于16位的并行接口),ENC624J600主要功能特性有,自適應(yīng)的選擇傳輸速率,支持10Mbit/s或100Mbit/s;充分支持半雙工或全雙工交換式以太網(wǎng);可編程填充和CRC生成;提供24KBA片內(nèi)RAM緩沖區(qū),用于執(zhí)行發(fā)送和接手操作,主單片機(jī)還可以用它來進(jìn)行常規(guī)的存儲(chǔ)操作;支持總線8位或16位CPU訪問,可編程自動(dòng)拒絕錯(cuò)誤數(shù)據(jù)包;可編程為發(fā)生沖突時(shí)自動(dòng)重發(fā)。
ENC624J600器件符合IEEE 802.3中適用于10 Base-T 和100 Base-TX 以太網(wǎng)的全部規(guī)范,包括許多可選條款,例如自動(dòng)協(xié)商。ENC624J600器件采用了一系列數(shù)據(jù)包過濾機(jī)制以對(duì)傳入數(shù)據(jù)包進(jìn)行限制。它還提供了一個(gè)16位寬的內(nèi)部DMA以實(shí)現(xiàn)快速數(shù)據(jù)吞吐和硬件IP校驗(yàn)和計(jì)算支持。對(duì)于需要SSL、TLS 以及其他與加密相關(guān)的協(xié)議的安全和身份驗(yàn)證功能的應(yīng)用,提供了一個(gè)安全引擎模塊。 該引擎可執(zhí)行RSA、Diffie- Hellman、AES、MD5 和SHA-1 算法計(jì)算,以縮短代碼大小、加快連接的建立和吞吐,并減少固件開發(fā)的工作量。通過SPI或并行接口與單片機(jī)通信,數(shù)據(jù)傳輸速率為14 Mbit/s(對(duì)于SPI)至160 Mbit/s (對(duì)于16 位解復(fù)用并行接口)。提供了專用于LED 連接、活動(dòng)指示以及發(fā)送/接收/DMA 中斷的引腳。提供了一個(gè)通用24 KB片內(nèi)RAM緩沖區(qū),用于執(zhí)行發(fā)送和接收操作。主單片機(jī)還可以用它來進(jìn)行常規(guī)存儲(chǔ)操作。通信協(xié)議(例如TCP)可使用此存儲(chǔ)器保存可能需要重新發(fā)送的數(shù)據(jù)。在最終產(chǎn)品易于生產(chǎn)性方面,ENC624J600 系列的每個(gè)器件都預(yù)編程了唯一的非易失性MAC地址。在大多數(shù)情況下,這使最終器件省去了串行編程步驟,圖2給出了器件的一般框圖。
圖2 ENC624J600的框圖
3、外部數(shù)據(jù)存儲(chǔ)器FM1808
FM1808是基于鐵電存儲(chǔ)器原理制造的并行接口256Kbit鐵電存儲(chǔ)器,F(xiàn)M1808的主要特性如下:采用先進(jìn)的鐵電技術(shù)制造;存儲(chǔ)容量為256Kbit;讀寫壽命為100億次;掉電數(shù)據(jù)可保存10年;寫數(shù)據(jù)無延時(shí);存取時(shí)間為70ns;低功耗,工作電流為25mA,待機(jī)電流僅為20uA;采用單5V工作電壓;工作溫度范圍為-40℃~+85℃;具有特別優(yōu)良的防潮濕、防電擊及抗震性能;與SRAM或并行EEPROM管腳兼容。
二、硬件電路設(shè)計(jì)
1、AT89S52與以太網(wǎng)控制器連接電路的設(shè)計(jì)
本系統(tǒng)里,P0口被作為低8位地址/數(shù)據(jù)復(fù)用,當(dāng)作數(shù)據(jù)線使用時(shí)用來連接NC624J600的8位數(shù)據(jù)接口。當(dāng)作為地址線使用時(shí),為了給ENC624J600提供15位地址的低8位,要采用復(fù)用技術(shù),對(duì)地址和數(shù)據(jù)進(jìn)行分離。因此P0口連接到74ls373的D0~D7,把低8位地址暫存,隨后有地址鎖存器的O0~O7給ENC624J600提供15位地址的低8位,而高7位由P2口通過74ls245提供,如圖3所示。
要使與單片機(jī)的接口具有高度的靈活性,ENC624J600器件提供了兩種選擇:基于串行外設(shè)接口(SPI)標(biāo)準(zhǔn)的串行接口和靈活的8/16位并行從端口接口。在任何給定時(shí)間只能使用一個(gè)接口。本課題中,AT89S52單片機(jī)和ENC624J600的連接選擇PSP接口,如圖3所示。要選擇PSP接口,則在上電時(shí)通過INT/ SPISEL引腳上的SPISEL功能由硬件選擇I/O接口。要完成此操作,需在向器件供電且器件退出上電復(fù)位狀態(tài)后將施加到該引腳的電平約鎖存1至10μs。如果SPISEL被鎖存在邏輯高電平狀態(tài),將使能串行接口。如果SPISEL被鎖存在邏輯低電平狀態(tài),則使能PSP接口。
圖3 AT89S52與以太網(wǎng)控制器連接電路的設(shè)計(jì)
2、AT89S52和與外部擴(kuò)展存儲(chǔ)器FM1808的電路設(shè)計(jì)
AT89S52與FM1808的連接與AT89S52與NC624J600的連接類似,P0口被作為低8位地址/數(shù)據(jù)復(fù)用,當(dāng)作數(shù)據(jù)線使用時(shí)用來連接FM1808的8位數(shù)據(jù)。當(dāng)作為地址線使用時(shí),采用復(fù)用技術(shù),對(duì)地址和數(shù)據(jù)進(jìn)行分離,給FM1808提供15位地址的低8位,而高7位由P2口通過74ls245提供,如圖4所示。
圖4 AT89S52和與外部擴(kuò)展存儲(chǔ)器FM1808的電路設(shè)計(jì)
3、電源電路設(shè)計(jì)
電源模塊是一塊電路板最為基本的組成部分,只有穩(wěn)定可靠的電源為板上芯片供電才能夠保證各功能模塊的正常工作,因此在電源模塊的設(shè)計(jì)時(shí)首先應(yīng)該初步計(jì)算電路板所有元件的功耗,然后在保證功耗的前提下選擇相應(yīng)的芯片進(jìn)行直流電源模塊設(shè)計(jì),盡量做到體積小,重量輕;性價(jià)比合理;能長期穩(wěn)定、可靠地工作。
本適配器所需要的電源有3.3V。系統(tǒng)需要3.3V電源供電的芯片以太網(wǎng)控制器等??紤]到系統(tǒng)可能工作于高速通信模式,消耗電流會(huì)非常大,所以選用1片UC385芯片,每片UC385輸出電流可達(dá)800mA,可以完全滿足系統(tǒng)的需求。具體電路如圖5所示 。
圖5 電源模塊設(shè)計(jì)
三、軟件部分設(shè)計(jì)
1、主函數(shù)
上電先查詢ARP,若未獲取MAC,則發(fā)送ARP請(qǐng)求。若有新的數(shù)據(jù),若TCP應(yīng)答沒有完成,則應(yīng)答TCP,完成TCP三次握手。然后根據(jù)請(qǐng)求類型響應(yīng)HTTP。
2、TCP應(yīng)答部分
1) 三次握手階段
所謂三次握手(Three-way Handshake),是指建立一個(gè)TCP連接時(shí),需要客戶端和服務(wù)器總共發(fā)送3個(gè)包。三次握手的目的是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換 TCP 窗口大小信息。
圖6 三次握手(Three-way Handshake)
第一次握手:客戶端發(fā)送一個(gè)TCP的SYN標(biāo)志位置1的包指明客戶打算連接的服務(wù)器的端口,以及初始序號(hào)X,保存在包頭的序列號(hào)(Sequence Number)字段里。
圖7 第一次握手
第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時(shí),將確認(rèn)序號(hào)(Acknowledgement Number)設(shè)置為客戶的ISN加1以。即X+1。
第三次握手,客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0,ACK標(biāo)志位為1.并且把服務(wù)器發(fā)來ACK的序號(hào)字段+1,放在確定字段中發(fā)送給對(duì)方。并且在數(shù)據(jù)段放寫ISN的+1
圖9 第三次握手
其實(shí)在握手和結(jié)束時(shí)確認(rèn)號(hào)應(yīng)該是對(duì)方序列號(hào)加1,傳輸數(shù)據(jù)時(shí)則是對(duì)方序列號(hào)加上對(duì)方攜帶應(yīng)用層數(shù)據(jù)的長度。
在傳輸TCP分包的過程中也是需要發(fā)送一分包,確認(rèn)一分包的,而TCP確認(rèn)包只有54字節(jié),就是只有頭部信息。因此在傳輸TCP分包序列號(hào)一直不變,確認(rèn)號(hào)按發(fā)送數(shù)據(jù)的長度遞增即可。
3、 HTTP
1)請(qǐng)求
連接成功建立后,開始向web服務(wù)器發(fā)送請(qǐng)求,這個(gè)請(qǐng)求一般是GET或POST命令(POST用于FORM參數(shù)的傳遞)。GET命令的格式為:GET 路徑/文件名 HTTP/1.0文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本?,F(xiàn)在可以發(fā)送GET命令:GET /mytest/index.html HTTP/1.0,
2)應(yīng)答
web服務(wù)器收到這個(gè)請(qǐng)求,進(jìn)行處理。從它的文檔空間中搜索子目錄mytest的文件index.html。如果找到該文件,Web服務(wù)器把該文件內(nèi)容傳送給相應(yīng)的Web瀏覽器。為了告知瀏覽器,Web服務(wù)器首先傳送一些HTTP頭信息,然后傳送具體內(nèi)容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個(gè)空行分開。常用的HTTP頭信息有:
① HTTP 1.0 200 OK 這是Web服務(wù)器應(yīng)答的第一行,列出服務(wù)器正在運(yùn)行的HTTP版本號(hào)和應(yīng)答代碼。代碼“200 OK”表示請(qǐng)求完成。
② MIME_Version:1.0 它指示MIME類型的版本。
③ content_type:類型 這個(gè)頭信息非常重要,它指示HTTP體信息的MIME類型。如:content_type:text/html指示傳送的數(shù)據(jù)是HTML文檔。
④ content_length:長度值 它指示HTTP體信息的長度(字節(jié))。
3)關(guān)閉連接
當(dāng)應(yīng)答結(jié)束后,Web瀏覽器與Web服務(wù)器必須斷開,以保證其它Web瀏覽器能夠與Web服務(wù)器建立連接。
4、提交表單GET/POST
GET請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中),以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如:login.acTIon?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號(hào)以16進(jìn)制表示的ASCII。
POST把提交的數(shù)據(jù)則放置在是HTTP包的包體中。在FORM(表單)中,Method默認(rèn)為“GET”。
本文中登錄時(shí)提交表單數(shù)據(jù)采用的是POST方式,而提交控制信息表單時(shí)用的是GET。以下是用抓包的方式明顯看出他們的不同之處。
圖10 POST方式
圖11 GET方式
圖12 GET方式是提交的數(shù)據(jù)直接放在URL中了
5、總體軟件設(shè)計(jì)
AT89S52單片機(jī)首先對(duì)ENC624J600進(jìn)行初始化,首先應(yīng)查詢ESTAT寄存器的CLKRDY位,確保在配置MAC和PHY寄存器前有足夠的延時(shí);PHY寄存器用來設(shè)置通信模式;編程ERXST和ERXND指針對(duì)接收緩沖器進(jìn)行初始化,當(dāng)編程ERXST指針時(shí),相同的值會(huì)自動(dòng)更新ERXWRPT寄存器,接收硬件將從ERXWRPT中的地址開始寫入已收到的數(shù)據(jù),為跟蹤接收的數(shù)據(jù),ERXRDPT寄存器也需要用相同的值編程;為了能最大限度地降低主控制器的處理工作量,ENC624J600配備了不同的過濾器,可自動(dòng)拒絕不需要的數(shù)據(jù)包,所有的過濾器都由ERXFCON寄存器進(jìn)行配置,可以使用ANDOR位對(duì)幾個(gè)過濾器的測(cè)試結(jié)果作邏輯/與0或邏輯/或0運(yùn)算;由于未被用作接收緩沖器的存儲(chǔ)空間都作為發(fā)送緩沖器,所以不需要對(duì)發(fā)送緩沖器進(jìn)行特定的初始化,通常將存儲(chǔ)空間分配為大的接收緩沖器空間和較小的接收存儲(chǔ)空間。
在初始化完成后,即進(jìn)入主循環(huán)程序,單片機(jī)將反復(fù)檢測(cè)ENC624J600是否接收到以太網(wǎng)幀(或者數(shù)據(jù)緩沖區(qū)B中有數(shù)據(jù)需要發(fā)送),當(dāng)有數(shù)據(jù)接收(或者發(fā)送)時(shí)則根據(jù)標(biāo)志位進(jìn)行相應(yīng)的子函數(shù)處理,將數(shù)據(jù)存入數(shù)據(jù)緩沖區(qū)(或者發(fā)送至以太網(wǎng)上)。主程序流程如圖13所示。