<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于A(yíng)RM的W5100底層驅動(dòng)設計

基于A(yíng)RM的W5100底層驅動(dòng)設計

作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò ) 收藏
引言

嵌入式操作系統的引入大大提高了嵌入式系統的功能,方便了嵌入式應用軟件的設計,但同時(shí)也占用了寶貴的嵌入式資源。

本文引用地址:http://dyxdggzs.com/article/201611/318470.htm

嵌入式操作系統大多采用組件化、模塊化的設計思想,以搭積木的方式通過(guò)互連構造軟件,因而是可配置的。但是由于操作系統的多樣性,不同操作系統提供的配置方式迥異且繁簡(jiǎn)不一。而由于硬件平臺的多樣性,即使是相同的操作系統,其應用配置也有差別。結果是,應用程序開(kāi)發(fā)者必須熟悉不同的硬件平臺和操作系統才能進(jìn)行有效的應用開(kāi)發(fā),增加了應用開(kāi)發(fā)的難度。特別是網(wǎng)絡(luò )化嵌入式應用一般出現在比較大型的項目中,復雜度和難度大大增加。因此,提高網(wǎng)絡(luò )化嵌入式應用產(chǎn)品質(zhì)量、縮短開(kāi)發(fā)周期、降低開(kāi)發(fā)成本是開(kāi)發(fā)人員面臨的迫切要求。

1 開(kāi)發(fā)模式方案選擇

面向對象的方法、設計模式的思想是當前實(shí)現軟件模塊化、提高軟件可復用性的最優(yōu)方法。面向對象編程語(yǔ)言、組件和構架是被廣泛認可的、用以降低軟件成本并提高軟件質(zhì)量的技術(shù)。

面向對象的主要好處在于它強調模塊性和可擴展性,將易變的實(shí)現細節封裝在穩定的接口后面,增強了軟件的可復用性。但是,在目前的嵌入式實(shí)時(shí)系統中采用面向對象的方法進(jìn)行上層軟件的設計還有很多困難。最主要的,就是底層實(shí)時(shí)操作系統沒(méi)有提供有力支持,即使上層軟件勉強采用了面向對象的方法,代碼的模塊化、可移植性、可復用性也難有提高。

因此,為了避免采用傳統操作系統的開(kāi)發(fā)模式帶來(lái)復雜問(wèn)題,本文采用一種自定義的裸機開(kāi)發(fā)模式。該模式避免了不同操作系統平臺改變帶來(lái)復雜的問(wèn)題。其創(chuàng )建項目過(guò)程沒(méi)有復雜的裁剪,只有根據需要添加相關(guān)驅動(dòng)和編寫(xiě)適當應用層代碼。即使是硬件平臺的改變,也只是根據硬件配置不同改變其條件編譯而已。

2 自定義裸機開(kāi)發(fā)模式

自定義開(kāi)發(fā)模式下的應用軟件體系結構如圖1所示。該體系結構包含管理層、應用層、控件層、虛設備層和實(shí)設備層。其中管理層處于類(lèi)似于操作系統中“內核”的地位,為其他層的管理者。

圖1
自定義開(kāi)發(fā)模式下的應用軟件體系結構
跟PC機上的Windows應用軟件類(lèi)似,應用層是由一個(gè)或者多個(gè)窗口組成的,有可視窗口和不可視窗口。其中各個(gè)窗口中又包含一個(gè)或者多個(gè)控件??丶榇翱谔峁└鞣N服務(wù),由設備層提供支撐。在控件層和實(shí)設備層中間有一個(gè)虛設備層。
根據設備功能的復雜程度,虛設備分為簡(jiǎn)單的虛設備和復合虛設備。實(shí)設備分為簡(jiǎn)單的實(shí)設備和復合實(shí)設備。其中復合設備是由簡(jiǎn)單設備組合而成。
從類(lèi)的關(guān)系看,虛設備層就是含有虛函數的基類(lèi),該函數一般沒(méi)有實(shí)現,只是聲明了接口,實(shí)設備層就是從該基類(lèi)繼承下來(lái)的,具體實(shí)現是由該實(shí)設備層來(lái)完成。由于接口的穩定性,這就保證了底層硬件改變時(shí),應用層的程序幾乎可以沒(méi)有改變或者改變甚小。
3
自定義開(kāi)發(fā)模式下的W5100驅動(dòng)編寫(xiě)
3.1
接口電路說(shuō)明
本驅動(dòng)設計采用W5100串行SPI接口。SPI接口模式只需要4個(gè)引腳進(jìn)行數據通信,分別為SCLK、/SS(SPI從模式選擇輸入引腳,低電平有效)、MOSI、MISO。W5100
的SPI_EN 引腳高電平表示SPI
使能,/RESET引腳低電平實(shí)現W5100芯片的復位。本項目選擇的MCU芯片為L(cháng)PC2138,其中W5100與LPC2138對應引腳連線(xiàn)如表1所列。
表1 LPC2138與W5100對應引腳連線(xiàn)說(shuō)明

3.2 W5100驅動(dòng)分析
本驅動(dòng)開(kāi)發(fā)環(huán)境為:CodeWarrior for ARM Developer Suite
V1.2。
在自定義開(kāi)發(fā)模式中,前期編寫(xiě)好的驅動(dòng)類(lèi)有引腳類(lèi)、SPI類(lèi)、外部中斷類(lèi),就是所謂簡(jiǎn)單設備。這些類(lèi)及其頭文件的具體介紹略——編者注。
在使用W5100前需要操作其/SS引腳,選中W5100芯片SPI從模式。初次配置或者重新配置W5100相關(guān)參數前,需要操作其/RESET引腳,讓所有原來(lái)配置復位。配置W5100相關(guān)參數是通過(guò)SPI讀寫(xiě)操作來(lái)完成的。
W5100從網(wǎng)絡(luò )上接收了一個(gè)數據包后,會(huì )讓其/INT引腳從高電平變?yōu)榈碗娖?。在本項目中,把該引腳跟LPC2138的外部中斷1引腳相連,如果開(kāi)啟了外部中斷1,那么就觸發(fā)一個(gè)外部中斷。該外部中斷服務(wù)里面應當有實(shí)現LPC2138訪(fǎng)問(wèn)W5100,并讀取W5100里面接收到的數據包的功能。LPC2138獲取W5100里面的數據包,必須通過(guò)SPI讀寫(xiě)操作的配合才能實(shí)現。
綜合上面的分析,該W5100驅動(dòng)應當是由引腳類(lèi)、外部中斷類(lèi)、SPI操作類(lèi)互相配合完成,因此W5100驅動(dòng)是一個(gè)復合設備。
3.3
W5100實(shí)設備驅動(dòng)編寫(xiě)
本驅動(dòng)針對W5100采用UDP協(xié)議進(jìn)行網(wǎng)絡(luò )通信功能來(lái)編寫(xiě)。

首先所有實(shí)設備都必須從一個(gè)虛設備下繼承下來(lái)。創(chuàng )建一個(gè)名為Ip_NetWork_Virtual_Device網(wǎng)絡(luò )虛設備,其部分頭文件略——編者注。
由于網(wǎng)絡(luò )通信應用的芯片有多種,但是無(wú)論是哪種芯片,實(shí)現的功能都離不開(kāi)網(wǎng)絡(luò )包的讀和寫(xiě)。因此在該虛類(lèi)里的聲明都是共用的功能?;?lèi)里面含有虛函數,就是聲明了接口,但是沒(méi)有具體的實(shí)現,具體的實(shí)現由其具體的實(shí)設備來(lái)完成。在繼承中,如果基類(lèi)和派生類(lèi)中定義了同名的成員函數,當用基類(lèi)指針指向公有派生類(lèi)的對象后,可以使用虛函數來(lái)實(shí)現通過(guò)基類(lèi)指針找到相應的派生類(lèi)成員函數[11]。
W5100的實(shí)設備N(xiāo)etWork_W5100類(lèi)的部分頭文件略——編者注。
3.4
W5100實(shí)設備驅動(dòng)說(shuō)明
3.4.1 虛設備類(lèi)指針
在W5100實(shí)設備頭文件中有:
Spi_Virtual_Device*
SpiPort;
OutEint_Virtual_Device* IntDevice;
PinDevice_Virtual_Device *
W5100_Cs;
PinDevice_Virtual_Device *
W5100_RESET;
由于W5100實(shí)設備需要幾個(gè)簡(jiǎn)單設備配合來(lái)完成其功能,因此設計W5100實(shí)設備驅動(dòng)擁有這些簡(jiǎn)單設備的指針,可以看出這些指針是指向簡(jiǎn)單虛設備對象的指針。
聲明為指向基類(lèi)對象的指針,當它指向公有派生類(lèi)對象時(shí),可以利用它來(lái)直接訪(fǎng)問(wèn)派生類(lèi)中從基類(lèi)繼承下來(lái)的成員,不能直接訪(fǎng)問(wèn)公有派生類(lèi)中特定的成員。
采用面向對象中模式編程法則中的依賴(lài)反轉法則:依賴(lài)抽象而不依賴(lài)具體[12]。
在main.cpp首先聲明如下的實(shí)設備,如下:

OutInt_2138 NetOutInt; //外部中斷類(lèi)實(shí)設備對象
NetWork_W5100
Net5100;//W5100實(shí)設備對象
Spi0_Driver_Lpc Spi0;//SPI實(shí)設備對象
Pin_LPC2138 PIN023;
//引腳實(shí)設備對象
Pin_LPC2138 PIN031;
//引腳實(shí)設備對象
接著(zhù)在main.cpp采用如下代碼完成Net5100和簡(jiǎn)單設備N(xiāo)etOutInt、Spi0、PIN023、PIN031等的關(guān)聯(lián):
NetOutInt.WorkModel=Fall_Eage;//表示下降沿觸發(fā)
NetOutInt.SubDeviceName=Eint1;//表示使用外部中斷1
NetOutInt.Ini();
NetOutInt.Father=&Net5100;
Net5100.SpiPort=&Spi0;//設置Spi0和SpiPort指針關(guān)聯(lián)
Net5100.W5100_Cs=&
PIN023; //設置片選引腳關(guān)聯(lián)
Net5100.W5100_RESET=& PIN031;
//設置復位引腳關(guān)聯(lián)
在“Net5100.SpiPort=&Spi0”中SpiPort是指向某基類(lèi)對象的指針,Spi0是該基類(lèi)的派生類(lèi)對象,該語(yǔ)句實(shí)現把該指針指向其派生類(lèi)對象。因此就可以利用該指針直接訪(fǎng)問(wèn)該公有派生類(lèi)從基類(lèi)繼承來(lái)的成員。同樣,可以利用W5100_Cs和W5100_RESET等基類(lèi)對象指針直接訪(fǎng)問(wèn)該基類(lèi)的派生類(lèi)——Pin_LPC2138類(lèi)從基類(lèi)繼承下來(lái)的成員,即引腳的操作函數等。
在NetWork_W5100中有W5100_Send_Receive_Data函數就是利用這個(gè)技術(shù),該函數如下:
char
NetWork_W5100::W5100_Send_Receive_Data(char dat){
char
i;
W5100_Cs->Clear();
i=SpiPort->SPI_Send_Receive_Data(dat);
W5100_Cs->Set();
return
i;
}
NetWork_W5100類(lèi)對象能實(shí)現SPI讀寫(xiě)操作,是因為其擁有一個(gè)SPI虛設備的指針。同理,能實(shí)現對引腳操作是因為其擁有一個(gè)引腳虛設備的指針。
3.4.2
外部中斷實(shí)設備和W5100實(shí)設備關(guān)聯(lián)
NetOutInt是一個(gè)外部中斷類(lèi)對象,使用前首先對該對象進(jìn)行初始化,其中代碼“NetOutInt.SubDeviceName=Eint1”表示該類(lèi)對象和外部中斷1產(chǎn)生了綁定。
在本項目測試中,W5100從網(wǎng)絡(luò )接收到一個(gè)數據包后觸發(fā)了一個(gè)外部中斷1中斷。該W5100實(shí)設備類(lèi)對象Net5100感知該事件,從而對該事件進(jìn)行處理,接著(zhù)把該消息發(fā)布給其所支撐的控件。
main.cpp中有“NetOutInt.Father=&Net5100;”,其中Father是一個(gè)指針,該指針來(lái)源如下:
class
Object{
public:
……
Object
*Father;
……
};
由于所有設備類(lèi)都是從該類(lèi)間接繼承下來(lái),所以都擁有這個(gè)Father指針。
“NetOutInt.Father=&Net5100;”的目的是把Net5100對象地址賦給該指針,因此該指針就指向Net5100,說(shuō)明NetOutInt擁有一個(gè)指向Net5100的指針。main.cpp中,外部中斷1的服務(wù)程序代碼如下:
void
__irq
IRQ_Eint1(){
NetOutInt.HardInt(Null);
VICVectAddr=0×00;
NetOutInt.ClearInt();
}
“NetOutInt.HardInt(Null);”其本質(zhì)就是調用到HardInt函數,如下:
void
OutInt_2138::HardInt(Device*
IntDevice){
……
this->Msg.MsgID=Sys_Msg_OutInt;
this->Msg.Parm1=this->SubDeviceName;
this->Father->Message(Msg);
……
}
“this->Father->Message(Msg);”即中斷服務(wù)最后把該工作交給Father指針指向的Net5100,接著(zhù)該對象調用了其Message函數。NetWork_W5100類(lèi)的Message函數偽代碼如下:
void
NetWork_W5100::Message(MessageBody SystemMsg){
if
Socket3
SelectSocket(3);
if Socket2
SelectSocket(2);
if
Socket1
SelectSocket(1);
else
SelectSocket(0);
};
其中NetWork_W5100類(lèi)的SelectSocket函數如下:
void
NetWork_W5100::SelectSocket(char socket){
uint16
address,inttype;
address=COMMON_BASE+0×100*socket+0×0402;
inttype=NetWork_Read(address);

if((inttype&0×04)==0×04){
//接收數據引起中斷
S_UDP_RX_Process(socket,&ReceiveBuffer[0],&ReceiveBuffer[8]);
//從對應的Socket接收數據
Msg.MsgID=Sys_Msg_UdpGetData;
Msg.Msg=&ReceiveBuffer[0];
VclPointer[socket]->Message(Msg);
//向支撐控件發(fā)送消息
}
NetWork_Write(address,0xFF);//清除所有的中斷
}
可見(jiàn),W5100驅動(dòng)最后把網(wǎng)絡(luò )接收到數據包作為一個(gè)消息發(fā)給其所支撐的上層控件。
4
W5100驅動(dòng)測試
4.1 測試方案
在PC機上,利用網(wǎng)絡(luò )測試工具TCP/UDP
Socke調試工具V2.2,通過(guò)網(wǎng)絡(luò )向W5100的終端發(fā)送一個(gè)數據包。當該終端接收到該數據包后,把該包往PC機終端發(fā)送。如果發(fā)送和接收的數據包一致,說(shuō)明通信測試成功。
4.2
測試過(guò)程
PC機端的IP地址為192.168.1.103,某端口號為9000。W5100本身地址設置為192.168.1.101,某端口號為9000。PC機往W5100終端發(fā)送數據包,在如圖2所示操作界面的數據發(fā)送窗口輸入“Hello,
This is a happy word!”字符串后,點(diǎn)擊“發(fā)送數據”,在操作界面的數據接收窗口接收到“Hello, This is a happy
word!”,并且在操作界面上方顯示“對方IP:192.168.1.101,對方端口:9000”,這跟W5100終端設置是一致的,說(shuō)明雙方的通信成功。

結語(yǔ)
W5100驅動(dòng)的創(chuàng )建過(guò)程非常復雜,但是對于編寫(xiě)好的驅動(dòng),應用者只需要了解該接口使用的說(shuō)明,而不用關(guān)心其復雜的內部實(shí)現細節。如果其他項目需要用到W5100,只需要把該驅動(dòng)添加到該項目中即可,從而實(shí)現驅動(dòng)的復用,避免重復的工作,縮短項目開(kāi)發(fā)周期。如果下次要使用W5100驅動(dòng)的其他功能,如TCP協(xié)議通信,只需要在原來(lái)驅動(dòng)上添加相應的函數即可,因此維護起來(lái)更加方便。



關(guān)鍵詞: ARM的W5100底層驅

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>