STM32控制LoRa启用应答等待后数据乱码问题排查
问题:STM32控制LoRa模块发送数据时等待回复出现乱码
我用STM32控制LoRa模块发送数据:
- 当不等待目标设备回复时,接收端数据正常,对应主代码如下:
if (SX126x_Lora_init() != NORMAL) { //无线模块初始化 while (1) { } } for (i = 0; i < 112; i++) writeBuffer[i] = i; while (1) { SX126xSetStandby(STDBY_XOSC); DIO1_EnableInterrupt(); SX126X_TxPacket(writeBuffer, 112); // while(!sendState) // HAL_Delay(100); HAL_Delay(100); }
- 但取消注释等待
sendState的两行代码后,接收端数据出现乱码。
以下是相关函数代码:
DIO1中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (DIO1_GetState() == GPIO_PIN_SET) { uint16_t flag; flag = SX126xGetIrqStatus(); SX126xClearIrqStatus(IRQ_RADIO_ALL); //clear flags if ((flag & IRQ_TX_DONE) == IRQ_TX_DONE) { SX126xSetStandby(STDBY_XOSC); DIO1_EnableInterrupt(); SX126X_StartRx(); } else if ((flag & (IRQ_RX_DONE | IRQ_CRC_ERROR)) == IRQ_RX_DONE) { if (G_LoRaConfig.HeaderType == LORA_PACKET_IMPLICIT) { SX126xClearTimeoutEvent(); } DIO1_DisableInterrupt(); SX126X_RxPacket(RXbuffer); if (RXbuffer[0] == 0 && RXbuffer[1] == 2) { RSSI = G_LoRaPara.LastPacket_RSSI; SNR = G_LoRaPara.Packet_SNR; Avg_RSSI = G_LoRaPara.AvgPacket_RSSI; switch (RXbuffer[0]) { case 0x00: sendState += 1; break; default: break; } memset(RXbuffer, 0, sizeof(RXbuffer)); } } else { DIO1_EnableInterrupt(); SX126X_StartRx(); } } }
LoRa初始化函数
tSX126xError SX126x_Lora_init(void) { if (false == LoRaConfig_Check()) { return PARAMETER_INVALID; } SX126X_SPI_Init(); SX126X_InitIo(); SX126X_Reset(); SX126xWakeup(); SX126xSetStandby(STDBY_RC); SX126xWriteRegister(TxClampConfig, SX126xReadRegister(TxClampConfig) | 0x1E); SX126xSetRegulatorMode(USE_DCDC); if (1U == BSP_RADIO_IsTCXO()) { //TCXO版本 SX126xClearDeviceErrors(); SX126xSetDio3AsTcxoCtrl(TCXO_CTRL_1_8V, 320); SX126xWriteRegister(REG_XTA_TRIM, 0x2F); CalibrationParams_t calibParam; calibParam.Value = 0x7F; SX126xCalibrate(calibParam); //Calibrate the RC13, RC64, ADC , Image、PLL } SX126xSetPacketType(PACKET_TYPE_LORA); uint8_t test = 0; SX126xWriteRegister(REG_LR_PAYLOADLENGTH, 0x09); test = SX126xReadRegister(REG_LR_PAYLOADLENGTH); if (test != 0x09) return SPI_READCHECK_WRONG; SX126xSetDio2AsRfSwitchCtrl(1); SX126xWriteRegister(REG_RX_GAIN, 0x96); SX126xSetRfFrequency(G_LoRaConfig.LoRa_Freq); SX126xSetRfTxPower(G_LoRaConfig.PowerCfig); SX126xSetBufferBaseAddress(0x00, 0x00); SX126xSetLoraModulationParams(); //SF、BW、CR、LOWDATARATEOPTIMIZE SX126xSetLoraPacketParams(); //PreambleLength、HeaderType、PayloadLength、CrcMode、InvertIQ SX126x_Lora_SyncWord(0x12); //SX126xSetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); return NORMAL; }
发送数据包函数
void SX126X_TxPacket(uint8_t* data, uint16_t len) { SX126xSetStandby(STDBY_XOSC); SX126xCalibrate_err(); SX126xSetRegulatorMode(USE_DCDC); SX126XWriteRxTx(true); SX126xClearIrqStatus(IRQ_RADIO_ALL); SX126xSetDioIrqParams( IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT, IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT, IRQ_RADIO_NONE, IRQ_RADIO_NONE); //(p1,p2,p3,p4),P1: SX126xSetLoraPacketParams(); //PreambleLength、HeaderType、PayloadLength、CrcMode、InvertIQ SX126xSetBufferBaseAddress(0x00, 0x00); SX126xSendPayload(data, len, 0x2fffff); }
接收数据函数
void SX126X_StartRx(void) { SX126xSetStandby(STDBY_XOSC); SX126xCalibrate_err(); SX126xSetRegulatorMode(USE_DCDC); SX126XWriteRxTx(false); SX126xClearIrqStatus(IRQ_RADIO_ALL); SX126xSetDioIrqParams( IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT, IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, IRQ_RADIO_NONE, IRQ_RADIO_NONE); DIO1; SX126xSetStopRxTimerOnPreambleDetect(false); SX126xSetLoRaSymbNumTimeout(0); SX126xSetBufferBaseAddress(0x00, 0x00); SX126xSetRx(0x2fffff); }
我尝试让LoRa在进入接收模式后先进入待机模式,再切换到发送模式,发送完成后回到待机模式并进入接收模式,但问题未得到明显改善。
内容的提问来源于stack exchange,提问作者ywye
相关产品推荐
相关产品推荐

