基于ARM的W5100底层驱动设计

发布者:baiyuguoji最新更新时间:2016-05-26 来源: eefocus关键字:ARM的  W5100  底层驱动 手机看文章 扫描二维码
随时随地手机看文章
引言

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

嵌入式操作系统大多采用组件化、模块化的设计思想,以搭积木的方式通过互连构造软件,因而是可配置的。但是由于操作系统的多样性,不同操作系统提供的配置方式迥异且繁简不一。而由于硬件平台的多样性,即使是相同的操作系统,其应用配置也有差别。结果是,应用程序开发者必须熟悉不同的硬件平台和操作系统才能进行有效的应用开发,增加了应用开发的难度。特别是网络化嵌入式应用一般出现在比较大型的项目中,复杂度和难度大大增加。因此,提高网络化嵌入式应用产品质量、缩短开发周期、降低开发成本是开发人员面临的迫切要求。

1 开发模式方案选择

面向对象的方法、设计模式的思想是当前实现软件模块化、提高软件可复用性的最优方法。面向对象编程语言、组件和构架是被广泛认可的、用以降低软件成本并提高软件质量的技术。

面向对象的主要好处在于它强调模块性和可扩展性,将易变的实现细节封装在稳定的接口后面,增强了软件的可复用性。但是,在目前的嵌入式实时系统中采用面向对象的方法进行上层软件的设计还有很多困难。最主要的,就是底层实时操作系统没有提供有力支持,即使上层软件勉强采用了面向对象的方法,代码的模块化、可移植性、可复用性也难有提高。

因此,为了避免采用传统操作系统的开发模式带来复杂问题,本文采用一种自定义的裸机开发模式。该模式避免了不同操作系统平台改变带来复杂的问题。其创建项目过程没有复杂的裁剪,只有根据需要添加相关驱动和编写适当应用层代码。即使是硬件平台的改变,也只是根据硬件配置不同改变其条件编译而已。

2 自定义裸机开发模式

自定义开发模式下的应用软件体系结构如图1所示。该体系结构包含管理层、应用层、控件层、虚设备层和实设备层。其中管理层处于类似于操作系统中“内核”的地位,为其他层的管理者。

可复用的基于ARM的W5100底层驱动设计

图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对应引脚连线说明

可复用的基于ARM的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);
VICVectAddr=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协议通信,只需要在原来驱动上添加相应的函数即可,因此维护起来更加方便。

关键字:ARM的  W5100  底层驱动 引用地址:基于ARM的W5100底层驱动设计

上一篇:基于ARM的SoC设计入门
下一篇:ARM嵌入式LINUX设备驱动设计入门学习

推荐阅读最新更新时间:2024-03-16 14:54

基于ARM uCLinux网络控制系统设计与实现
引言 随着网络和通信技术的发展,嵌入式系统现已进入高速发展阶段。并在社会各个领域得到了广泛的应用。本文介绍了一种采用ARM+uCLinux作为开发平台。实现基于TCP/IP的远程系统监控.从而取代传统单片机来实现数据采集、预处理和通信功能;并依靠互联网将数据向上位机传送,同时支持远端客户对设备进行远程控制,从而实现远程监控功能的具体方法。 1 系统平台的构建 本系统由嵌入式平台服务器、前端控制器、前端传感器、客户端和配置PC组成。开发时可通过配置PC来下载系统和应用软件。嵌入式系统平台能够收集现场数据。并传送到远端客户机,之后由远端客户机对数据进行处理,接着发送控制信号给系统服务器,以便通过前端控制器对设备进行远程控制。其系
[网络通信]
基于ARM7微处理器中文液晶显示技术
1 引言 液晶显示屏LCD作为一种功耗低、体积小、无辐射的显示器件,近几年被广泛应用于各式各样的嵌入式电子产品中,LCD可分为段位式、字符式和点阵式三种,其中,段位式LCD和字符式LCD只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求,而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动动画功能,分区开窗口、反转、闪烁等功能,用途十分广泛,为了简化液晶 显示电路的设计和应用,生产厂家通常将液晶显示单元、显示控制器,显示内存和显示驱动电路等装配在一起,做成液晶显示模块LCD Module(LCM) 。LCM对外提供标准数据和控制接口以及控制指令,本文以ATM12864C为例,
[应用]
高通真的放弃服务器芯片最受打击可能是Arm|一句话点评
1、紫光国芯正式更名“紫光国微” 2018年5月8日集微网晚间消息,紫光国芯股份有限公司于2018年3月28日召开的第六届董事会第十三次会议和2018年4月19日召开的2017年度股东大会审议通过了《关于公司名称变更并修改 公司章程 的议案》,决定将公司名称由“紫光国芯股份有限公司”变更为“紫光国芯微电子股份有限公司”。 集微点评:之前一直盛传紫光会将长江存储等业务注入上市公司,现在看来单独上市概率可能更大。 2、半导体产业想赢,就必须打赢人才争夺战! 在高度信息化的大环境下,对人才能力的要求也越来越高,尤其在高科技领域的核心人才,更是全球最稀缺的资源,在芯片领域更是如此!日系厂商进入挖角模式,中国国内对于人才的需求也极为旺盛,并
[手机便携]
基于ARM系统构件块有助于优化整个MCU开发周期
如今,对成本敏感的微控制器市场需要可使产品功能紧密地适合应用的高层次系统集成。PCB尺寸、电源消耗和材料成本的压力也需要比以往更高层次的系统集成。此外,稳压器、电压不足检测器、上电复位等电源接口与晶振/PLL、系统定时器等定时单元一样,都需要在片内得到实现。 为紧密地适合应用,存储器、外围设备与连接之间的正确组合非常重要。对存储器的需求在类型和密度上是不同的。小容量的引导ROM、RAM工作区以及用于存储软件和参考数据的片上闪存都是必需的,但不同应用对密度需求不一样。NAND或NOR闪存、SDRAM等各种存储器类型和密度都需要高效率的外部接口。在连接性方面,微控制器一般需要提供USB、以太网、CAN、SPI或USART总线连
[单片机]
基于<font color='red'>ARM</font><font color='red'>的</font>系统构件块有助于优化整个MCU开发周期
Windows下基于ADS+J-Link ARM开发环境搭建
在一般ARM编程教学和实验环境里,一般采用 ADS加+并口转Jtag板+H-Jtag的开发环境。但是这种方法最大缺点是需要机器上有一个并口。现在无论PC还是笔记本都很难有并口,因此采用USB接口调试器就大行其道。其中Segger的JLink是比较有名和方便的调试器。 ADS 1.2 ,可以如下链接下载 http://esoft.mcu123.com/MCU123_temp_0080309@/ARM/ads1.2.rar 硬件可以参考这个 http://s.click.taobao.com/t_1?i=qz0qHj7qltKQRQ%3D%3D&p=mm_11796696_0_0&n=11 一.
[单片机]
Windows下基于ADS+J-Link <font color='red'>的</font><font color='red'>ARM</font>开发环境搭建
ARM地址重映射通俗解释
ARM芯片的地址重映射 映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系。 我们可以把存储器看成一个具有输出和输入口的黑盒子。如下图所示,输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。 图1 普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。如下图,CPU读取0x00000000地址上存储单元的
[单片机]
<font color='red'>ARM</font>地址重映射<font color='red'>的</font>通俗解释
QTE及QPE在ARM板上移植
  所需软件工具包:   tmake -1.11.tar.gz(tmake-1.13)   qt-embedded-2.3.7.tar.gz   qtopia-free-1.7.0.tar.gz   qt-x11-free-2.3.2   (注意:qt/x11版本必须要比qte的版本要老)   利用的交叉编译工具为cross-2.95.3   交叉编译环境的建立   1.建立tmake工具包   在host 上的/home/下建立   # tar –xzf tmake-1.11.tar.gz   2.建立qt-x11-free-2.3.2得到uic和designer工具   # cd /home/   # t
[单片机]
基于ARM/FPGA高速多通道同步数据采集解决方案
  大多数的勘探、观测工作都是在严苛的环境中进行的,对数据的准确性、实时性都有着较高的要求,并且大多情况下要求多参数同步测量。北京恒颐针对勘探、测控等行业的特点,推出了基于ARM+FPGA的低功耗、高速率、高精度、多通道同步数据采集方案,可以通过监测者的要求完成多通道数据的同步采集并实现实时的网络传输。   ◆ 应用场合   物探分析领域   天然气、石油等地下勘探领域   观测技术领域(地震波、频谱分析)   电力调度系统   ◆ 系统架构   恒颐高速同步数据采集方案,功能特点如下:   1)通过系统接口直接与采集终端通讯,完成工业现场的多通道模拟量、开关量的数据采集与A/D转换,实现对数据采集终端的控制;
[单片机]
基于<font color='red'>ARM</font>/FPGA<font color='red'>的</font>高速多通道同步数据采集解决方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved