LoRa开发5:发送随机数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangjunjie_2005/article/details/52824184

发送随机数据

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


没有更多推荐了,返回首页