在开始之前,先引用一下我在今年的Windows Embedded正文比赛上的文章-“移动设备中ZigBee接口的实现。该文章只是介绍了框架性的概念和实现方式,并没有给出过多的细节。在接下去的时间里,我将给出具体的实现原理、方法和步骤,希望能对园子里的朋友有所帮助。

 

 

         ZigBee是一种短距离、低速率无线网络技术,是一种介于RFIDBluetooth之间的技术提案。ZigBee一般采用IEEE 802.15.4收发器与ZigBee协议栈的组合,在数千个微小的节点之间相互协调实现通信。这些节点只需要很少的能量,以接力的方式通过无线电波将数据从一个传感器传到另一个节点,所以它们的通信效率非常高。因此,ZigBee在传感器网络、智能家居、工业自动化等领域有广泛的应用。市场研究公司NSR曾发布报告指出,首批具备ZigBee功能的产品将于2006年第一季在北美、欧洲和亚太地区展开,该机构并预估,到2010年,全球将可望部署5.8亿个ZigBee组件,成长非常快速。同样,市调机构In-Stat也曾在2005年发布新闻指出,五年内,ZigBee成长将超过200%

    在这样的背景之下,很多公司都开始了ZigBee产业化的道路。首当其冲的莫过于FreescaleTI等大公司,TI是收购了chipcon才开始做ZigBee的。目前,我使用过这两家公司的片子,给我的感觉就是,现在这些硬件厂商做东西真是好,发布芯片的同时,给你一堆的参考资料。包括硬件设计(原理图、PCB)和嵌入式软件设计,甚至是生产工艺和流程中的注意事项。所有的这些,都大大降低了入门的门槛,缩短了产品开发周期,从而加速了产品的应用。

    目前,由于各家使用ZigBee技术的设备商采用的应用协议不同,所以目前市场上很少通用的测试设备,执行包括信道检测,数据监听,发送功率等功能。对于ZigBee的测试,很多情况下都是移动的,固定的比较少。所以,我就想到了Windows Mobile设备,既有移动性,又有强大的处理功能,于是我就想到了在Windows Mobile设备上加ZigBee模块的想法。

 

    那么,首先我们来考虑系统的架构吧。如图1所示,按照功能,系统可以分成ZigBee模块和移动设备这两个部分,它们通过串口进行通信。目前,支持串口通信的Windows Mobile设备还是比较多的,特别是一些工业用的PDA,在HPDopod等产品中也可以找到。它们执行不同的功能,ZigBee模块负责IEEE 802.15.4信号的发送和接收,移动设备负责数据的处理,并向用户提供有好的UI

 

                             图1系统组成框图

    目标系统的功能如下:

         1.      信道检测。通过扫描,完成ZigBee技术2.4GHz频段16个信道的状态检测,并返回给UI进行显示。

         2.      发送/接收信道设置。用户通过UIZigBee模块发送指令,使之通过设定的信道来发送和接收数据。

         3.      发送/接收数据。用户可以用文本方式或者HEX方式发送数据,并且可以用一定间隔进行连续发送。

         4.      发送功率设置。用户发送数据时,通过UIZigBee模块发送指令,可以设定发送的功率大小。

    图1中使用的ZigBee实现方案是比较早的一种,是FreescaleHCS08GB60系列CPUMC13192系列的IEEE 802.15.4 收发器。目前,Freescale已经推出了单芯片ZigBee,即在单个芯片上集成了MCUIEEE 802.15.4 收发器,典型的如MC13213。开发起来也没有多大区别,只需要修改一下寄存器映射就可以。TI的片子,如CC2430,设计起来也比较方便,因为它也有串口可以和外部设备进行通信。

 

         ZigBee网络可以使用StarMeshMesh-Tree这三种拓扑结构,具体可以参考图2.

 

                            图2 ZigBee网络拓扑结构模型

    网络结构不同,其组网复杂程度也就不同。可想而知,Mesh网和Mesh-Tree网肯定会比Star网复杂很多。生产厂商也会根据客户的需求,进行不同程度的支持。以Freescale来说,它提供的最简单的SMACSimple MAC)是免费的,但是可以说,这个源工程里面只提供了最简单的API,包括工作状态转换、信道选择、发送功率选择、时钟选择、信道能量和接收信号能量指示(RSSI)等等,没有路由、组网这么一说,你如果想实现,也可以,就得自己写。另外提供的Bee-Stack比较全面,但是是要收费的。

 

                                                  

    继续上一篇ZigBee On Windows Mobile--1.背景和结构,今天来讲讲硬件和软件设计。硬件设计主要是做ZigBee模块,输出文件一般包括原理图和PCB图。PCB图是最终给制板厂商的文件,制板厂商将PCB文件转化为Gerb文件进行PCB板加工。软件设计包括两部分,即ZigBee模块中的嵌入式程序和Windows Mobile端的应用程序,这两个软件模块运行在不同的平台之上,硬件上通过UART口进行通信。

    硬件设计使用了比较传统的Protel99se,采用了MC13192+GB60的设计和单芯片MC13213的设计原理图下载链接如下:

      http://files.cnblogs.com/dearsj001/GB60+13192.pdf

      http://files.cnblogs.com/dearsj001/MC13213.pdf

    硬件设计也没有太多可以讲述的,只要按照Freescale给的参考设计,自己根据需求,做相应的小小修改就可以。比较关键的是天线的设计。我们自己没有测试设备(频谱仪一个就10W),一般而言,就使用给出的参考设计天线,有倒F天线(非平衡式)、双鞭天线(平衡式)等。另外就是板材的选择和板厚也和通信距离有相当大的关系。

    嵌入式软件的设计采用CodeWarrior for HCS08 V3.1 开发环境,运用“前后台系统”的模式,前后台系统的基本思想是:硬件中断函数中只做非常少量而且是绝对必须的操作:如设置中断寄存器、保存数据寄存器等,然后置后台标志位,随即退出中断。这些操作称为“前台操作”。而后台操作是一个开放中断的无限循环。在循环中检查各后台标志位,如果某一标志位被置位,则说明有中断发生,立即调用相应的中断服务任务,这些任务被称为“后台操作”。

主程序流程如下图1所示:

 

 

                                                       

                                                              图1主程序流程图

        TargetInit()执行系统初始化操作,主要包括HCS08IOUARTTimer等模块的初始化。ConfigInit()执行配置初始化操作,主要包括SMAC协议和串口通信协议配置。ScheduleLoop()为主调度循环,根据状态来执行不同的任务,如下图2所示。其中的SYS_FEED_DOG()是指喂看门狗操作。

 

                                   

                                                               图2 主调度循环流程图

    在Windows Mobile设备上运行的用户应用程序,主要执行信息交互和显示功能。进一步说,用户要通过UI将命令发送给ZigBee模块,同时,Windows Mobile设备将ZigBee模块的情况通过UI呈现给用户。在Microsoft Visual Studio 2005IDE下,安装一个最新的Windows Mobile 6 professional SDK,配合自带的Emulator就可以进行开发和调试。软件可以分为几个模块:串口通信部分、界面UI部分和数据处理部分。由于本人比较熟悉C++,所以我选用了native code进行开发,建立一个基于对话框的MFC工程,将需要的控件加入对话框。具体流程如下图3所示。

 

                                                                                                                      

                                                                                                                      3  Windows Mobile设备应用程序流程图

其中的对话框初始化包括了界面的初始化,要强调的是串口的初始化。我们这里采用的串口参数如下:速率9600bps1个停止位,无奇偶校验。

工程的运行环境:VS2005 with SP1+.NET CF SP2+windows mobile professional SDK

工程源代码下载:http://files.cnblogs.com/dearsj001/WirelessFutureWM5_Emulator.rar

 

好了,今天就啰嗦到这里,明天继续讲调试,包括设备调试和模拟器调试。Enjoy!

    继续前两篇 ZigBee On Windows Mobile--1.背景和结构 ZigBee On Windows Mobile--2.硬件和软件设计,这次来讲最后一部分,模拟器和实物调试。

    实物调试相对于模拟器调试来说,要简单一点。例如,HP iPaq rx3700系列的PDA,是带串口的,只要配上一根串口线,就可以和外设进行串口通信。如下图1所示,HP iPaq rx3700通过黑色的串口转接线和ZigBee模块相连,右边的ZigBee模块通过电池供电,那样就可以进行调试了。

           图1. 实物调试图

    模拟器调试相对比较复杂一点,在开始这部分的讲述之前,先说说好多朋友问的一个问题,那就是模拟器到底有多大作用?我可以在模拟器上流畅地跑应用程序么?”对于这个问题,我个人觉得,就目前来讲,模拟器的功能越来越强大,可以做的事情也越来越多,特别是WM6.0的模拟器,其中一个很大的亮点就在于”Cellular Emulator””Fake GPS”的引入,我们可以在没有蜂窝电话和GPS硬件支持的情况下,模拟它们的行为,方便了我们应用程序的调试。

    回归我们的话题,讲讲我们这个项目如何在模拟器上来调试。由于Windows Mobile设备和ZigBee模块之间通过串口进行通信,因此,如果我们有办法利用模拟器的串口来调试的话,那样就会方便很多,甚至可以不用一个硬件,在Windows Mobile模拟器上测试我们的应用程序。那么,有这样的方法么?答案是,将Windows Mobile模拟器的串口映射到PC的物理串口设备。如果你的PC机没有串口,那么只能搞个USB转串口的小玩意儿了。如果你的PC机连USB接口也没有,那么,PCI卡槽应该有吧,也可以买个PCI转串口的东东。具体将Windows Mobile模拟器的串口映射到PC的物理串口设备的步骤如下:

        1.打开你的模拟器。

        2.点击"File"->"Configure"

        3."Peripherals"选项卡中进行设置。例如,我要把模拟器的串口0映射到PC机的串口1上,就可以在"Serial port 0"下,选择"COM1".如图2所示.

                                                       图2 .模拟器串口映射设置

         4.点击"OK"。然后Reset模拟器就可以了。

    最好我们调试的PC机有两个串口,将两个串口用交叉线连起来之后,就可以模拟串口通信了。注意是交叉线,而非直连线。所谓交叉线,直白地将就是将串口的2脚和3脚交叉了,也就是将串口1的"发"和串口2的"收"相连,将串口1的"收"和串口2的"发"相连,这样就实现了串口1和串口2的"收发"正常通信。比如将Windows Mobile模拟器的串口映射到PC机的物理串口1,再用串口调试助手或者Windows自带的超级终端控制PC机物理串口2,这样就可以模拟串口通信了。如图3所示。

 

                                                 图3.利用超级终端进行串口调试

   

    好了,至此为止,ZigBee On Windows Mobile就到这里结束,希望能够给园子里的朋友或者有需求的朋友带来一点帮助和启发。有不对的地方,也请指出来,大家相互交流,相互提高。

   

    上篇文章ZigBee On Windows Mobile—利用CF卡接口外扩发布以后,有朋友回帖说希望我写一下ZigBee硬件模块的设计方法和流程,今天我们就来学习一下ZigBee模块是如何制作的。

    目前,生产ZigBee芯片的有好几家大公司,TIFreescaleAtmelJennic等均有各自的ZigBee芯片,TIFreescale用的比较多,设计参考文档也比较全。TIZigBee解决方案主页链接如下:http://focus.ti.com.cn/cn/analog/docs/rfifcomponentshome.tsp?familyId=367&contentType=4其中包括了CC2420CC2520CC2430CC2431和最新的CC2480的设计指南。FreescaleZigBee解决方案主页链接如下:http://www.freescale.com.cn/ZigBee.asp包括了IEEE802.15.4收发器MC13192MC13193和单芯片MC13213MC13214等的设计指南。

    我觉得这两家的参考设计文档比较齐全,降低了我们入门的门槛和硬件设计的难度。下面我就以FreescaleMC13213为例,说明一下硬件设计流程和方法。

    首先,从整体来看,我们可以将目标设计分为几个模块:电源模块、主芯片模块、天线模块调试接口和外围扩展模块。其中,电源模块、天线模块、调试接口和主芯片模块是必须的,可以用通常所说的最小系统来描述。外围扩展模块是根据用户的实际需求自行添加。

         1. 电源模块

    按照MC13213datasheet,其工作电压范围在2-3.4V,而我们一般使用干电池或者可充电的锂电池供电,这样,我们就需要一个LDO或者DC-DC,它的作用就是将我们的电池电压降到MC13213可以工作的范围内。在这里,我们可以选用TI76930,不仅因为体积小(SOT23封装),而且Dropout Voltage的典型值在71mV@100mA。另外,如果用可充电的锂电池的话,需要注意加上保护电路,如下图1所示:

 

                                                                       图1. 电源模块

         2. 主芯片模块

         MC13213本身就包括了MCU和收发器,因此,它的必须外围电路很少。这里需要强调是晶振的选择问题。一般我们使用外部晶振来提供系统时钟,在这里,我选择了16M的无源晶振,如下图2所示:

 

                                                          图2:主芯片电路模块

 

         3. 天线模块

    天线的设计关系到无线信号发送和接收的质量。在Datasheet中,freescale给出了参考天线设计,称为倒F天线。这里需要注意的是:我们可以使用芯片的内部收发开关,也可以使用外部自己加的收发开关。使用外部收发开关,信号的收发效果会更加好一点,但是这样一来,成本也就增加了,即增加了一个收发开关和Balun。这里我的设计是使用了外部收发开关,如下图3所示:

                                                                                                                    图3. 天线电路模块

      

         4. 调试接口

         Freescale有自己的BDM接口,称为background debug module。一般,我们可以在板子上设计插针来实现。但是,考虑到ZigBee模块在很多情况下,它的体积要求很小,这样一来,六个插针的BDM接口就显得臃肿好多。因此,我们这里使用miniUSB接口来外扩。如下图4所示,其中的miniUSB接口还包括了电源、UARTRxTx

 

                         图4. miniUSB图

 

         5. 外围扩展模块

充电管理芯片:如果使用可充电锂电池的话,充电管理芯片是不能少的。这里,我们选用FreescaleMC34673。在CC(恒流)模式下,充电的电流可以通过电阻R6来调整,如下图5所示,具体可以参考其datasheet

 

                     图5. 充电管理电路模块

指示灯:一般可以用指示灯来指示程序运行的状态,也就是程序可以控制的指示灯。指示灯有贴片封装的,也有直插封装的。发光强度有一般的,也有高亮的,我们可以按照实际的需求来选择。

 

其他外围电路可以用户自行添加,需要注意的是,我们选择芯片的时候,要考虑其工作电压和电流,因为ZigBee节点的要求就是节能和高效。

 

    今天我写在这里的东西,纯粹是硬件设计上的东西,和Windows Mobile一点关系没有,希望大家不要拍我啊。