在LoRa终端与LoRa网关和服务器联调之前,有时候需要通过相对简单的PingPong终端序给Class A/B/C类型的终端发送数据,以验证Class A/B/C终端可以正常收发数据包。然而原生提供的 PingPong与Class A/B/C类型终端之间是无法发送数据帧的。
经过一番深入调研,发现主要有如下的几个原因,导致这两种应用程序之间无法发送物理层的帧,解决了这些问题,会对LoRa的射频芯片的物理层和相应的软件驱动程序有一个更加深入的理解。
先总结如下:
原因1:频点
问题原因:
PingPoing测试应用程序采用的TDD的模式,上下行采用了相同的频点,如470300000。
Class A/B/C的470频带,采用是的FDD模式,上行的发送频率是470300000,而下行的接收频点为:
CN470_FIRST_RX1_CHANNEL 500300000 CN470_RX_WND_2_FREQ 505300000
解决办法:
修改PingPoing的接收和发送频点到500300000#define RF_FREQUENCY 500300000 //470300000 // Hz
原因2:频点变化
PingPoing采用单一频点,且采用了相同的频点:470300000
CN470 Band,26M主频时,上行发送有连续的96个频点,下行接收有连续的48个频点。
因此,因此PingPoing的发送的数据,Class A/B/C类型终端肯定收不到。
解决办法:
固定化Class A/B/C类型终端的接收频点: bool RegionCN470RxConfig( RxConfigParams_t* rxConfig, int8_t* datarate )
{
//frequency = CN470_FIRST_RX1_CHANNEL + ( rxConfig->Channel % 48 ) * CN470_STEPWIDTH_RX1_CHANNEL;
frequency = CN470_FIRST_RX1_CHANNEL + CN470_STEPWIDTH_RX1_CHANNEL;
}
无
原因1: LoRa同步字
PingPong终端程序使用了默认的LoRa同步字:,属于private network的配置。
#define LORA_MAC_PRIVATE_SYNCWORD 0x1424
LoRaWAN的终端,采用的是公网的配置:
#define LORA_MAC_PUBLIC_SYNCWORD 0x3444
解决方法:
在main()函数中增加对public network下同步字的设定,代替默认的配置。
Radio.SetPublicNetwork(1);
原因2: IQ翻转
PingPong终端程序的IQ翻转未使能。
ClassA-C终端的的IQ翻转使能。
解决办法:
PingPong终端程序的IQ翻转使能。
#define LORA_IQ_INVERSION_FLAG 1 // from 0 t0 1
Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, LORA_FDEV_NA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, LORA_PHY_PREAMBLE_LENGTH, LORA_PHY_PAYLOAD_LENGTH_FLAG, LORA_PHY_PAYLOAD_CRC_FLAG, LORA_FREQ_HOP_FLAG, LORA_FREQ_HOP_PERIOD, LORA_IQ_INVERSION_FLAG, TX_TIMEOUT_VALUE);
原因1:发送与接收窗口不对齐
PingPong终端程序定时发送,如5s。
ClassA-C有一定的接收窗口,即使classC, 其实也并不是一直设置在Rx模式。
解决办法:
case DEVICE_STATE_CYCLE: { printf("state: DEVICE_STATE_CYCLE=%d\r\n", DeviceState);
printf("Turn Rx on\r\n"); Radio.Rx(0); //确保class 终端,出发发送外,其他时间一直处于接收状态。
DeviceState = DEVICE_STATE_SLEEP;
// Schedule next packet transmission TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime ); TimerStart( &TxNextPacketTimer ); break; }
后记:
(1)解决了上述问题,LoRaWAN PingPong终端就可以向Class A/B/C类型终端发送数据。
(2)数据的发送只停留在物理层的值,并没有在MAC层进行加密和解密。因此只限于物理层之间的通信