LoRaWAN stack移植笔记(六)_调试2

前言调试的过程中碰到的问题基本都是以前没有遇到过的,而且需要对整个协议栈及射频方面的工作流程较熟悉才能找到问题的原因,需要多读SX1276的数据手册以及与射频芯片的物理层通信例程和MAC层通信例程进行对比相结合。正文发送失败LoRa 模块在进行 模式切换时,比如TX 切换到RX模式,需要先将设备切换到standby模式CRC 校验失败,然后程序陷入死循环按逻辑来讲,CRC校验失败,应该进行的操作是...了解详情

LoRaWAN stack移植笔记(五)__调试1

先废话一小段在将LoRaWAN的程序移植的过程中,调试发现了很多的问题。做好记录工作,防止以后再踩坑移植使用的是LoRaMac-node库,使用的是STM32L151CBT6 MCU,需要要移植到STM32L051C8T6 这个MCU上面。开始正文JLink的配置由于第一次使用JLink(SWD方式),在一开始使用时,踩了几处坑:KEIL选择JLINK之后,点击设置进入,会出现一个对话框,要选择NOKEIL里面JLINK的 方式要选择SW,不然认不到芯片Flash download要选择对应大小的芯片,注意Flash的大小要选择正确程序无法进入main,甚至一个函数都没有跑当配置完JLink之后,程序可以正常烧写调试了,但是问题又出现了,无法跑进main函数,再进一步调试,发现来一个函数都没有执行,直接就进入进入死循环了(通过单步调试看上面的汇编代码)。这个现象就很奇怪了,以前也没有碰到过。因为3.3V和GND是正常的,这样就算晶振有问题,也会执行程序到配置晶振才会出问题,而不是一句函数都没有执行。后来顿悟,大概是BOOT0没接,仔细一看原理图,果然BOOT0是悬空的,飞线焊上之后,问题终于得到了解决。NOTE:画原理图时一定要主要,BOOT0一定要接地,这样程序才能正常从FLASH启动RTC定时链表的配置官方的库中使用了RTC来作为定时器来处理一些定时的事件,这也是库中唯一的任务调度机制。所以保证这个机制的正常运行非常重要。但是,当我把一切参数都配置完成之后,却发现,RTC的定时器不听使唤,经常不进入中断,初步诊断是写入寄存器的定时时间出了问题,但是却找不到出问题的原因。这个问题也是非常的诡异,至今还未发现原因。但是在一次偶然的调试中,我将原本处于static void RtcStartWakeUpAlarm( uint32_t timeoutValue )这个函数中的RtcCalendar_t now;RtcCalendar_t alarmTimer;RTC_AlarmTypeDef alarmStructure;这三个变量由局部变量改为了全局变量,问题就得到了解决。但是原因还未发现。原本以为是变量未赋初值就使用,但是程序中都有在使用前赋初值,具体原因不明。程序进入Default_handler在调试程序的时候,程序又出现跑死的情况,然后单步调试发现程序进入了Default_handler这里,始终无法跑出来。然后通过搜索得知,进入这里的情况应该是发生了中断但是没有处理,然后程序一直进入中断。后来查看代码发现,由于Cotex-M3和cotex-M0的核,对GPIO的中断的入口是不一样的,在移植时需要做修改,在做了修改之后,程序终于跑正常了。无法点对点通信需要注意的是,点对点通信中,能够建立条件需要两个点的通信参数配置成相同。特别注意的是iqInverted preamble SYNCWORDnote:1. 如果发射方使能了iqInverted,那么接收方也要使能iqInverted2. 接收方的preambleLen必须设置大于发射方,否则有很大可能接收不到(偶尔可以收到,但是接收成功率很低)3. 发射方和接收方的SYNCWORD必须设置一样(同步字一样),否则认为是不同网络接收机在接收检测时,会先检测前导码的长度,小于设置的最大接收长度时再检测同步字的内容,看是否一致,都符合时,才会接收负载的内容。邮箱地址:454626653@qq.com 欢迎咨询搭讪了解详情

LoRaWAN_stack移植笔记(四)__RTC

stm32相关的配置由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。RTC 的配置此例程中,RTC被当做定时器使用,用于定时执行任务。例程中,RTC使用外部LSE的32.768Khz的晶振作为时钟源而在本设计中,使用内部LSI作为RTC的时钟源,需要重新...了解详情

LoRaWAN_stack移植笔记(三)__SPI

stm32相关的配置由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。SPI 的配置SPI使用的是STM32的硬件接口-SPI1 MOSI MIS可以看到例程中,对SPI接口进行了再一层的封装,封装如下其中是原先的STM32Cube库的封装,在此基础上...了解详情

LoRaWAN_stack移植笔记(一)–RF硬件相关

和硬件相关的问题TCXO 的使用根据SX1276数据手册如果使用TCXO,则需要配置RegTcxo寄存器为0x19,代码如下否则配置为0x09,因为芯片上电默认不使用TCXO,即上电寄存器值即为0x09,所以无需配置PA_BOOST 引脚的使用根据sx1276 数据手册如果使用PA_BOOST作为RF输出,则需要配置PaSelect脚为RXTX switch(接收和发送的天线电路的切换在图中...了解详情

LoRaWAN_stack移植笔记 (二)_GPIO

stm32相关的配置由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。另外例程中对STM32库函数的再一次封装的方法也非常值得学习。GPIO 的配置例程中可以看到,对IO口的初始化只有这一句,是因为例程中对GPIO的操作进行了封装,方便了上层的使用。例程中使用Enum定义了64个IO口,其中...了解详情

LoRaWAN实战 中国470频段的代码实现

前言在LoRaWAN协议中文版_配套文件 地区参数(物理层)中已经为中国规划了470频段,因此国内开发者对此需求很强烈。在最新(2017-02-27)的V4.3.1版本协议栈上已经新增了中国470频段。这篇文章从源码角度解析下其实现方式。目前国内的LoRaWAN基站产品都和标准有一些不同,比如CLAA等,所以搞清楚整个代码实现还是很有必要的。只要熟悉了整个流程,对接任何一个基站都不是难事。我正在陆续对协议的各个章节进行翻译,具体其他章节的译文,以及译文之外的代码解析,可点此查看帖子LoRa学习笔记_汇总。本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/源码解析1.前导码格式的源码实现同步字的处理在SX1276的驱动中:void SX1276SetPublicNetwork( bool enable ){SX1276SetModem( MODEM_LORA );if( enable == true ){// Change LoRa modem SyncWordSX1276Write( REG_LR_SYNCWORD, LORA_MAC_PUBLIC_SYNCWORD );}else{// Change LoRa modem SyncWordSX1276Write( REG_LR_SYNCWORD, LORA_MAC_PRIVATE_SYNCWORD );}}而前导码长度则是在每次SetTxConfig和SetRxConfig时配置进去。2.信道频率的源码实现先说上行信道的处理。第一步,初始化时把所有信道6*16=96个上行信道都使能了。LoRaMacParamsDefaults.ChannelsMask[0] = 0xFFFF;LoRaMacParamsDefaults.ChannelsMask[1] = 0xFFFF;LoRaMacParamsDefaults.ChannelsMask[2] = 0xFFFF;LoRaMacParamsDefaults.ChannelsMask[3] = 0xFFFF;LoRaMacParamsDefaults.ChannelsMask[4] = 0xFFFF;LoRaMacParamsDefaults.ChannelsMask[5] = 0xFFFF;第二步,紧接着把96个信道的频点赋值一遍。for( uint8_t i = 0; i < LORA_MAX_NB_CHANNELS; i++ ){Channels[i].Frequency = 470.3e6 + i * 200e3;Channels[i].DrRange.Value = ( DR_5 << 4 ) | DR_0;Channels[i].Band = 0;}第三步,发送时在SetNextChannel中选择合适的频点,默认是96个信道中随机选择。Channel = enabledChannels[randr( 0, nbEnabledChannels - 1 )];这上面是上行信道处理三部曲,下行信道处理则轻松多了。主要是配合接收窗口处理,由这个宏定义了下行的起始频点。具体可以看下面第7点。#define LORAMAC_FIRST_RX1_CHANNEL ( (uint32_t) 500.3e6 )3.数据速率和节点发射功率编码速率编码如下:const uint8_t Datarates[] = { 12, 11, 10, 9, 8, 7 };发射功率编码如下:const int8_t TxPowers[] = { 17, 16, 14, 12, 10, 7, 5, 2 };速率范围如下:/*!* Minimal datarate that can be used by the node*/#define LORAMAC_TX_MIN_DATARATE DR_0/*!* Maximal datarate that can be used by the node*/#define LORAMAC_TX_MAX_DATARATE DR_5/*!* Minimal datarate that can be used by the node*/#define LORAMAC_RX_MIN_DATARATE DR_0/*!* Maximal datarate that can be used by the node*/#define LORAMAC_RX_MAX_DATARATE DR_5/*!* Default datarate used by the node*/#define LORAMAC_DEFAULT_DATARATE DR_0发射功率范围如下:/*!* Minimal Tx output power that can be used by the node*/#define LORAMAC_MIN_TX_POWER TX_POWER_2_DBM/*!* Maximal Tx output power that can be used by the node*/#define LORAMAC_MAX_TX_POWER TX_POWER_17_DBM/*!* Default Tx output power used by the node*/#define LORAMAC_DEFAULT_TX_POWER TX_POWER_14_DBM4.CFList中国没有。具体见OnRadioRxDone中的FRAME_TYPE_JOIN_ACCEPT分支。5.LinkAdrReq命令对于 ChMaskCntl 的处理都在 ProcessMacCommands() 的 SRV_MAC_LINK_ADR_REQ 分支中。小彩蛋一个:你发现没,注释里写着Channel mask KO。不知是djaeckle (loramac-node的作者之一)调皮,还是语言习惯如此。if( chMaskCntl == 6 ){// Enable all 125 kHz channelsfor( uint8_t i = 0, k = 0; i < LORA_MAX_NB_CHANNELS; i += 16, k++ ){for( uint8_t j = 0; j < 16; j++ ){if( Channels[i + j].Frequency != 0 ){channelsMask[k] |= 1 << j;}}}}else if( chMaskCntl == 7 ){status &= 0xFE; // Channel mask KO}else{for( uint8_t i = 0; i < 16; i++ ){if( ( ( chMask & ( 1 << i ) ) != 0 ) &&( Channels[chMaskCntl * 16 + i].Frequency == 0 ) ){// Trying to enable an undefined channelstatus &= 0xFE; // Channel mask KO}}channelsMask[chMaskCntl] = chMask;}6.最大载荷长度/*!* Maximum payload with respect to the datarate index. Cannot operate with repeater.*/const uint8_t MaxPayloadOfDatarate[] = { 51, 51, 51, 115, 222, 222 };/*!* Maximum payload with respect to the datarate index. Can operate with repeater.*/const uint8_t MaxPayloadOfDatarateRepeater[] = { 51, 51, 51, 115, 222, 222 };这在RxWindowSetup()进行处理,调用了最终的驱动函数。if( RepeaterSupport == true ){Radio.SetMaxPayloadLength( modem, MaxPayloadOfDatarateRepeater[datarate] + LORA_MAC_FRMPAYLOAD_OVERHEAD );}else{Radio.SetMaxPayloadLength( modem, MaxPayloadOfDatarate[datarate] + LORA_MAC_FRMPAYLOAD_OVERHEAD );}7.接收窗口处理。RX1的处理在OnRxWindow1TimerEvent()中,满足协议要求。RxWindowSetup( LORAMAC_FIRST_RX1_CHANNEL + ( Channel % 48 ) * LORAMAC_STEPWIDTH_RX1_CHANNEL, datarate, bandwidth, symbTimeout, false );RX2的默认参数见如下宏:#define RX_WND_2_CHANNEL { 505300000, DR_0 }RX2的处理在OnRxWindow2TimerEvent()中:if( RxWindowSetup( LoRaMacParams.Rx2Channel.Frequency, LoRaMacParams.Rx2Channel.Datarate, bandwidth, symbTimeout, rxContinuousMode ) == true ){RxSlot = 1;}速率偏移处理如下:datarate = LoRaMacParams.ChannelsDatarate - LoRaMacParams.Rx1DrOffset;if( datarate < 0 ){datarate = DR_0;}8.默认设置目前基本各地区的参数都一样,因此协议栈也是直接共用如下参数:/*!* Class A&B receive delay 1 in ms*/#define RECEIVE_DELAY1 1000/*!* Class A&B receive delay 2 in ms*/#define RECEIVE_DELAY2 2000/*!* Join accept receive delay 1 in ms*/#define JOIN_ACCEPT_DELAY1 5000/*!* Join accept receive delay 2 in ms*/#define JOIN_ACCEPT_DELAY2 6000/*!* Class A&B maximum receive window delay in ms*/#define MAX_RX_WINDOW 3000/*!* Maximum allowed gap for the FCNT field*/#define MAX_FCNT_GAP 16384/*!* ADR acknowledgement counter limit*/#define ADR_ACK_LIMIT 64/*!* Number of ADR acknowledgement requests before returning to default datarate*/#define ADR_ACK_DELAY 32/*!* Number of seconds after the start of the second reception window without* receiving an acknowledge.* AckTimeout = \ref ACK_TIMEOUT + Random( -\ref ACK_TIMEOUT_RND, \ref ACK_TIMEOUT_RND )*/#define ACK_TIMEOUT 2000/*!* Random number of seconds after the start of the second reception window without* receiving an acknowledge* AckTimeout = \ref ACK_TIMEOUT + Random( -\ref ACK_TIMEOUT_RND, \ref ACK_TIMEOUT_RND )*/#define ACK_TIMEOUT_RND 1000End了解详情

基于Semtech SX1276/SX1278 LoRa的智能酒店门禁方案

SX1276/SX1278智能酒店门禁方案,智能酒店系统摆脱了传统意义上的单独智能系统,将照明系统、智能场景、影音系统、音乐系统、智能云端集中控制系统完美融合,从实现了真正意义上的智慧酒店,让每一位入住酒店的客户享受轻松便捷的生活。替换原来的机械开关,电工轻松搞定。按照说明书即可组网调试,用户自己DIY控制。方便扩展及升级功能,用户可随时增添控制设备。无需专业的技术工程师保障后期系统正常运行该系统提供了安卓& IO...了解详情

为Arduino模拟量传感器添加物联App功能

Karlno从网上淘了两个Arduino传感器,一个光照强度,一个土壤湿度,输出都是模拟量电压的,因为万纳模块有ADC输入功能,于是不需编程,将他们很方便的接到了酷享系统里。【图】光照强度传感器、土壤湿度传感器【图】万纳模块【图】硬件连接硬件连接很简单,将两个传感器的输出口,接到万纳模块的IO1和IO2即可。两个传感器及万纳模块都要供电。实际连接的时候,直接用了万纳模块实验板,用杜邦线就可以完成连接。逻辑上,万纳模块连接传感器,将数据采集并传给酷享系统主机(主节点),主节点类似路由器,自动将数据上报到云端和App中。万纳模块出厂的时候,是空白配置,可以搜索并使用官方的ADC配置。官方ADC配置是将IO1-IO4配置成ADC输入的,我们实际使用了两路。如上图,搜索电压,选择“电压采集设备(百分值)”这个配置,并将它从云端下载下来。配置文件可以通过产品编辑器直接打开查看或者编辑,可以修改成我们需要的功能,不过这里使用默认即可。“电压采集设备(百分值)”这个配置文件,使用了万纳模块的IO1-IO4这四个IO口,将他们配置成了ADC采集,并新建了4个变量,并将ADC采集的结果放到这四个变量里。由于ADC采集的结果实际是一个0-3300的电压值,即0-3.3V。配置文件里通过设置ADC的因子参数为3.3,将ADC采样值除以3.3,得到的就是百分值,这个数值会存储到变量中。附件:电压采样设备(百分值显示)(示范)给酷享系统主机上电,连上网线,通过主机,将配置文件下载到万纳模块中,万纳模块就会被配置成相应功能。如果设计者希望将传感器封装成产品,那可以一次性量产一批万纳模块嵌入到产品中,对于终端用户而言,是不需要接触上述配置工具的。打开App,添加设备,搜索设备类型“电压”,选择”电压采集设备(百分值)“,这个跟刚才的是同一个文件,存储于云端。搜索万纳模块,并添加进去。由于“电压采集设备(百分值)”是一个示范产品,所以没有绑定UI,我们可以搜YwRobot这个UI,将其设置给设备。添加完成之后,就可以点击设备,看到我们模块传来的数据了。任何地方只要手机有网络,都可以看到设备数据。产品型号文件(也就是万纳模块配置文件)及设备UI,可以自己修改,可以本地调试,也可以上传到云,可以实现功能很多,文件见附件。如果使用的主节点是带屏幕的,这些数据可以展示到液晶屏上。可以将传感器数据做成触发源来触发情景动作,比如实现“当光照强度低于60,并且持续了300秒后,就打开灯光或者插座”之类的联动。联动是脱离手机运行的,不需要App在线。附件:UI感谢YwRobot厂商提供的传感器及相关资料、资源。了解详情

如何使用Microchip的LORA模块,以加快物联网设计

LoRaWAN提供了很好的匹配,以物联网的需求,性能特点。除了它的扩展工作范围和低功耗的要求,LoRaWAN提供安全,灵活的通信选项。然而,为了实现一个LoRaWAN溶液所需的硬件和软件可以证明一个主要障碍集中在物联网应用程序本身的开发团队。本文将详细阐述了MicrochipTechnology的第1部分介绍RN2903 LORA模块,并展示如何使用一些额外的硬件和软件,用它来实现远距离,低功耗设计,物联网。快速入门套件Microchip Technology的RN2903 LORA模块是一个物联网设计近投递LoRaWAN硬件解决方案。即便如此,它仍然只是一个完整的LoRaWAN网络的基石,开发者仍然必须考虑支持硬件和软件系统。Microchip的满足这一需求提供全面的评估套件,提供了实现LoRaWAN对物联网所需要的其他元素。正如第1部分所提到的,MicrochipTechnology的RN2903支持LoRaWAN兼容的通信频率为915MHz,旨在简化物联网应用的开发。全面认证,Microchip的模块包括了实现LoRaWAN连接(图1)所需的所有组件。该模块的命令处理器采用板载LoRaWAN固件完全支持LoRaWAN类的协议。板载EEPROM提供存储用于LoRaWAN配置参数,从而提高性能和减少主机和模块之间的数据传输增加的安全性。图1:Microchip的LORA模块提供了LoRaWAN连接,其板载命令处理器,LoRaWAN协议栈,射频收发器和串行连接一个简易的解决方案。(图片来源:微芯片科技)Microchip的RN2903模块提供与外部MCU主机通信的专用UART接口。此外,该模块包括14 GPIO引脚,开发者可以使用模块固件监视或控制外部设备,如开关和LED编程。最后,该模块提供了方便的连接到一个简单的套偶极天线的射频信号引脚。模块的命令处理器根据通过其UART接口从外部主机MCU接收的命令执行LoRaWAN交易。正如任何网络通信的方法,LoRaWAN消息被发送,并在特定的格式接收。对于LoRaWAN的LORA联盟标准规定了在字节级苛求细节这些格式。该RN2903模块提供了一个直观的基于文本的方法,抽象LoRaWAN标准字节级别的格式为一组关键字的使用可选参数命令。Microchip的定义了三种类型的关键字:MAC的LoRaWAN MAC配置和控制命令无线电指令针对PHY无线电层SYS额外的模块功能,如提供模块固件版本的信息或访问模块的EEPROM存储器命令例如:mac tx uncnf 30 23A5发送端口30的数据值“2,3,4,5-”的消息。的“uncnf”选项表示设备没有请求从网络服务器确认。或者,使用“CNF”选项表示该设备预计网络服务器确认收到。的洛拉模块负责将其发送到它的网关以便传递到网络服务器之前加密该消息。radio tx 6d657****765发送含有值[0x6d]一揽子[0x65] [0x73] [0x73] [0x61] [0x67] [0x65(十六进制示例文本字符串“消息”)sys set nvm 100 FF存储该值为0xFF在EEPROM中的用户分区的地址为0x100物联网设备设计凭借其串行接口,RN2903需要一些额外的组件来实现兼容LoRaWAN,物联网的硬件设计。Microchip的进一步发展速度与RN2903 LORA莫特。为了证明其LORA模块功能,Microchip的LORA莫特提供实现LoRaWAN兼容的无线传感器需要一套完整的硬件和软件。Microchip的RN2903 LORA莫特和RN2483 LORA莫特各结合各自的LORA模块与MicrochipPIC18LF45K50 8位MCU,作为传感器的操作和LoRaWAN协议执行主处理器。此外,莫特包括用于采集样品的数据,以及用于用户反馈的液晶显示光传感器和温度传感器。该莫特通过一个标准的USB接口,它提供了访问LORA模块的UART接口连接到主机。在开发过程中工程师们可以通过发送执行LoRaWAN操作MAC,无线电和SYS命令字符串使用莫特的USB连接的模块。在运行期间,物联网设备主机上运行的代码会发出需要的物联网应用的命令和处理响应。对于LoRaWAN应用,Microchip提供的硬件莫特丰富的C软件库。例如,一个应用程序级例程,MOTEapp.c,收集的传感器数据,并通过LoRaWAN连接发送数据,处理由RN2903预期低级MAC命令(清单1)。            . . .            moteApp_clearBuffers();            // Make Sure Port is in allowed Range            // Prepare DataBuffer for Tx            light = 0;            temperature = 0;            NOP();                      // Measure Sensors            moteApp_setSensorsInput();            uint8_t sizeOfUpdate = 0;            light = moteApp_convertSensorValue(moteApp_getLightValue());            oled_putString(moteApp_getLightString(), 6, 1);            sizeOfUpdate = moteApp_addToDataBuffer(moteApp_getLightString(), 4);            temperature = moteApp_convertSensorValue(moteApp_getTempValue());            temperature = ADC_TempConversion(temperature);            moteApp_add8bToDataBuffer(temperature, 4 + moteApp_lightStringSize() + 1);            // Do Normal Operation            . . .            // Getting Random Channel            randomPortNum = TMR2_ReadTimer();            . . .            // Prepare DataBuffer for Tx            moteApp_add8bToDataBuffer(randomPortNum, 0);            dataBuffer[3] = 0x20;            NOP();            sendDataCommand("mac tx uncnf ", dataBuffer, 12);            . . .清单1:Microchip提供C语言软件演示样本物联网的应用程序,收集从莫特的光照和温度传感器的数据,建立与数据(消息add8bToDataBuffer),发送消息(sendDataCommand使用MAC TX命令)。(代码源:微芯片科技)应用级开发随着简单的基于关键字的命令方式,Microchip的LORA模块和相关莫特开发板显著简化LoRaWAN终端设备的发展。然而,即使在系统级莫特板及其相关软件地址LoRaWAN层次仅是最低的,终端设备的水平。一个完整的LoRaWAN兼容网络需要额外的硬件部件,包括兼容网关(S)和一个网络服务器。此外,在实施的物联网应用,开发者必须处理的LORA联盟标准只涉及标准OSI堆栈的最低水平这一事实。其结果是,开发者需要完成的其他联网层,开始与位于由LoRaWAN MAC标准寻址的数据链路层之上的OSI网络层。微芯片的地址这一需要使用实现一个完整LoRaWAN兼容网络,包括端设备,网关和网络服务器的硬件和软件开发工具包。Microchip的RN2903LORA网络评估工具包和RN2483 LORA网络评估套件捆绑一对微尘与Microchip的LoRaWAN网关板。董事会是由LoRaWAN网关核心板和相关的无线子卡完整的天线和电缆。在软件方面,该试剂盒使用从MicrochipLORA技术评估套件提供所有全面评估的示例LORA系统所需的软件组件(图2)。图2:Microchip的LORA网络评估套件和软件套件实现完整的LoRaWAN的网络应用,包括终端设备(莫特板),网关(核心板)和网络服务器(mchplora)。(图片来源:微芯片科技)该套件提供了一个网络服务器(mchplora)的设计使其在开发系统的虚拟机上运行泊坞窗容器。网关主板通过USB连接到开发系统和无线方式与莫特板通信。该莫特板通过制定系统的USB到基于Java的开发实用程序连接。设计与评估套件工作,Microchip的LORA开发套件提供了一个全面的Java套件,提供了更为丰富的比提供的服务与莫特C ++类库。例如,发送一个MAC传输,开发套件抽象相关交易一个简单的execute一个方法macTX类(清单2)。  void macTXSendAction()  {    if (this.application.device.updateValueFlag)      this.application.device.wanPojo.setData(this.data.getText());    if (this.application.device.updateValueFlag) {      this.application.device.wanPojo.setPortNumber(this.portNumber.getText());    }    ICommand macTX = CommandFactory.getCommand(CommandFactory.mactx);    DeviceModel currDev = this.application.device;    macTX.setDataModel(currDev);    List task = new ArrayList();    task.add(macTX);    if (currDev != null)      this.application.mvcController.execute(task);    else      System.err.println("Current Device not set");  }清单2:Microchip的LORA开发套件提供了一个完整的LoRaWAN环境,包括一系列广泛的Java包(JAR文件)的抽象LoRaWAN交易,如MAC TX到一组简单的软件电话等macTXSendAction()。(代码源:微芯片科技)在清单2中,CommandFactory在定义的类LoRaDevUtility.jar定义  public static String mactx = "mac tx";然后创建适当的类的一个实例,在这种情况下,一macTx类对象,当工厂称为CommandFactory.mactx:    if (command.compareTo(mactx) == 0)      return new macTX();该macTX.class在LoRaDevUtility.jar提供运行时配置值和各种服务功能,如数据包验证,以及该类的主要实用方法execute。该execute方法创建所需的MAC TX规定格式字符串命令,传送消息(WriteI2cData),然后获取响应:       . . .command = new StringBuilder().append("mac tx").append(((DeviceModel)this.server).wanPojo.getIsConformed()).append("").append(((DeviceModel)this.server).wanPojo.getPortNumber()).append("").append(((DeviceModel)this.server).wanPojo.getData().replace("0x","")).toString();       . . .        byte[] data = command.getBytes();        ((DeviceModel)this.server).getController().transport.WriteI2cData(this.processPacket.pack(data), null, this.timeout);        byte[] read = null;        read = super.readResponseData();结论有效连接是由低功率的IoT器件的海量数的IoT网络的基本要求。LoRaWAN提供了一个有效的物联网连接解决方案,以提供最低的功率要求远距离操作。与任何连接选项,可实现在证明自己的一大创举,从他们的主要集中在物联网应用本身分心开发。基于Microchip的RN2903 LORA模块,MicrochipTechnology的LORA网络评估套件和相应的LORA开发套件提供完整的应用LoRaWAN。使用预认证的硬件和软件的组合,开发人员可以快速调出能够实现15公里无线范围和10年的电池寿命的物联网连接解决方案。了解详情

如何设计高品质LoRa无线模块

“炮制虽繁必不敢省人工,品味虽贵必不敢减物力”-百年同仁堂古训从14年至今,本着追求极致的工匠精神,锐米通信迭代设计了5版LoRa无线模块,最终达到高品质。干过射频设计的工程师都知道,因为高频电路敏感,元器件微小测试仪器精密;每一版设计,不但凝聚心血,还需要真金白银的投入。为此,我们分享LoRa射频设计的一些经验,只为您(们)不必再掉进这些“坑”。1 原理图在14年,获取一份SX1276/8的原理图,得找semtech的代理商;现在,可以直接从官网上获取:http://www.semtech.com/apps/filedown/down.php?file=SX1276RF1KAS_e269v01a.zip需要注意的是:官方是针对SX1276的射频电路,如果使用SX1278,需要处理HF引脚;官方有多个中心频点的物料BOM,在国内,一般使用490MHz中心频点;PE4259接天线的电路,根据天线性能,需要修改电容和电感值;2  PCB图尽管二层板也能工作,还是强烈建议使用四层板设计,它的优势很明显:稳定性高,抗干扰能力强,电路板的电磁兼容得到了很大的改善。独立的电、地层可以使所有的信号环路面积最小;电源层和地层形成较大的分布电容,为电源提供了很好的高频解耦作用,从而减小了电源线上的噪声;当然,四层板的价格比二层板贵得多,尤其是首次制作的工程费用更高。根据原理图设计PCB后,千万记得提交给semtech公司官方review。锐米通信的PCB经过semtech官方2次review,性能有明显的提升。在此,感谢科通(深圳)黄工和semtech(深圳)刘工的审核。3 电感电容直接用官方推荐的元器件吧,它保证精度和性能,唯一的缺陷是物料成本高。特别注意,要使用绕线电感,叠层电感虽然便宜,但是性能欠佳。锐米通信全部采用muRata品牌,这是国际公认的优秀品质。4 温补晶振按SX1276/8的数据手册,LoRa可以使用廉价的XTAL(无源晶振),仅当BW低于62.5kHz时,才建议使用TCXO(温补晶振)。然而,根据我们的测试经验,建议使用高品质的TCXO:具备温补功能,让处于不同温度(如室内和室外)的LoRa模块无线电频率最大化接近,可以有效提高解码率,从而提升通信质量;良好的抗老化,让不同寿命(先期部署和后期部署)的LoRa模块频偏最小,从而保证通信成功率;以锐米通信使用的NDKTCXO:它的最大功耗仅1.5mA,最大温漂仅2.5ppm,最大老化率仅1ppm/年。当然,它的价格昂贵,是普通XTAL的好几个倍。5 频谱实验每设计一版射频电路,至少得使用频谱仪进行遍历实验,我们使用Tektronix RSA5100A real- time signal analyzer。频谱仪测试选项很多,上2张中心频点为470MHz的测试照:6  SMT生产LoRa射频是高频电路,0402器件很微小,生产只能使用高精密SMT机器,才能保证品质和合格率。我们的生产机器为:7 自动化测试为保证100%合格率,每一片LoRa无线模块,锐米通信都会采用工装仪器进行自动化测试。除检测UART、SPI和RTC等外设外,还通过若干次RF通信,统计计算射频性能分数。测试结果如下图所示:关于LoRa无线模块更多资料,请链接:http://www.rimelink.com/pd.jsp?id=20了解详情

LoRa网关、节点性能常用数据整理和统计

本文包含一些用到的一些LoRa网关、节点相关的参数,供方案设计人员参考。LoRa网关处理能力1个1301芯片,8个上行通道,24小时可以接收约150万个数据包。每个设备每小时上报一次,可以处理约62500个设备。下面见官方资料What is the capacity of LoRa gateway? How many nodes can be connected to a single gate...了解详情

LoRa点对点系统9 下载源代码与前路思考

1 源代码下载地址源代码可以从以下链接下载http://download.csdn.net/detail/jiangjunjie_2005/96634522 开发环境与工具硬件平台:锐米LoRa终端http://www.rimelink.com/pd.jsp?id=2测试套件:USB转串口 + LoRa终端转接板https://shop140974727.taobao.com/?spm=2013.1.1000126.d21.DL6hVR仿真器:  ST LINK V2https://item.taobao.com/item.htm?spm=2013.1.20141002.4.Sj743Y&scm=1007.10009.31621.100200300000004&id=540446816750&pvid=8a31520e-d2bd-4a21-b940-aa421c82d92dIDE环境:IAR for STM8 http://www.rimelink.com/nd.jsp?id=33&_np=105_3153 评估软件3.1 下载评估软件下载评估软件链接:http://www.rimelink.com/nd.jsp?id=38&_np=105_3153.2 使用评估软件使用该软件请参考《锐米LoRa终端评估软件操作手册》,链接地址为:http://www.rimelink.com/nd.jsp?id=38&_np=105_315思考题:路往何方1 点对点系统局限性LoRa点对点系统在现实中有少量的应用场景,如:使用手持机“点名”抄能源表计(电/水/气/热表计),远程控制阀门等。当然,它的局限性是很明显的:1. 没有避免冲突机制:没有LBT(Listen BeforeTalk)机制,如果2个节点同时发送,无线电信号将受损,导致通信失败;2. 接收节点无法低功耗:接收节点必须随时等待发送节点的信号,无法休眠;3. 无法自动组网:解决不了避免冲突和低功耗侦听,组网也就成了空中楼阁。2  LoRa+mesh可行吗?在FSK调制的微功率射频时代,mesh是主流方案,表面看,它具备:多跳延伸通信距离,多路径保证通信链路健壮性,避免冲突,低功耗侦听等优点;然而,深入研发的工程师都知道它有以下缺陷:1. 延时大:当一个数据包经过几跳传输后,实时性就很难保证;2. 不可靠:跳跃转发越多,丢失数据包的机率就越大,尤其是通信链路受干扰或信号微弱的情况下;3. 耗电大:mesh网中负责转发的节点能耗很大,最终整体网络将陷入瘫痪;4. 很复杂:多跳转发和多径路由,本身就复杂,这给开发和维护带来困难。也正因为上述缺陷,像ZigBee一直没有占据主导地位;LoRa是从物理层面(调制技术)实现了长距离和低功耗,因此它的“基因良好”,天生就可以绕过上述4个坑。除非常特殊的场景(如:军用或救灾),一般LoRa是不需要mesh组网的。锐米通信于2年前研发过一个LoRa+mesh的网络系统,后来团队发现,应用于产品不合适;当然,对于科研机构,该系统可能具备研究价值。如果您对于该系统感兴趣,我们提供源代码。申请Email:sales@rimelink.com3  星型网关LoRa因为长距离的优势,使用星型网络成为最佳的选择,它具备很多优势:1. 延时小:因为是单跳,一次性传播,延时是可控的;2. 高可靠:那怕链路受干扰或信号微弱,借助LoRa抗干扰优势,星型网络仍能提供可靠的通信;3. 能耗低:双方可以协商唤醒时刻,空闲时休眠,实现低功耗;4. 简单化:星型网在网络拓朴中非常简单,可以大幅降低开发和维护成本。锐米通信开发的第2代LoRa系统,就是星型网络,它除了低功耗和长距离还,特别擅长超低功耗唤醒技术。了解更多详情,请链接:http://www.rimelink.com/nd.jsp?id=44&_np=105_315了解详情

LoRa点对点系统8 测试

1 测试环境1.1 测试工具PC机2台;锐米LoRa终端2个;USB转串口套件2个;锐米LoRa终端评估软件;1.2 搭建平台如下图所示,2个LoRa终端,分别通过USB转UART连接2台PC,终端之间通过LoRa无线通信。这样一来,PC#i发送的数据,PC#j能远程接收;反之,亦然。2 集成测试2.1 测试目的将LoRa终端和PC评估软件联合测试,使它们能够正常运行。2.2 测试内容
步骤方法结果
使用PC评估软件,遍历测试LoRa终端的接口协议;
发送RF数据包,Comm2Trm和Network进程正常工作;
接收RF数据包,Comm2Trm和Network进程正常工作;
设置参数,2个进程和SystSettings模块正常工作;
3 功能测试3.1 测试目的功能测试指按产品说明书,逐项测试列举的功能。3.2 测试内容
测试对象测试内容测试结果
读取软件版本使用PC评估软件,读取LoRa终端的软件版本
发送数据发送字节从1到247,都能够正确发送
配置射频参数...
了解详情

LoRa点对点系统7 剖析核心代码

1 引言在LoRa点对点系统中,核心是Network进程的处理代码,它除了响应用户发送无线数据包外,还需要驱动射频和响应多种中断信号。为此,我们列出该进程的逻辑,并且剖析它的代码。2 核心代码逻辑有2个特别注意的地方:1. 如果RF_Rx_Error,需要重新启动RF接收功能,以避免引发宕机错误;2. RF缓冲区中有多个数据包时,给自身发poll消息,让其他进程有机会运行。3 剖析核心代码PROCESS_THREAD(NetworkProcess, ev, data){/*ATTENTION: stack variables can NOT cross any “XX_YIELD()”. */uint8_t    byDataSize;uint16_t    wCalcCRC16;uint16_t    wSrcCRC16;PROCESS_BEGIN();SX1278Receive(0);while(TRUE){PROCESS_YIELD();if (NETWORK_EVENT_TX_RF_PACKAGE == ev)                                                      1{/* Make RF package as well as TX it. */wCalcCRC16= util_CRC16( s_stTxRFPackage.a_byBuf,s_stTxRFPackage.byRFTxSize );*(uint16_t *)&s_stTxRFPackage.a_byBuf[s_stTxRFPackage.byRFTxSize] =wCalcCRC16;SX1278SetSleep();                                                                                                       2SX1278Send( s_stTxRFPackage.a_byBuf,s_stTxRFPackage.byRFTxSize +sizeof(uint16_t));                               3/* Waiting until TX is done. */PROCESS_YIELD_UNTIL( RF_Tx_Done == s_tRFResult ||RF_Tx_Timeout ==s_tRFResult );                                  4/* Enable RF_RX. */SX1278Receive(0);                                                                                                       5}else                                                                                                                                6{if (RF_Rx_Error == s_tRFResult){/*EXPLAIN: Restore the RX of RFif Rx-Error or frame is NOT integrity. */SX1278SetSleep();                                                                                                     7SX1278Receive(0);}/* EXPLAIN: process all received packets for simplicity. */if (!IsRadioBufEmpty()){/* Fetch data from RF buffer, CheckCRC16. */s_stParseRFBuf.bySize = GetRadioBuf(s_stParseRFBuf.a_byBuf,RF_FIFO_SIZE); 8if (sizeof(uint16_t) < s_stParseRFBuf.bySize){byDataSize = s_stParseRFBuf.bySize – sizeof(uint16_t);wSrcCRC16 = *(uint16_t *)&s_stParseRFBuf.a_byBuf[byDataSize];wCalcCRC16 = util_CRC16(s_stParseRFBuf.a_byBuf, byDataSize);if (wSrcCRC16 == wCalcCRC16)                                                                             9{/* Deliver data to Comm2Trm-Process */comm2trm_RxRFPackage(s_stParseRFBuf.a_byBuf, byDataSize);                     10}else{/*EXPLAIN: Restore the RX of RF if Rx-Error orframe is NOT integrity. */SX1278SetSleep();                                                                                                11SX1278Receive(0);}}/*if*//* Check whether some packages still stay in buffer. */if (!IsRadioBufEmpty())                                                                                               12{/* Don’t disturb the scheduling ofother processes. */process_poll(&NetworkProcess);}}/*if (!IsRadioBufEmpty())*/}}/*while(TRUE)*/PROCESS_END();}Line#1:用户需要发送RF数据包;Line#2:将处于持续接收的RF设置休眠状态;Line#3:通过SX1278发送该RF数据包;Line#4:阻塞进程,直到RF发送数据包完毕;Line#5:将RF切换到持续接收模式;Line#6:射频中断服务程序发来消息:接收到数据包,或,接收错误;Line#7:RF接收出错,重新启动RF接收功能,避免宕机错误;Line#8:从RF缓冲区复制数据包到解析工作区;Line#9:检查接收数据包的CRC16是否正确;Line#10:交付接收数据给Comm2Trm进程;Line#11:如果数据包的CRC16错误,重新启动RF接收功能,避免宕机错误;Line#12:如果RF缓冲区还有数据包,给自身发poll消息,允许Contiki调度其他进程运行。了解详情

LoRa点对点系统6 源代码结构

1 源代码结构main.c      基于C语言系统的入口函数main.h      系统的全局配置文件Application  应用程序,以Contiki系统的protothread方式组织Contiki      Contiki操作系统Driver       驱动:ST官方驱动库和MCU外设驱动文件Project      IAR环境下所有工程文档RF         SX1278射频芯片驱动代码2 使用源代码在源代码文件main.h中,有如下宏编译语句:#define CUR_PRODUCT    iWL882A#define REL_VER    1 /* 0=debug; 1=release */#define CUR_VER    “LoRaP2PTW V1.0.00 2016-10-20” /*current version */它们代表如下含义:CUR_PRODUCT:当前LoRa终端的硬件版本号,目前出厂为iWL882A;REL_VER:0=debug版本,串口支持shell命令;1=release版本,串口与评估软件通信;CUR_VER:软件版本号,其中“LoRaP2PTW”不能更改,因为评估软件依赖该版本编号来识别产品种类;3  Main入口函数void main(void){/* Initialize hardware */chip_Init();                                                                                                   1SX1278InitPins();                                                                                        2rtimer_init();                                                                                                 3ss_Init();                                                                                                       4cpc_Init();                                                                                                        5#if (!REL_VER)dp_Init();                                                                                                      6#endif/* EXPLAIN: enable INT before initialize process! */HAL_ENABLE_INTERRUPTS();                                                                 7/*Initialize contiki system */process_init();                                                                                              8/* Start process of user */comm2trm_Init();                                                                                          9network_Init();                                                                                            10#if (!REL_VER)monitor_Init();                                                                                             11#endifwhile (1){while (0 < process_run())                                                                       12{null();                                                                                                  13}/* EXPLAIN: Set MCU to low power mode if have nothing to do. */wfi();                                                                                                       14}}Line#1:初始化MCU时钟和引脚等;Line#2:初始化连接SX1278的SPI总线和中断控制线;Line#3:初始化rtimer(高精度实时时钟);Line#4:初始化SystSettings(系统参数)模块;Line#5:初始化通信串口,它连接PC;Line#6:如果是Debug版本,初始化调试串口;Line#7:使能MCU硬件中断;Line#8:初始化Contiki的进程模块;Line#9:初始化comm2trm模块,同时启动comm2trm进程;Line#10:初始化network模块,同时启动network进程;Line#11:如果是Debug版本,初始化monitor模块,同时启动monitor进程;Line#12:Contiki主循环函数,根据post和poll消息,调用对应的进程;Line#13:空语句,为代码可读性而添加;Line#14:节能指令,如果MCU空闲则进入WFI模式,可以被任意中断唤醒。了解详情

LoRa点对点系统5 数据结构与算法

1 Comm2Trm进程1.1处理UART数据帧为节省内存,接收与处理UART数据“复用”了缓冲区,如下图所示:UART驱动:#1:一个接一个将接收的UART数据存储到缓冲区;#2:接收一完整UART帧后,发消息给进程通知处理;Comm2Trm进程:#3:给缓冲区加锁,解析UAR帧;#4:组织UART回应帧;#5:通过UART发送回应帧,给缓冲区解锁。为什么要给缓冲区加锁和解锁呢?如下图的时序逻辑所示:进程“锁定”缓冲区期间UART驱动无法向缓冲区中写数据,因此也不会“竞态打扰”进程处理该数据帧。1.2 发送RF数据包#1:UART一个接一个输入数据到缓冲区COMM_TRM_DATA;#2:当接收一完整帧结束后,UART_ISR给进程poll消息;#3:进程解析和处理该UART数据帧;#4:进程拷贝用户数据到缓冲区TxDataBuf;#5:Network进程从缓冲区TxDataBuf提取数据,通过RF发送。1.3 接收RF数据包#1:Network进程存储接收数据到缓冲区RxDataBuf;#2:Network进程post消息给Comm2Trm进程;#3:Comm2Trm进程组织该数据为UART帧;#4:进程通过UART口发送该数据帧。2 Network进程2.1发送RF数据包#1:从Comm2Trm进程提取发送数据到packetbuf;#2:基于packetbuf组织RF数据包;#3:通过RF发送packetbuf中的RF数据包;2.2接收RF数据包#1:RF接收的数据包存入RadioBuf,并poll进程;#2:进程从RadioBuf拷贝数据包到ParseRFBuf;#3:进程解析该RF数据包;#4:提取用户数据,交付给Comm2Trm进程;2.3 逻辑流程3 SystSettings模块为简化设计,定义了NetSettings_t数据结构,它的“主本”存储在SystSettings模块的EEPROM中,Comm2Trm和Network这2个进程各自拥有一个“副本”。1.上电时,Comm2Trm和Network这2个进程各自从“主本”拷贝“副本”;2.任意一方修改“NetSettings_t”的副本数据,必须:①存储到“主本”之中;②通知“另一方”同步更新副本数据。了解详情

LoRa点对点系统4 进程通信

1 Comm2Trm进程1.1 接收RF数据包,发送给PCt0时刻:Network进程通知Comm2Trm进程(简称进程),接收到RF数据;t1时刻:进程封装数据为UART帧,通过UART端口发送;t2时刻:UART端口启动发送;t3时刻:UART发送完毕,ISR执行扫尾工作(清除硬件中标标识等);1.2 接收PC数据帧,通过RF发送t4时刻:UART接收到来自PC的UART数据帧,poll进程;t5时刻:进程提取UART帧中用户数据,通知Network进程;t6时刻:Network进程通过RF发送该数据帧。2 Network进程2.1 接收PC数据帧,通过RF发送t0时刻:Comm2Trm进程通知Network进程(简称进程),接收到UART数据;t1时刻:进程封装数据为RF包,通过RF端口发送,阻塞自身;t2时刻:RF启动发送;t3时刻:RF发送完毕,ISR执行扫尾工作,通知进程;t4时刻:进程恢复运行,切换RF到RF模式;2.2 接收RF数据包,发送给PC接收RF数据包,发送给PC。t5时刻:RF接收到数据包,poll进程;t6时刻:进程处理该RF数据包,通知Comm2Trm进程;t7时刻:Comm2Trm进程了解详情