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
您的留言或需求: