LoRa开发5:发送随机数据

1 引言

学习需要循序渐进,做开发也不例外。在LoRa终端开发中,最简单的代码是通过SX1278发送数据帧。因此,我们先从发送开始,了解初始化SX1278和建立Contiki进程的入门知识。

2 整体逻辑流程

发送数据帧的整体逻辑流程如下所示,很明显,进程是一个无限循环:生成随机数据帧-> 发送 -> 生成随机数据帧 ->…

3 初始化SX1278

初始化SX1278的代码清单如下,它主要完成射频参数的配置。

static void InitSetLoRa(void)

{

SX1278Init(&s_stRFEvents);                                                   1

SX1278SetFreq(RADIO_FREQ);                                             2

SX1278SetPAOutput(PA_OUTPUT_PIN_BOOST);                3

SX1278SetTxPower(20);                                                          4

SX1278SetPreambleLen(6);                                                     5

SX1278SetLowDatarateOptimize(FALSE);                               6

SX1278SetFixLen(FALSE);                                                       7

SX1278SetCrcOn(TRUE);                                                         8

SX1278SetRxContinuous(TRUE);                                             9

SX1278SetBandwidth(RF_BW_500000);                                10

SX1278SetSpreadingFactor(RF_SF_7);                                  11

SX1278SetCodingRate(RF_FEC_4_5);                                   12

SX1278SetLoRaSettings();                                                      13

SX1278SetTxTimeout(SX1278GetTimeOnAir(255) + 10);       14

return;

}

Line#1:传递一个回调函数指针数组给SX1278驱动,这样一来,当射频中断发生时,

可以让调用者执行必需的动作 (一般用于给进程发消息)。该原理的解释,

请链接:http://blog.csdn.net/jiangjunjie_2005/article/details/52798757

Line#2:设置频率为470MHz;

Line#3:使用PA(Power Amplifier,功率放大器)引脚输出;

Line#4:设置发射功率为最大值20dBm;

Line#5:设置preamble(前导码,用于接收同步)长度为6,根据我们多年的测试经验,

6是最小值,低于该值将会导致接收误码率上升;

Line#6:关闭低速率优化功能:当symbol驻空时间超过16ms时,打开此选项可以提高

LoRa链路健壮性。注意:发送和接收双方必须设置一致!

Line#7:允许发射数据帧长度可变;

Line#8:使能SX1278对接收数据帧payload进行CRC16校验;

Line#9:使能持续接收;

Line#10:设置BW为500kHz;

Line#11:设置扩频因子为7,即1symbol(每bit用户payload),LoRa扩频到

2^7=128 chip(实际发射信号);

Line#12:设置前向纠错码,每发送4symbol,添加1symbol纠错码;

Line#13:将设置参数写入SX1278寄存器(批量操作提高效率);

Line#14:设置发送超时为最大值(使用MCU定时器避免SX1278发送宕机);

4 进程时序

t0时刻:进程生成随机数据帧,并发送;

t1时刻:SX1278启动发送;

t2时刻:SX1278发送完毕,中断服务程序poll进程;

t3时刻:进程打印发送次数,再次生成随机数据帧和发送;

5 代码剖析

PROCESS_THREAD(TxRandData, ev, data)

{

/*ATTENTION: stack variables can NOT cross any “XX_YIELD()”. */

RF_FRAME_RAND_DATA    *p_stFrameData;                                                            1

staticint32_t    s_lTxRandCnt = 0;

PROCESS_BEGIN();                                                                                                    2

InitSetLoRa();                                                                                                                3

while(1)                                                                                                                         4

{

/* Makethe frame of random data, TX it. */

p_stFrameData= (RF_FRAME_RAND_DATA *)s_abyTxRFBuf;

MakeRandData(p_stFrameData->a_byBuf, sizeof(p_stFrameData->a_byBuf));        5

p_stFrameData->wCRC16= util_CRC16( p_stFrameData,

GET_ST_FLD_OFFSET(RF_FRAME_RAND_DATA, wCRC16));                         6

SX1278Send(s_abyTxRFBuf, sizeof(RF_FRAME_RAND_DATA));                            7

/* Block process until Tx Done or timeout. */

PROCESS_YIELD_UNTIL( (RF_Tx_Done == s_tRFResult) ||

(RF_Tx_Timeout == s_tRFResult) );                              8

++s_lTxRandCnt;

RIME_DBG(RIME_DBG_ON, “Tx Rand Cnt=%ld\r\n”, s_lTxRandCnt);                      9

}

PROCESS_END();                                                                                                        10

}

Line#1:小心!在Contiki系统自动变量不能跨越阻塞语句,详细原因请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/44725997

Line#2:Contiki进程的第一条语句,详解请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/44600365

Line#3:初始化SX1278;

Line#4:一般而言,进程都是无限循环;

Line#5:生成随机数据;

Line#6:计算CRC16,宏GET_ST_FLD_OFFSET()用于取结构体中域的偏移;

Line#7:发送随机数据帧;

Line#8:阻塞进程,直到发送数据帧结束或超时;

Line#9:打印总发送次数,RIME_DBG()的原理和使用,请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/51869953

Line#10:Contiki进程的最后一条语句,详解请链接:

http://blog.csdn.net/jiangjunjie_2005/article/details/44600365

说明:LPWA物联网应用站(LPWAP.com)通过公开互联网收集、整理并转载有关LPWA物联网应用解决方案,以供广大LPWA应用开发者和爱好者共同学习交流和参考运用到实际生产生活中。本站所有转载的文章、图片、音频、视频等资料的版权归版权所有人所有并衷心感谢您的付出,由于本站采纳的非本站原创文章及图片等内容无法一一联系确认版权者,如果本网所选内容的文章原创作者认为其作品不宜放在本站,请及时通过以下留言功能通知我们采取适当措施,避免给双方造成不必要的经济损失。如果您希望保留文章在本站,但希望文章末尾提供对作者的致谢或者产品、网站交换链接的,也请将需求写入以下留言栏中,谢谢您的支持。让我们共同努力,打造万物互联的未来美好生活!

您的留言或需求: