您的位置 首页 知识

根据ARM的W5100底层驱动规划

引言嵌入式操作系统的引入大大提高了嵌入式系统的功能,方便了嵌入式应用软件的设计,但同时也占用了宝贵的嵌入式资源。嵌入式操作系统大多…

导言

嵌入式操作体系的引进大大进步了嵌入式体系的功用,便利了嵌入式运用软件的规划,但一起也占用了名贵的嵌入式资源。

嵌入式操作体系大多选用组件化、模块化的规划思维,以搭积木的办法经过互连结构软件,因而是可装备的。可是我们操作体系的多样性,不同操作体系供给的装备办法悬殊且繁简纷歧。而我们硬件渠道的多样性,即便是相同的操作体系,其运用装备也有不同。结果是,运用程序开发者有必要了解不同的硬件渠道和操作体系才干进行有用的运用开发,增加了运用开发的难度。特别是网络化嵌入式运用一般出现在比较大型的项目中,杂乱度和难度大大增加。因而,进步网络化嵌入式运用产品质量、缩短开发周期、下降开发本钱是开发人员面对的迫切要求。

1 开发形式计划挑选

面向目标的办法、规划形式的思维是当时完结软件模块化、进步软件可复用性的最优办法。面向目标编程言语、组件和构架是被广泛认可的、用以下降软件本钱并进步软件质量的技能。

面向目标的首要优点在于它着重模块性和可扩展性,将易变的完结细节封装在安稳的接口后边,增强了软件的可复用性。可是,在现在的嵌入式实时体系中选用面向目标的办法进行上层软件的规划还有许多困难。最首要的,便是底层实时操作体系没有供给有力支撑,即便上层软件牵强选用了面向目标的办法,代码的模块化、可移植性、可复用性也难有进步。

因而,为了防止选用传统操作体系的开发形式带来杂乱问题,本文选用一种自界说的裸机开发形式。该形式防止了不同操作体系渠道改动带来杂乱的问题。其创立项目进程没有杂乱的裁剪,只要依据需求增加相关驱动和编写恰当运用层代码。即便是硬件渠道的改动,也仅仅依据硬件装备不同改动其条件编译罢了。

2 自界说裸机开发形式

自界说开发形式下的运用软件体系结构如图1所示。该体系结构包括管理层、运用层、控件层、虚设备层和实设备层。其间管理层处于相似于操作体系中“内核”的位置,为其他层的管理者。

图1
自界说开发形式下的运用软件体系结构
跟PC机上的Windows运用软件相似,运用层是由一个或许多个窗口组成的,有可视窗口和不行视窗口。其间各个窗口中又包括一个或许多个控件。控件为窗口供给各种服务,由设备层供给支撑。在控件层和实设备层中心有一个虚设备层。
依据设备功用的杂乱程度,虚设备分为简略的虚设备和复合虚设备。实设备分为简略的实设备和复合实设备。其间复合设备是由简略设备组合而成。
从类的联系看,虚设备层便是含有虚函数的基类,该函数一般没有完结,仅仅声明晰接口,实设备层便是从该基类承继下来的,详细完结是由该实设备层来完结。我们接口的安稳性,这就确保了底层硬件改动时,运用层的程序简直能够没有改动或许改动甚小。
3
自界说开发形式下的W5100驱动编写
3.1
接口电路阐明
本驱动规划选用W5100串行SPI接口。SPI接口形式只需求4个引脚进行数据通讯,分别为SCLK、/SS(SPI从形式挑选输入引脚,低电平有用)、MOSI、MISO。W5100
的SPI_EN 引脚高电平一共SPI
使能,/RESET引脚低电平完结W5100芯片的复位。本项目挑选的MCU芯片为LPC2138,其间W5100与LPC2138对应引脚连线如表1所列。
表1 LPC2138与W5100对应引脚连线阐明

3.2 W5100驱动剖析
本驱动开发环境为:CodeWarrior for ARM Developer Suite
V1.2。
在自界说开发形式中,前期编写好的驱动类有引脚类、SPI类、外部中止类,便是所谓简略设备。这些类及其头文件的详细介绍略——编者注。
在运用W5100前需求操作其/SS引脚,选中W5100芯片SPI从形式。初度装备或许重新装备W5100相关参数前,需求操作其/RESET引脚,让一切本来装备复位。装备W5100相关参数是经过SPI读写操作来完结的。
W5100从网络上接纳了一个数据包后,会让其/INT引脚从高电平变为低电平。在本项目中,把该引脚跟LPC2138的外部中止1引脚相连,假如舱位了外部中止1,那么就触发一个外部中止。该外部中止服务晒干应当有完结LPC2138拜访W5100,并读取W5100晒干接纳到的数据包的功用。LPC2138获取W5100晒干的数据包,有必要经过SPI读写操作的合作才干完结。
归纳上面的剖析,该W5100驱动应当是由引脚类、外部中止类、SPI操作类互相合作完结,因而W5100驱动是一个复合设备。
3.3
W5100实设备驱动编写
本驱动针对W5100选用UDP协议进行网络通讯功用来编写。

首要一切实设备都有必要从一个虚设备下承继下来。创立一个名为Ip_NetWork_Virtual_Device网络虚设备,其部分头文件略——编者注。
我们网络通讯运用的芯片有多种,可是无论是哪种芯片,完结的功用都离不开网络包的读和写。因而在该虚类里的声明都是共用的功用。基类晒干含有虚函数,便是声明晰接口,可是没有详细的完结,详细的完结由其详细的实设备来完结。在承继中,假如基类和派生类中界说了同名的成员函数,当用基类指针指向公有派生类的目标后,能够运用虚函数来完结经过基类指针找到相应的派生类成员函数[11]。
W5100的实设备NetWork_W5100类的部分头文件略——编者注。
3.4
W5100实设备驱动阐明
3.4.1 虚设备类指针
在W5100实设备头文件中有:
Spi_Virtual_Device*
SpiPort;
OutEint_Virtual_Device* IntDevice;
PinDevice_Virtual_Device *
W5100_Cs;
PinDevice_Virtual_Device *
W5100_RESET;
我们W5100实设备需求几个简略设备合作来完结其功用,因而规划W5100实设备驱动具有这些简略设备的指针,能够看出这些指针是指向简略虚设备目标的指针。
声明为指向基类目标的指针,当它指向公有派生类目标时,能够运用它来直接拜访派生类中从基类承继下来的成员,不能直接拜访公有派生类中特定的成员。
选用面向目标中形式编程规律中的依靠回转规律:依靠笼统而不依靠详细[12]。
在main.cpp首要声明如下的实设备,如下:

OutInt_2138 NetOutInt; //外部中止类实设备目标
NetWork_W5100
Net5100;//W5100实设备目标
Spi0_Driver_Lpc Spi0;//SPI实设备目标
Pin_LPC2138 PIN023;
//引脚实设备目标
Pin_LPC2138 PIN031;
//引脚实设备目标
接着在main.cpp选用如下代码完结Net5100和简略设备NetOutInt、Spi0、PIN023、PIN031等的相关:
NetOutInt.WorkModel=Fall_Eage;//一共下降沿触发
NetOutInt.SubDeviceName=Eint1;//一共运用外部中止1
NetOutInt.Ini();
NetOutInt.Father=&Net5100;
Net5100.SpiPort=&Spi0;//设置Spi0和SpiPort指针相关
Net5100.W5100_Cs=&
PIN023; //设置片选引脚相关
Net5100.W5100_RESET=& PIN031;
//设置复位引脚相关
在“Net5100.SpiPort=&Spi0”中SpiPort是指向某基类目标的指针,Spi0是该基类的派生类目标,该查办完结把该指针指向其派生类目标。因而就能够运用该指针直接拜访该公有派生类从基类承继来的成员。相同,能够运用W5100_Cs和W5100_RESET等基类目标指针直接拜访该基类的派生类——Pin_LPC2138类从基类承继下来的成员,即引脚的操作函数等。
在NetWork_W5100中有W5100_Send_Receive_Data函数便是运用这个技能,该函数如下:
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类目标能完结SPI读写操作,是因为其具有一个SPI虚设备的指针。同理,能完结对引脚操作是因为其具有一个引脚虚设备的指针。
3.4.2
外部中止实设备和W5100实设备相关
NetOutInt是一个外部中止类目标,运用前首要对该目标进行初始化,其间代码“NetOutInt.SubDeviceName=Eint1”一共该类目标和外部中止1产生了绑定。
在本项目测验中,W5100从网络接纳到一个数据包后触发了一个外部中止1中止。该W5100实设备类目标Net5100感知该事情,然后对该事情进行处理,接着把该音讯发布给其所支撑的控件。
main.cpp中有“NetOutInt.Father=&Net5100;”,其间Father是一个指针,该指针来历如下:
class
Object{
public:
……
Object
*Father;
……
};
我们一切设备类都是从该类直接承继下来,所以都具有这个Father指针。
“NetOutInt.Father=&Net5100;”的意图是把Net5100目标地址赋给该指针,因而该指针就指向Net5100,阐明NetOutInt具有一个指向Net5100的指针。main.cpp中,外部中止1的服务程序代码如下:
void
__irq
IRQ_Eint1(){
NetOutInt.HardInt(Null);
V%&&&&&%VectAddr=0×00;
NetOutInt.ClearInt();
}
“NetOutInt.HardInt(Null);”其本质便是调用到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);”即中止服务最终把该作业交给Father指针指向的Net5100,接着该目标调用了其Message函数。NetWork_W5100类的Message函数伪代码如下:
void
NetWork_W5100::Message(MessageBody SystemMsg){
if
Socket3
SelectSocket(3);
if Socket2
SelectSocket(2);
if
Socket1
SelectSocket(1);
else
SelectSocket(0);
};
其间NetWork_W5100类的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);
//向支撑控件发送音讯
}
NetWork_Write(address,0xFF);//铲除一切的中止
}
可见,W5100驱动最终把网络接纳到数据包作为一个音讯发给其所支撑的上层控件。
4
W5100驱动测验
4.1 测验计划
在PC机上,运用网络测验东西TCP/UDP
Socke调试东西V2.2,经过网络向W5100的终端发送一个数据包。当该终端接纳到该数据包后,把该包往PC机终端发送。假如发送和接纳的数据包共同,阐明通讯测验成功。
4.2
测验进程
PC机端的IP地址为192.168.1.103,某端口号为9000。W5100自身地址设置为192.168.1.101,某端口号为9000。PC机往W5100终端发送数据包,在如图2所示操作界面的数据发送窗口输入“Hello,
This is a happy word!”字符串后,点击“发送数据”,在操作界面的数据接纳窗口接纳到“Hello, This is a happy
word!”,并且在操作界面上方显现“对方IP:192.168.1.101,对方端口:9000”,这跟W5100终端设置是共同的,阐明两边的通讯成功。

结语
W5100驱动的创立进程非常杂乱,可是关于编写好的驱动,运用者只需求了解该接口运用的阐明,而不必关怀其杂乱的内部完结细节。假如其他项目需求用到W5100,只需求把该驱动增加到该项目中即可,然后完结驱动的复用,防止重复的作业,缩短项目开发周期。假如下次要运用W5100驱动的其他功用,如TCP协议通讯,只需求在本来驱动上增加相应的函数即可,因而保护起来愈加便利。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/265742.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部