tag 标签: 复用

相关博文
  • 热度 1
    2016-2-24 19:58
    1063 次阅读|
    0 个评论
      按键和 LED 复用扫描程序 在我们的实际产品开发过程中,为了节省成本,常常会采用按键和 LED 复用,从而达到节省 IO 口的目的。很多刚刚碰到这种情况的工程师,可能会不知道如何处理, PS: 大神请自动略过。下面由我来给大家讲讲按键和 LED 复用 IO 口时,程序该如何处理吧。(上一讲已经讲过,我个人比较喜欢状态机编程,因此这里还是采用状态机编程的方法,来实现按键和 LED 复用扫描功能)。 一、   按键和 LED 复用原理图如下: LEDC 是 LED 灯的 COM 控制端, LED1_K1 和 LED2_K2 是按键和 LED 的复用 IO 口。 扫描过程如下: 1 、上电初始化时,先将 LEDC 、 LED1_K1 和 LED2_K2 设置为推挽输出高; 2 、首先扫描 LED1 和 LED2,LEDC 输出高, LED1_K1 根据系统标志判断, LED1 需要亮,就输出低, LED1 不需要亮,就输出高, LED2 和 LED1 处理一样。 3 、 LED1 和 LED2 扫描完成以后, LEDC 输出低, LED1 和 LED2 输出高,将 LED1_K1 和 LED2_K2 的 IO 口切换为输入状态,并且用一个变量备份一下 LED1 和 LED2 的输出电平状态,以便按键扫描完成后,恢复 LED1 和 LED2 的亮灭状态。 4 、进入按键扫描状态,读取 LED1_K1 和 LED2_K2 引脚的电平状态,读取 IO 口电平完成以后,立即将 LED1_K1 和 LED2_K2 切换为推挽输出低模式,并且恢复步骤 3 中备份的 LED1_K1 和 LED2_K2 的电平状态到 LED1_K1 和 LED2_K2 管脚上。 以上四个步骤就是按键和 LED 复用时,程序的扫描过程,看不懂的话没有关系,大家结合源代码理解,就很清楚了。按键和 LED 复用扫描程序如下: /**********************************************************  * 名称 : void Led2Disp_Scan(void)  * 功能 : led2 和按键扫描函数  * 形参 : 无  * 返回 : 无  * 说明 : 无 注意:当在使用 STM8 单片机编程时,切换 IO 口的输入输出状态时,请将 IO 口配置成低速模式( 2MHz ),要不然在切换 IO 口的输入输出状态时,会触发 IO 口的外部中断,造成程序异常。  **********************************************************/ void Led2Disp_Scan(void) {    static INT8U scan_num = 0;// 扫描状态变量    scan_num++;    switch(scan_num)    {       case 1:// 状态 1 扫描 LED 灯       {         COM1_ON();// 置高 LED 公共端       LedDisp_Process(0,Bit_TyPeDefStructure.led2_disp);// 根据标志位控制 LED2 的亮灭       LedDisp_Process(1,Bit_TyPeDefStructure.led1_disp);// 根据标志位控制 LED1 的亮灭       }       break;       case 2://LED 灯扫描完毕       {         COM1_OFF();// 置低 LED 公共端         PC_ODR_BACK = GPIOC-ODR;// 备份 LED 端口输出寄存器                 LED1_ON();//LED1 和 LED2 引脚置高         LED2_ON();         IO_INPUT();// 切换成输入模式       }       break;       case 12:// 按键扫描一次的时间 12*250us 等于 3ms       {         process_key();// 按键处理函数,看不懂请参考源代码理解,还是看不懂,请阅读我上一篇帖子 “ 基于状态机的按键扫描程序 ”         scan_num = 0;// 按键扫描完成后,回到状态 0 ,继续 LED 灯的扫描       }       break;       default :       break;    } } 以上就是整个扫描过程,注释已经讲解的很清楚了,就不在继续讲了。按键处理函数看不懂,请看我上一篇博文 “ 基于状态机的按键扫描程序 ” 一文。   //main 函数如下: int main(void) {        // 设置内部 16M 晶振为系统时钟        System_Init();////        while (1)        {               IWDG_ReloadCounter();// 清看门狗                             if(fTimer1_250us)// 查询是否到 250us               { Led2Disp_Scan();                      fTimer1_250us = FALSE;//250us 到任务处理完成,清除 250us 到标志               }                   } }   以上程序实现的功能是,短按 K1 , LED1 亮, LED2 灭;短按 K2 , LED1 灭, LED2 亮;长按 K1 两秒, LED1 翻转;长按 K2 两秒, LED2 翻转; K1 和 K2 同时按下 2 秒, LED1 和 LED2 都翻转。附件使用的是 STM8S003F3 单片机编程实现的,大家可以移植到任何平台,不会的可以跟帖回复,我可以和大家共同探讨,具体源代码请查看附件,大家可以安装source insight软件进行阅读。 今天就讲到这里了,有什么疑问,大家可以发站内信给我。  
  • 热度 11
    2015-11-22 15:11
    3135 次阅读|
    7 个评论
    【博客大赛】Allegro实用技巧之模块复用 需求分析:使用Allegro软件进行PCB Layout设计时,当电路图中有很多路相同的模块,使用模块复用的的操作方法,可以显著提高工作效率,同时也可以使PCB布局在整体上显得美观。下面来讲述这个方法 具体方法及说明: 1 如图,两个电路模块,它们在原理图中的电路也是一样的,对于这多个相同的电路模块,只要在PCB中做好其中的一个,则其余相同的模块通过复用的方式,可以快速完成,对于那些复杂的模块,复用的优势会更明显。 2 原理图中导出相同模块的器件信息,然后在放置器件的时候将属于一个模块的器件都放一起,放置好器件之后只需要选择其中一个模块进行布局布线,布好之后选择Setup — Application Mode — Placement Edit,然后框选这个做好的模块,选好之后点击右键,选择Place Replicate Create 3 设置过滤器,将via等信息也添加进来:再选中其他的cline、via以及shape,都选好之后右键Done。如下图所示: 都选好之后右键Done 4 单击一下左键就会出现一个提示保存的窗体,保存的文件是 mdd 格式 ,即模块定义文件,这样一个模块就做好了。 5 点击了place replicate create后,模块的元素会被高亮,也有些不会高亮—没有被选中,此时需要在右侧面板中选中相关的元素,然后再对着模块选择(框选),直到全部选中。via和line是没法选中的。选择其他模块器件,如果少选了,Allegro会把不能匹配到的器件报告出来,如果多选了,则Allegro不会理会那些多出来的器件,只匹配模块文件中器件。 6 点右键,然后done掉命令,点左键,弹出对话框,输入module1.mdd文件的名称。 7利用.mdd文件,进行模块复用;在placement edit 模式下,选中另外一个模块的全部器件,点击右键,如下图?选好之后点击右键,选择Place replicate apply,然后选择刚刚保存的文件名即可,可以看到布局和布线信息都跟之前的一模一样。
  • 热度 7
    2013-9-22 14:57
    1000 次阅读|
    6 个评论
             看到身边很多搞射频的朋友,头发都白的很快,也不知道所困,最近也是被流行性感冒困扰快一周了,博客也停止未发表,实在对不起关注我的朋友,希望各位,加强锻炼身体,了解自己工作危害,注意防范,身体健健康康。          具体我想好了有如下2篇文章可以写,MCU + CPLD电路设计,MCU 地址复用原理。其他的文章待自己学习之后明白再写~~~     Remark:欢迎各位 踊跃发表自己感受电子对身体伤害及怎么预防,此博文算是收集各位信息之用,留给大家做参考,加强注意身体调养。  
  • 热度 4
    2013-6-4 16:32
    320 次阅读|
    0 个评论
    摘要: 为了缩短基于ARM的网络化嵌入式应用开发周期、降低开发成本和提高产品质量,提出一种有别于传统利用操作系统开发嵌入式应用的模式。在该模式的框架下,对W5100网络芯片底层驱动进行编写、封装和测试。测试表明该驱动能完成预期功能。该驱动一旦被设计好,就可以在多个项目中重复使用,缩短网络化嵌入式系统开发周期,降低开发成本和提高产品质量。 关键词: W5100驱动;复用;面向对象;ARM;嵌入式应用;开发模式   引言 嵌入式操作系统的引入大大提高了嵌入式系统的功能,方便了嵌入式应用软件的设计,但同时也占用了宝贵的嵌入式资源。 嵌入式操作系统大多采用组件化、模块化的设计思想,以搭积木的方式通过互连构造软件,因而是可配置的。但是由于操作系统的多样性,不同操作系统提供的配置方式迥异且繁简不一。而由于硬件平台的多样性,即使是相同的操作系统,其应用配置也有差别。结果是,应用程序开发者必须熟悉不同的硬件平台和操作系统才能进行有效的应用开发,增加了应用开发的难度。特别是网络化嵌入式应用一般出现在比较大型的项目中,复杂度和难度大大增加。因此,提高网络化嵌入式应用产品质量、缩短开发周期、降低开发成本是开发人员面临的迫切要求。 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网络虚设备,其部分头文件略——编者注。 由于网络通信应用的芯片有多种,但是无论是哪种芯片,实现的功能都离不开网络包的读和写。因此在该虚类里的声明都是共用的功能。基类里面含有虚函数,就是声明了接口,但是没有具体的实现,具体的实现由其具体的实设备来完成。在继承中,如果基类和派生类中定义了同名的成员函数,当用基类指针指向公有派生类的对象后,可以使用虚函数来实现通过基类指针找到相应的派生类成员函数 。 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实设备驱动拥有这些简单设备的指针,可以看出这些指针是指向简单虚设备对象的指针。 声明为指向基类对象的指针,当它指向公有派生类对象时,可以利用它来直接访问派生类中从基类继承下来的成员,不能直接访问公有派生类中特定的成员。 采用面向对象中模式编程法则中的依赖反转法则:依赖抽象而不依赖具体 。 在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((inttype0×04)==0×04){ //接收数据引起中断 S_UDP_RX_Process(socket,ReceiveBuffer ,ReceiveBuffer ); //从对应的Socket接收数据 Msg.MsgID=Sys_Msg_UdpGetData; Msg.Msg=ReceiveBuffer ; VclPointer -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协议通信,只需要在原来驱动上添加相应的函数即可,因此维护起来更加方便。 编者注:本文为期刊缩略版,全文见本刊网站www.mesnet.com.cn 转自:  《单片机与嵌入式系统应用》杂志   与我们更多联系: WIZnet邮箱:wiznetbj@wiznettechnology.com WIZnet中文主页:http://www.iwiznet.cn WIZnet中文博客:http://blog.iwiznet.cn WIZnet企业博客:http://e.weibo.com/wiznet2012
  • 热度 2
    2013-6-4 16:30
    10654 次阅读|
    0 个评论
    摘要: 为了缩短基于ARM的网络化嵌入式应用开发周期、降低开发成本和提高产品质量,提出一种有别于传统利用操作系统开发嵌入式应用的模式。在该模式的框架下,对W5100网络芯片底层驱动进行编写、封装和测试。测试表明该驱动能完成预期功能。该驱动一旦被设计好,就可以在多个项目中重复使用,缩短网络化嵌入式系统开发周期,降低开发成本和提高产品质量。 关键词: W5100驱动;复用;面向对象;ARM;嵌入式应用;开发模式   引言 嵌入式操作系统的引入大大提高了嵌入式系统的功能,方便了嵌入式应用软件的设计,但同时也占用了宝贵的嵌入式资源。 嵌入式操作系统大多采用组件化、模块化的设计思想,以搭积木的方式通过互连构造软件,因而是可配置的。但是由于操作系统的多样性,不同操作系统提供的配置方式迥异且繁简不一。而由于硬件平台的多样性,即使是相同的操作系统,其应用配置也有差别。结果是,应用程序开发者必须熟悉不同的硬件平台和操作系统才能进行有效的应用开发,增加了应用开发的难度。特别是网络化嵌入式应用一般出现在比较大型的项目中,复杂度和难度大大增加。因此,提高网络化嵌入式应用产品质量、缩短开发周期、降低开发成本是开发人员面临的迫切要求。 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网络虚设备,其部分头文件略——编者注。 由于网络通信应用的芯片有多种,但是无论是哪种芯片,实现的功能都离不开网络包的读和写。因此在该虚类里的声明都是共用的功能。基类里面含有虚函数,就是声明了接口,但是没有具体的实现,具体的实现由其具体的实设备来完成。在继承中,如果基类和派生类中定义了同名的成员函数,当用基类指针指向公有派生类的对象后,可以使用虚函数来实现通过基类指针找到相应的派生类成员函数 。 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实设备驱动拥有这些简单设备的指针,可以看出这些指针是指向简单虚设备对象的指针。 声明为指向基类对象的指针,当它指向公有派生类对象时,可以利用它来直接访问派生类中从基类继承下来的成员,不能直接访问公有派生类中特定的成员。 采用面向对象中模式编程法则中的依赖反转法则:依赖抽象而不依赖具体 。 在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((inttype0×04)==0×04){ //接收数据引起中断 S_UDP_RX_Process(socket,ReceiveBuffer ,ReceiveBuffer ); //从对应的Socket接收数据 Msg.MsgID=Sys_Msg_UdpGetData; Msg.Msg=ReceiveBuffer ; VclPointer -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协议通信,只需要在原来驱动上添加相应的函数即可,因此维护起来更加方便。 编者注:本文为期刊缩略版,全文见本刊网站www.mesnet.com.cn 转自:  《单片机与嵌入式系统应用》杂志   与我们更多联系: WIZnet邮箱:wiznetbj@wiznettechnology.com WIZnet中文主页:http://www.iwiznet.cn WIZnet中文博客:http://blog.iwiznet.cn WIZnet企业博客:http://e.weibo.com/wiznet2012
相关资源
  • 所需E币: 3
    时间: 6 天前
    大小: 945.96KB
    上传者: 指的是在下
    780_868_915MHz频段无线传感器网络低功耗电流复用频率综合器
  • 所需E币: 0
    时间: 2020-11-12 22:21
    大小: 1.25MB
    上传者: czd886
    基于电容复用方案的超导电感储能脉冲电源改进研究
  • 所需E币: 0
    时间: 2020-9-28 21:14
    大小: 471.49KB
    上传者: LGWU1995
    可扩展性的优点:从彼得·帕克(PeterParker)到引脚复用
  • 所需E币: 0
    时间: 2020-9-26 01:59
    大小: 492.92KB
    上传者: LGWU1995
    高速复用数模转换器同步方法
  • 所需E币: 0
    时间: 2020-9-18 11:00
    大小: 253.51KB
    上传者: czd886
    K60_LQ144_引脚复用规则
  • 所需E币: 0
    时间: 2020-8-26 16:14
    大小: 4.13MB
    上传者: 指的是在下
    模分复用系统关键技术研究进展
  • 所需E币: 0
    时间: 2020-8-23 00:59
    大小: 202.13KB
    上传者: xiaosh728
    SWD端口复用为GPIO功能Rev1.2
  • 所需E币: 2
    时间: 2020-8-20 22:42
    大小: 417.29KB
    上传者: Argent
    本人从事电子行业多年,由电子硬件开发到软件设计,从工业控制到智能物联,收集了不少单片机产品的开发资料,希望通过这个平台,能够帮助到更多志同道合的网友,资料不在于多而在于精,有需要的老铁们可以下载下来参考参考。
  • 所需E币: 1
    时间: 2020-5-25 17:33
    大小: 495.97KB
    上传者: Argent
    使用单片机可以开发一些常见的智能设备,无需高昂的价格,低成本高稳定性的产品才是市场竞争的王道,掌握单片机的设计思路,使用人类的编程语言去操控机器设备的运转,单片机改变了这个时代。一个既需要懂单片机的硬件基础知识,又需掌握软件上的编程控制的岗位应运而生,即单片机开发工程师,高级一点的叫嵌入式开发工程师,下载我的这些有关单片机开发的应用知识,助你更深入地了解单片机工作原理,增强你的编程动手能力。
  • 所需E币: 4
    时间: 2019-12-26 00:56
    大小: 447.68KB
    上传者: 978461154_qq
    vxworkspowerpcbsp与ucos的移植--嵌入式软件的复用……
  • 所需E币: 4
    时间: 2020-1-4 23:24
    大小: 23.52KB
    上传者: rdg1993
    基于复用的SOC测试技术……
  • 所需E币: 4
    时间: 2019-12-24 21:20
    大小: 311.93KB
    上传者: 16245458_qq.com
    ManyapplicationsrequiredrivingLEDsalongwithaninterfacetoakeypad.ImplementingsuchdesignsusuallyinvolvesusingupsignificantamountsoftheprocessorsI/Olines.Thisapplicationnotedescribesamethodwhichusesonly16I/OpinsofaPIC16C5Xmicrocontrollertosamplea4x4keypadmatrix,anddirectlydrivefour7-segmentLEDs(Figure1).AN529MultiplexingLEDDriveanda4x4KeypadSamplingdriveoftheLEDsispossible,becauseofthehighsinkAuthor:StanD’SouzaandsourcecapabilitiesofPIC16C5Xmicrocontroller,MicrochipTechnologyInc.thuseliminatingtheuseofanexternaldrivetransistor,andresultsinareductioninbothcostandcomplexityofINTRODUCTIONtheoverallcircuit.TypicallyapplicationshavingLEDsa……
  • 所需E币: 5
    时间: 2020-1-9 16:19
    大小: 341.02KB
    上传者: 2iot
    正交頻分多路复用技術第一章正交分……
  • 所需E币: 5
    时间: 2020-1-14 13:18
    大小: 87.15KB
    上传者: rdg1993
    一种结构可调整的IQ正交复用功放基带预失真模型及其FPGA的实现2007年全国微波毫米波会议论文集一种结构可调整的IQ正交复用功放基带预失真模型及其FPGA的实现王祥林饶妮妮(电子科技大学成都610051)摘要:本文根据现代通信系统中功放信号实时高速和大数据量的特点,结合一种结构可灵活调整的IQ两路正交复用的功放预失真模型,提出一种高效的基于FPGA基带数字预失真实现方法。该预失真模型在3G基站功放系统中得到实际应用,以相邻码道功率抑制比(ACPR)这个指标来衡量,可以取得近20dB的改善效果。关键字:功放线性化,基带预失真,查找表,IQ正交复用,FPGAAStructure-adjustablePredistortionModelforIQOrthogonalMultiplexingPowerAmplifierandImplementaiononFPGAWangXianglinRaoNini(UniversityofElectronicScienceandTechnologyofChina,Chengdu610051,China)Abstract:Accordingtothehigh-speedreal-timeandhuge-datacharacteristicsofpoweramplifiersignalinmoderncommunicationsystems,Thisarticleputsforwardanefficientmethodofimplementingabasebandpredistortionbasedonastructure-adjustableandIQorthogonalmultiplepre-distortionmodel.Th……
  • 所需E币: 5
    时间: 2020-1-14 19:38
    大小: 135.04KB
    上传者: 微风DS
    IP复用技术的研究,IP复用技术的研究……
  • 所需E币: 3
    时间: 2020-1-15 12:27
    大小: 131.5KB
    上传者: 微风DS
    时分复用第三章时分多路复用与复接技术1时分多路复用    为了提高信道利用率,使多个信号沿同一信道传输而互相不干扰,称多路复用。目前采用较多的是频分多路复用和时分多路复用。频分多路复用用于模拟通信,例如载波通信,时分多路复用用于数字通信,例如PCM通信。    时分多路复用通信,是各路信号在同一信道上占有不同时间间隙进行通信。由前述的抽样理论可知,抽样的一个重要作用,是将时间上连续的信号变成时间上离散的信号,其在信道上占用时间的有限性,为多路信号沿同一信道传输提供了条件。具体说,就是把时间分成一些均匀的时间间隙,将各路信号的传输时间分配在不同的时间间隙,以达到互相分开,互不干扰的目的。图3-1为时分多路复用示意图,各路信号经低通滤波器将频带限制在3400Hz以下,然后加到快速电子旋转开关(称分配器)[pic]开关不断重复地作匀速旋转,每旋转一周的时间等于一个抽样周期T,这样就做到对每一路信号每隔周期T时间抽样一次。由此可见,发端分配器不仅起到抽样的作用,同时还起到复用合路的作用。合路后的抽样信号送到PCM编码器进行量化和编码,然后将数字信码送往信道。在收端将这些从发送端送来的各路信码依次……
  • 所需E币: 3
    时间: 2020-1-16 12:54
    大小: 180.16KB
    上传者: quw431979_163.com
    DVB系统码流复用的软件实现数字电视与数字视频!"#$#%&’%(&)""#$#%&’(#"*+文章编号:!?@*(*!"#系统码流复用的软件实现张继东(上海交通大学电子工程系B上海!C)【摘・软件设计・要】在介绍基于%&’()*标准的系统层结构的基础上,提出了一种"#$码流复用的软件实现方案,这使得多个节目的高效传输成为可能。【关键词】数字视频广播;传输流;复用【$%&’()*’】D93E4FG/G2:/FHI3J/:28K734G72L49MF0E2824FM4N29O/F26H9F;F3287/;2:HI%&’()*F3/96/:6P+E28K734G72L49MHI"#$F;F328F3:2/8F8/12F3E23:/9FGH:3HI8K734=G:HM:/8F8H:22II4042937;P【+,-./(0&】"#$;3:/9FGH:3F3:2/8;8K734G72L49M!引言即%&’()*压缩层的输入以一定的频率抽样,"#$标准提供了一套完整的适用于不同媒介的数字电视广播规范。从一开始,"#$组织就对信源编码进行了统一,并选定%&’()*标准作为视音频压缩编码方式,从而充分利用了视觉与听觉特性。随后,对%&’()*码流进行打包形成传输流(,并进行多个传输流的复用,最后通过卫星、有+,)线电视网及地面广播等不同方式进行传输。整体而言,码流复用、传"#$系统由节目……
  • 所需E币: 3
    时间: 2020-1-13 16:42
    大小: 134.07KB
    上传者: 238112554_qq
    PADS设计复用KGS建立可重复使用电路(MakeReuse)和增加重复使用电路(AddReuse)在PADS-Layout中,利用重复使用电路(Reuse)功能,可以节省相同部分操作的时间,也可以利用Reuse功能,进行分工合作同一个设计,以便缩短PCB设计时间。建立可重复使用电路(MakeReuse)在你继续本教程之前,打开已布线完成的previewrouted.pcb设计文件,我们首先利用已布线完全的设计来建立一个Reuse模块,供后续使用。1.从工具条(Toolsbar)中选择打开(Open)图标。2.当Saveoldfilebeforereloading?提示出现后,选择No。1.在文件打开(FileOpen)对话框中,双击名为previewrouted.pcb的文件。在没有选择任何目标时,点击右键,选择Selectanything,再框选做为重复使用电路部分,我们选择本设计中的中间下半部分的设计,图中绿色圈中的高亮部分。点击右键选择设置群原点(SetGroupOrigin),鼠标左键点击,设置群原点的地方。以后在打开这个重复使用电路时,光标将依附在设置的群原点的地方。这主要是为了后续对产生的Reuse模块进行精确定位。提示:为了精确定位,你可以利用无模命令Sxy的模式,输入精确的x和y轴的坐标。比思电子有限公司(KGSTechnologyLtd.)深圳:0755-88859921szkgs@kgs.com.hk香港:00852-26371886sales@kgs.com.hkwww.kgs.com.hk上海:021-51087906北京:010-51665105shkgs@kgs.com.hkbjkgs@kgs.com.hk……
广告