shoko camel

想要LPCXpresso54608板子 分享LPC54100版本6LoWPAN低功耗网络设计

Discussion created by shoko camel on Dec 22, 2016
Latest reply on Jan 16, 2017 by shoko camel

这是一个连载的帖子,本人首发于eeworld,现在发布到lpcmcu.org上,给大家参考,本人保留转载权利,目前LPC54102已经应用在实际低功耗网络项目上了。

 

写在最前面的,异构双核用于无线低功耗网络传感网非常适合,M0用于传感采集,M4用于网络处理(主要负责IPv6的一些封包/解包/路由算法/低功耗策略/应用层协议等)。

 

开篇 【LPC54100】Lis3dh+Gnuplot+Mysql


有些事情要做好还是要看当前的情况/环境了,这次基于lpc54100的6lowpan网络感觉有点完成不了了,事情蛮多的,需要做的底层的事情也是蛮多的,只能做一点算一点咯,关于之前的计划有打算搞定一个通用的传感器framework,基本上算是events-driven那一套东西了,不过得让api接口更加智能化一些,需要好好考虑一下framework的事情了。

 

     恩,要有传感器,硬件基本上ok了,选择一个mems传感器会更加符合时代的主题,大家都在玩嘛,四轴什么的。选一个手机用的传感器,st的算是出货量蛮大的IC了,lis3dh应该有蛮多熟悉这颗ic的,好像大家会喜欢mpu6050这种吧,不晓得为啥,怎么不自己选一个自己喜欢的呢。LIS3DH官方提供了linux的驱动,基本上是给android手机用的嘛,得要有的。去年看过一款st的9轴传感器,蛮不错的,可惜好像还是样片,有个惯导定位的项目也因为这个没有落地。

 

     期间搞过一些关于mems算法调试的通用平台,基本上linux下面的,个人基本上工作上linux桌面会选ubuntu为主吧。简单说说调试平台,基本上是gnuplot+mysql+p2p无线传输+mems节点,软件上基本上是《file操作 + mysql 管理 + gnuplot脚本 + 串口数据流》。

 

 

一些mysql的操作和测试

 

  1. 1、安装mysql
  2.     sudo apt-get install mysql-server-5.5
  3. 2、登陆mysql
  4.     mysql -u root -p
  5. 3、创建accDB
  6.     create database accDB;
  7.     show databases;
  8.     drop database accDB;
  9.     show databases;
  10. 4、创建accRow数据表
  11.     create table accRow(acc_time datetime,acc_x int,acc_y int,acc_z int);
  12. 5、插入测试数据
  13.     use accRow
  14.     insert into accRow values(now(),1,1,1);
复制代码

 


虽然时间比较紧,还是得慢慢来,东西要做好,论坛的事情也是要用心的哦,认真做事情你会感觉到还蛮开心的。

 

好了,来电图:

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

哎,家里的电脑装起来,开发蛮爽了。

 

 

 

 

 

一些配置:

 

  1. HAL_I2C_Init();
  2.     LIS3DH_GetWHO_AM_I(&dump);
  3.     DEBUGOUT("LIS3DH ID:%x\n", dump);
  4.    
  5.      /* Set ODR (turn ON device) */
  6.     response = LIS3DH_SetODR(LIS3DH_ODR_400Hz);
  7.     if (response == 1) {
  8.         DEBUGOUT("SET_ODR_OK\r\n");
  9.     }
  10.    
  11.     /* Set PowerMode */
  12.     response = LIS3DH_SetMode(LIS3DH_NORMAL);
  13.     if (response == 1) {
  14.         DEBUGOUT("SET_MODE_OK\r\n");
  15.     }
  16.    
  17.     /* Set Fullscale */
  18.     response = LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);
  19.     if (response == 1) {
  20.         DEBUGOUT("SET_FULLSCALE_OK\r\n");
  21.         
  22.     }
  23.    
  24.     /* Set axis Enable */
  25.     response = LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE);
  26.     if (response == 1) {
  27.         DEBUGOUT("SET_AXIS_OK\r\n");
  28.     }
复制代码

 


I2C初始化,采用的I2C1,大家换个口看看,我被坑到了,需要注意这个NXP驱动的写法,真是高级,用过这么多库,这玩意感触最深。

 

第一次使用st的感觉他的库蛮好的,后面用atmel的R21感觉他的库很不错,比st的好多了,水平也高不少,很类似linux下的东西。

 

如今用NXP的,感觉这玩意真心不错,比atmel的还给力,感觉这就是以后这种MCU厂家合并/并购的目的吧,以后这种外设库更加的合理丰富,更加具有可用性,因为各家的越来越多的人,优秀的开发人员共同开发统一的外设驱动库,当然NXP的也会是一个大趋势,ROM和periph这种

 

 

  1. /**
  2. * @brief  HAL_I2C_Init
  3. * @note   软件I2C配置函数
  4. * @param  None
  5. * @retval None
  6. */
  7. void HAL_I2C_Init(void)
  8. {
  9.     uint32_t memSize, *devMem;
  10.     Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 25, (IOCON_FUNC1 | IOCON_DIGITAL_EN));
  11.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 26, (IOCON_FUNC1 | IOCON_DIGITAL_EN));
  12.    
  13.     Chip_Clock_EnablePeriphClock(LPC_I2CM_CLOCK);
  14.         Chip_SYSCON_PeriphReset(LPC_I2CM_RESET);
  15.    
  16.         /* Get needed size for driver context memory */
  17.         memSize = ROM_I2CM_GetMemSize();
  18.         if (memSize > sizeof(drvData)) {
  19.                 DEBUGOUT("Can't allocate memory for I2C driver context\r\n");
  20.         }
  21.     /* Or just use malloc(memSize) */
  22.         devMem              = drvData;       
  23.    
  24.         /* Initialize driver */
  25.         i2cmInit.pUserData  = NULL;
  26.         i2cmInit.base       = (uint32_t) LPC_I2C_PORT;
  27.         i2cmHandle          = ROM_I2CM_Init(devMem, &i2cmInit);
  28.     /* Error initializing I2C */
  29.         if (i2cmHandle == NULL) {
  30.                 DEBUGOUT("Error initializing ROM\r\n");
  31.         }
  32.    
  33.         /* Set I2C clock rate */
  34.         actualRate = ROM_I2CM_SetClockRate(i2cmHandle, Chip_Clock_GetAsyncSyscon_ClockRate(), I2C_BITRATE);
  35.         DEBUGOUT("Actual I2C master rate = %dHz\r\n", actualRate);
  36.    
  37. }
复制代码

 


恩,就这样了,nmg不要催我了哦,有时间我就跟新一点,做事情认真的人,催也不行哦

IMAG0877.jpg (643.48 KB, 下载次数: 0)

 

IMAG0877.jpg

IMAG0879.jpg (723.9 KB, 下载次数: 0)

 

IMAG0879.jpg

 

第二篇 [LPC54100] 通用定时器使用

开头引用我回复freebsder帖子的话,那是一篇对低功耗分析相当专业的帖子,大家有兴趣去看一下。

       我个人越来越喜欢这颗IC了,低功耗方面看怎么用,在提供合理的CPU性能的情况下功耗能控制得很合理,起码NXP给我考虑的很周到了。
其次对于内置的BAKUP SRAM区域可以说是一大特色,相比TI或者其他厂家的全部保持的做法有不少新意。
最后关于文档和CODE,虽然不足够多,但是给出的基本上也足够用了,关键还是要用心看,对于新手可能会有一些问题,其实我真正打算把这颗IC用起来是从昨天晚上开始的,已经在移植6lowpan了,接触了蛮多的外设,对他的文档和官方的驱动有了更深刻的认识,。
恩,要是有机会的话,以后要是允许我会重点把LPC54102平台化,作为项目中低功耗/传感/运算场合的通用平台,好好去维护。

      开始移植6lowpan协议栈,涉及的外设还挺多的,昨天晚上才开始,估计明天完成不了了,分享一些相关的东西吧。需要蛮多的timer和clock,拿最简单的通用定时器来搞吧,简单些。

先看看时钟树吧,蛮有必要的,从LPC5410x Standard counter/timers部分看出时钟来至APB,而APB的时钟从下面的时钟树看到来至几个地方,看程序中设置。



  1. /*
  2. * Main system clock rate in Hz for this board. Select a clock rate between
  3. * 1500000Hz and 150000000Hz for the main system (CPU) clock for this board.
  4. */
  5. #define BOARD_MAINCLOCKRATE                         (100000000)
复制代码
  1. Chip_SetupIrcClocking(BOARD_MAINCLOCKRATE);
复制代码


所以这里的时钟是100M,关于对定时器的配置,也蛮简单的,不得不再次强调写NXP库的工程师团队水平了得,其实不单单是软件工程师的功劳,和硬件设计的时候也是息息相关的,这些是和寄存器设计有关的,不多说了。



  1. /**
  2. * [url=home.php?mod=space&uid=159083]@brief[/url]  TIMER1_Init
  3. * @note   TIMER1初始化
  4. * @param  none
  5. * @retval none
  6. */
  7. void TIMER1_Init(void)
  8. {
  9.     /*
  10.      * 设置PR=100
  11.      * TIMER1时钟=PCLK(100M)/100 = 1M = 1000K
  12.      */
  13.     Chip_TIMER_Init(LPC_TIMER1);
  14.     Chip_TIMER_PrescaleSet(LPC_TIMER1, 100);
  15.     Chip_TIMER_Reset(LPC_TIMER1);
  16.     Chip_TIMER_MatchEnableInt(LPC_TIMER1, 1);
  17.     Chip_TIMER_SetMatch(LPC_TIMER1, 1, Chip_Clock_GetAsyncSyscon_ClockRate());
  18.     Chip_TIMER_ResetOnMatchEnable(LPC_TIMER1, 1);
  19.     Chip_TIMER_Disable(LPC_TIMER1);
  20.    
  21.     NVIC_ClearPendingIRQ(CT32B1_IRQn);
  22.     NVIC_EnableIRQ(CT32B1_IRQn);
  23.    
  24. }
复制代码

配置如上,这里需要注意PR的理解和设置,这里初始化禁止了TIMER1,此处的TIMER1用于us的精确延时,因为6lowpan涉及的协议栈、RAIDO驱动都蛮在意这个us延时的。

这玩意很简单,不过得用心,NXP提供的文档和驱动包都能满足你,随便哪个外设都还是很方便就能用起来的。大家有关于通用定时器的问题可以在这个帖子中跟帖讨论,不写了,打算去继续搞一下,希望能移植结束。

 

 

 

第三篇 [LPC54100] 外部中断使用

这是很优秀的设计,以前没见过设计外设这么认真的,文档写的也不错,看起来清晰。

我们先来看关于数字外设的描述



提到了两种外部中断PINT和GINT,看起来都蛮不错的嘛,接着去细看一下PINT,因为RADIO接收需要中断。



这玩意很自由,所谓的match engine,不得不佩服设计者的用心良苦,关键是这么自由的东西配置起来一点也不复杂,主要还是归功于寄存器的设计合理。数字电路一流的,目前我用的IC这些东西要么很简单要么就特别复杂。。

继续看一下match engine的构造,就是这么的自然,第一次使用NXP的东西,确实不错,对于老手来说估计也不是啥新鲜事情了,就是这么见识少。。



接着看 detect logic构造,很清晰的看到需要去设置哪个寄存器



我的配置代码部分

  1.     /* AT86RF212B IRQ引脚--中断功能 */
  2.     Chip_PININT_Init            (LPC_PININT);
  3.     Chip_GPIO_SetPinDIRInput    (LPC_GPIO,  0, 4);
  4.     Chip_IOCON_PinMuxSet        (LPC_IOCON, 0, 4, (IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_GPIO_MODE));
  5.     Chip_INMUX_PinIntSel        (PININTSELECT0, 0, 4);
  6.     Chip_PININT_ClearIntStatus  (LPC_PININT, PININTCH(PININTSELECT0));
  7.     Chip_PININT_SetPinModeEdge  (LPC_PININT, PININTCH(PININTSELECT0));
  8.     Chip_PININT_EnableIntLow    (LPC_PININT, PININTCH(PININTSELECT0));
  9.     Chip_PININT_EnableIntHigh   (LPC_PININT, PININTCH(PININTSELECT0));
  10.     NVIC_EnableIRQ              (PIN_INT0_IRQn);
  11.     Chip_SYSCON_EnableWakeup    (SYSCON_STARTER_PINT0);
复制代码




很简洁,就这几行全搞定了。

 

 

 

第四篇 【LPC54100】6LowPAN网络-01

 

哎,年纪大了,稍微熬一下夜就困的不行了,我得去睡觉了。晚上断断续续的也算是完成了一部分移植吧,主框架是跑在M4上面的,传感器框架在M0内核上,细节还没有完善好。现在除了RADIO部分驱动的优化,其他基本上弄好了,不过不得不说UART不太好用,谁来个eg吧,关于中断接收的,目前参考代码包中的方式基本上是能用了,不过感觉还是有不少问题,这玩意有点怪,类似之前R21,还没R21做的好,都需要调用recv触发,搞不清楚是什么机制,待研究吧。由于UART有些问题所以SLIP也有点问题,这一次我没有使用openwrt路由做中转,之前是在openwrt路由下面把slip设备当做是一个虚拟网卡,然后桥接到lan。这次直接把串口接到电脑上,使用loopback adapter吧,这样lpc54102就相当于一张虚拟网卡,对于电脑而言,其他的基本上和之前的看起来是一样的了。


贴一些截图吧,实物和视频,暂缺。





















总是会丢最后一包,没法子,UART驱动没写好,有机会再优化吧,算是给NXP和nmg一个交代吧。

 

早饭之后打开电脑对UART接收做了一些优化,哎。。官方的example还是蛮靠谱的需要完全按照他的思路来,不能一直poll调度ROM_UART_Receive,有兴趣的可以看一下uart_int.c这个文件,对于中断接收和中断发送的一些东西基本上都有的。只是需要注意例子中配合的__WFI指令的好处,在实际软件中需要实现类似的逻辑就可以了,做了一下优化,目前slip不会出现丢包的现象了,不过ping的ttl我还是不太满意,有机会再优化吧。上个图来


ping50包100字节数据的结果!

 

 

 

第五篇 【LPC54100】6LowPAN边界网关-02视频

 

算是基本完成了吧,家里没有节点设备对应的程序下载接口,所以没办法演示节点的功能,视频中仅仅演示了LPC54102+AT86RF212B实现的6LowPAN边界路由的功能。

关于LPC54102部分的移植工作全部结束,后面的事情也就不继续了,没啥意思,有机会好好看看数据手册还有意义一点。软件的事情需要静下心来好好优化嘛,框架结构等等,不能这么快就弄完了,花了两个晚上基本上就能搞个demo还算容易上手吧。

一些硬件图片

  



  



基本上就这些了,哎,RADIO部分搞起来废了些时间,有个线搞反了,在家里找了把N年不用的电烙铁重新焊了一下,。。

简单说一下节点的能力提供CoAP的开关和调光应用,程序忘记烧了,下载线家里没现成的就没给他下了,有机会在补视频吧,网关部分是好了的,这RADIO是780Mhz的,号称能传输6Km,可惜自己做的模块没这么远。

视频在转码了,估计也快了。好了,可以好好睡觉了,下次论坛活动要看自己的近况来决定了,上班时间自然是不能占用的这是原则问题,论坛活动挺好的,可以在丰富业余生活,前提是有空余的时间和精力,偶尔参与一下也挺好的,能第一时间接触到一些新玩意。比如这次的LPC54102,我很喜欢,当然了NXP的东西还是第一次接触,以后有机会项目中会考虑使用NXP的东西,目前有打算使用LPC457x来做一些工控的应用,已经在评估了。

忘记拍web了
LPC54102 6lowPAN边界网关-01—在线播放—优酷网,视频高清在线观看 


带web显示的
http://v.youku.com/v_show/id_XOTYzMDM0NTUy.html 


LPC54102体验结束了,有机会再更新。

Outcomes