From 842bb64195f958b050867c50db66fc0aa413dafb Mon Sep 17 00:00:00 2001 From: QuakeGod <quakegod@sina.com> Date: 星期六, 27 七月 2024 10:42:56 +0800 Subject: [PATCH] KBus upgrade --- Radio_LLCC68/Radio/KWireLess.c | 301 ++++++++++++++++++++++++++++++++++++------------- 1 files changed, 218 insertions(+), 83 deletions(-) diff --git a/Radio_LLCC68/Radio/KWireLess.c b/Radio_LLCC68/Radio/KWireLess.c index cb2c987..07f25d8 100644 --- a/Radio_LLCC68/Radio/KWireLess.c +++ b/Radio_LLCC68/Radio/KWireLess.c @@ -20,6 +20,7 @@ #define USE_MODEM_LORA //#define USE_MODEM_FSK +/* #define REGION_CN779 #if defined( REGION_AS923 ) @@ -59,9 +60,45 @@ #error "Please define a frequency band in the compiler options." #endif +*/ +/* +#if defined( USE_MODEM_LORA ) +#define LORA_BANDWIDTH 1 // [0: 125 kHz, + // 1: 250 kHz, + // 2: 500 kHz, + // 3: Reserved] +#define LORA_SPREADING_FACTOR 8 // [SF5..SF12] +#define LORA_CODINGRATE 4 // [1: 4/5, + // 2: 4/6, + // 3: 4/7, + // 4: 4/8] +#define LORA_PREAMBLE_LENGTH 4 // Same for Tx and Rx + +*/ +#define LORA_SYMBOL_TIMEOUT 0 // Symbols +#define LORA_FIX_LENGTH_PAYLOAD_ON false +#define LORA_IQ_INVERSION_ON false + +/* +#elif defined( USE_MODEM_FSK ) + +#define FSK_FDEV 20e3 // Hz +#define FSK_DATARATE 19.2e3 // bps +#define FSK_BANDWIDTH 60e3 // Hz >> DSB in sx126x +#define FSK_AFC_BANDWIDTH 200e3 // Hz +#define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx +#define FSK_FIX_LENGTH_PAYLOAD_ON false + +#else + #error "Please define a modem in the compiler options." +#endif +*/ +/* #define nChannelSpacing 530000 // Hz #define TX_OUTPUT_POWER 16 // 22 dBm +*/ + extern bool IrqFired; @@ -75,38 +112,30 @@ * Radio events function pointer */ +const stWLConfig defaultWLConfig = +{ + .RF_T_Freq = 430620000, // uint32_t Hz + .RF_R_Freq = 430620000, //uint32_t //Hz + .nChnSpacing = 530, // uint16_t ChannelSpacing; //kHz + .workMode = 1, // uchar workMode; //0: FSK, 1: LoRa + .Tx_Power = 22, // uchar Tx_Power; + .LoraBandWidth = 0, // uchar LoraBandWidth; // [0: 125 kHz, 1: 250 kHz, 2: 500 kHz, 3: Reserved ] + .LoRaFactor = 5, // uchar LoRaFactor; // [SF5 .. SF 12] + .LoRaCodingRate = 1, // uchar LoRaCodingRate; // [1 : 4/5, 2: 4/6, 3: 4/7, 4: 4/8 + .NetWorkAddr = 0x00, // uint8_t NetWorkAddr; + .DeviceAddr = 0x0102, // uint16_t DeviceAddr; + .bEnableAddr = 0, // uchar bEnableAddr; + .bEnableEncrypt = 0, // uchar bEnableEncrypt; + .bEnableRelay = 0, // uchar bEnableRelay; + .LoRaPreambleLen = 4, // uchar LoRaPreamble_Len; // 2 - 12 + .bAutoReSend = 1, // 鑷姩閲嶅彂 +}; + +//stWLConfig * pWLCfg = (stWLConfig *)&defaultWLConfig; static RadioEvents_t RadioEvents; +stWLConfig WLCfg ; stWLRunStat KwRunStat; - -#if defined( USE_MODEM_LORA ) - -#define LORA_BANDWIDTH 1 // [0: 125 kHz, - // 1: 250 kHz, - // 2: 500 kHz, - // 3: Reserved] -#define LORA_SPREADING_FACTOR 8 // [SF7..SF12] -#define LORA_CODINGRATE 4 // [1: 4/5, - // 2: 4/6, - // 3: 4/7, - // 4: 4/8] -#define LORA_PREAMBLE_LENGTH 4 // Same for Tx and Rx -#define LORA_SYMBOL_TIMEOUT 0 // Symbols -#define LORA_FIX_LENGTH_PAYLOAD_ON false -#define LORA_IQ_INVERSION_ON false - -#elif defined( USE_MODEM_FSK ) - -#define FSK_FDEV 20e3 // Hz -#define FSK_DATARATE 19.2e3 // bps -#define FSK_BANDWIDTH 60e3 // Hz >> DSB in sx126x -#define FSK_AFC_BANDWIDTH 200e3 // Hz -#define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx -#define FSK_FIX_LENGTH_PAYLOAD_ON false - -#else - #error "Please define a modem in the compiler options." -#endif typedef enum { @@ -119,17 +148,22 @@ }States_t; #define MASTER_RX_TIMEOUT_VALUE 80 //mS -#define SLAVE_RX_TIMEOUT_VALUE 250 //mS -#define CYCLE_TIME 200 //mS +#define SLAVE_RX_TIMEOUT_VALUE 400 //mS +#define CYCLE_TIME 160 //mS -#define BUFFER_SIZE 32 // Define the payload size here +#define WL_RX_BUFFER_SIZE 256 // Define the payload size here +#define WL_TX_BUFFER_SIZE 128 // Define the payload size here +uint16_t nTimeOnAir; +/* const uint8_t PingMsg[] = "PING"; const uint8_t PongMsg[] = "PONG"; +*/ //uint16_t BufferSize = BUFFER_SIZE; -uint8_t TX_Buffer[BUFFER_SIZE]; -uint8_t RX_Buffer[BUFFER_SIZE]; +uint8_t RX_Buffer[WL_RX_BUFFER_SIZE]; +uint8_t TX_Buffer[WL_TX_BUFFER_SIZE]; + States_t State = LOWPOWER; @@ -148,9 +182,37 @@ LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_13); } +int LoadKwConfig(void) +{ + stStoredWLConfig * pstStoredWLCFG = (stStoredWLConfig *)(STORE_KWCONFIG_BASE); + + if (pstStoredWLCFG->BlockSign == 0x55AA && pstStoredWLCFG->BlockType == 0x05) { + WLCfg = pstStoredWLCFG->WLConfig; + } else { + WLCfg = defaultWLConfig; + } + return 0; +} + +int SaveKwConfig(void) +{ +// stStoredWLConfig * pstStoredWLCFG = (stStoredWLConfig *)(STORE_KWCONFIG_BASE); + + stStoredWLConfig theStoredWLCFG; + theStoredWLCFG.BlockSign = 0x55AA; + theStoredWLCFG.BlockType = 0x05; + theStoredWLCFG.nSeq = 1; + theStoredWLCFG.nSize = sizeof(stWLConfig); + theStoredWLCFG.WLConfig = WLCfg; + theStoredWLCFG.nCRC16 = 0x0000; + EraseAndWriteToFlashMem(&theStoredWLCFG, (void *)STORE_KWCONFIG_BASE, sizeof(stStoredWLConfig)); + + return 0; +} + int KWireLessInit(bool bRadioEnableMaster, uint32_t nChn) { - + stWLConfig * pWLCfg = & WLCfg; RadioEnableMaster = bRadioEnableMaster; // Radio initialization RadioEvents.TxDone = OnTxDone; @@ -162,7 +224,9 @@ Radio.Init( &RadioEvents ); nRadioChannel = nChn; - Radio.SetChannel( RF_FREQUENCY + nRadioChannel * nChannelSpacing ); + KwRunStat.RF_Freq = pWLCfg->RF_T_Freq + nRadioChannel * pWLCfg->nChnSpacing*1000; + + Radio.SetChannel( pWLCfg->RF_T_Freq + nRadioChannel * pWLCfg->nChnSpacing*1000 ); // Radio.WriteBuffer(0x06C0,data,2); // Radio.ReadBuffer(0x06C0,test,2); @@ -178,15 +242,15 @@ LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, true, 0, 0, LORA_IQ_INVERSION_ON, false ); -//*/ +// */ - Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, - LORA_SPREADING_FACTOR, LORA_CODINGRATE, - LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, + Radio.SetTxConfig( MODEM_LORA, pWLCfg->Tx_Power, 0, pWLCfg->LoraBandWidth, + pWLCfg->LoRaFactor, pWLCfg->LoRaCodingRate, + pWLCfg->LoRaPreambleLen, LORA_FIX_LENGTH_PAYLOAD_ON, true, 0, 0, LORA_IQ_INVERSION_ON, 3000 ); - Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, - LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, + Radio.SetRxConfig( MODEM_LORA, pWLCfg->LoraBandWidth, pWLCfg->LoRaFactor, + pWLCfg->LoRaCodingRate, 0, pWLCfg->LoRaPreambleLen, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, true, 0, 0, LORA_IQ_INVERSION_ON, false ); @@ -204,13 +268,15 @@ 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true, 0, 0,false, false ); #else - #error "Please define a frequency band in the compiler options." + #error "Please define a modem in the compiler options.." #endif SX126xSetRxTxFallbackMode(0x40); // 0x40-> FS 0x30 -> SD_XOSC 0x20 -> SD_RC - SX126xSetCadParams(2,0,1,0,1); + SX126xSetCadParams(LORA_CAD_04_SYMBOL,0,1,LORA_CAD_ONLY,1); - + nTimeOnAir = Radio.TimeOnAir(MODEM_LORA,14); + KwRunStat.nTimeOnAir = nTimeOnAir; + KMem.WDT[38]=nTimeOnAir; KwRunStat.runStep=RS_IDEL; return 0; } @@ -239,6 +305,8 @@ void OnTxDone( void ) { + KwRunStat.bMasterSent = 1; + KwRunStat.bMasterRecved = 0; KwRunStat.runStep=RS_IDEL; KMem.WDT[42]++; KwRunStat.lastSenttime = GetTick(); @@ -275,14 +343,13 @@ void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) { KMem.WDT[44] = size; - memcpy( RX_Buffer, payload, size ); memcpy(&KMem.WDT[64],payload,size); Radio.Standby(); if (bThisRxError) { bThisRxError=0; -// return; + return; } KwRunStat.curStat = 0; @@ -305,7 +372,6 @@ else //slave { KWLSlaveParsePkt(nRadioChannel,size); - } } @@ -321,20 +387,27 @@ KwRunStat.LostPackets++; KwRunStat.CtnLstPkts++; if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;} -// KMem.ErrStat=500; - if (KwRunStat.CtnLstPkts > 1) { KMem.ErrStat=500;} - if (KwRunStat.CtnLstPkts == 2) {KwRunStat.Err1Count++;} - if (KwRunStat.CtnLstPkts > 3) { KMem.ErrStat=5000;} - if (KwRunStat.CtnLstPkts == 4) {KwRunStat.Err2Count++;} - if (KwRunStat.CtnLstPkts > 6) { KMem.ErrStat=5000; KMem.WFX[1]=0; } - if (KwRunStat.CtnLstPkts == 7) {KwRunStat.Err3Count++;} - +// KwRunStat.ErrStat=500; + if (KwRunStat.CtnLstPkts > 2) { KwRunStat.ErrStat=500;} + if (KwRunStat.CtnLstPkts ==3 ) {KwRunStat.Err1Count++;} + if (KwRunStat.CtnLstPkts > 5) { KwRunStat.ErrStat=5000;} + if (KwRunStat.CtnLstPkts == 6) {KwRunStat.Err2Count++;} + if (KwRunStat.CtnLstPkts > 9) { KwRunStat.ErrStat=5000; KMem.WFX[1]=0; } + if (KwRunStat.CtnLstPkts == 10) {KwRunStat.Err3Count++;} + if ((KwRunStat.CtnLstPkts &0x0f) == 0x0f) { + KMem.WDT[51]++; + LoadKwConfig(); + KWireLessInit(RadioEnableMaster,nRadioChannel); + Radio.Standby(); + // KWireLessStart(); + } if(RadioEnableMaster) { //KWLMasterSendReqPkt(1); } else { + Radio.Standby(); Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); KwRunStat.runStep=RS_RECVING; KwRunStat.lastActTime = GetTick(); @@ -345,8 +418,12 @@ void OnRxError( void ) { - -// Radio.Standby(); + Radio.Standby(); + Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); + KwRunStat.runStep=RS_RECVING; + KwRunStat.lastActTime = GetTick(); + KwRunStat.lastRecvtime = GetTick(); + KwRunStat.RXErr++; KMem.WDT[46]++; bThisRxError=1; @@ -363,14 +440,16 @@ KwRunStat.LostPackets++; KwRunStat.CtnLstPkts++; if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;} -// KMem.ErrStat=500; - if (KwRunStat.CtnLstPkts > 1) { KMem.ErrStat=500; } +// KwRunStat.ErrStat=500; + if (KwRunStat.CtnLstPkts > 1) { KwRunStat.ErrStat=500; } if (KwRunStat.CtnLstPkts == 2) {KwRunStat.Err1Count++;} - if (KwRunStat.CtnLstPkts > 3) { KMem.ErrStat=5000;} + if (KwRunStat.CtnLstPkts > 3) { KwRunStat.ErrStat=5000;} if (KwRunStat.CtnLstPkts == 4) {KwRunStat.Err2Count++;} - if (KwRunStat.CtnLstPkts > 6) { KMem.ErrStat=5000; KMem.WFX[1]=0; } + if (KwRunStat.CtnLstPkts > 6) { KwRunStat.ErrStat=5000; KMem.WFX[1]=0; } if (KwRunStat.CtnLstPkts == 7) {KwRunStat.Err3Count++;} + } +// Radio.Standby(); } void OnCadDone( bool channelActivityDetected) @@ -386,7 +465,7 @@ if (RX_Buffer[size-2] != (crc_value&0xff) && RX_Buffer[size-1] != (crc_value >> 8)) { KwRunStat.CRCErr++; - KMem.ErrStat=500; + KwRunStat.ErrStat=500; CRC_OK = 0; }else { CRC_OK = 1; @@ -397,6 +476,7 @@ { if (p1->DstAddr == MixAddr(nRadioChannel,nRadioAddr)) { + KwRunStat.bMasterRecved = 1; LedToggle();//LED闂儊 KwRunStat.lastRecvdtime=GetTick(); KwRunStat.lastAckTime = GetTick(); @@ -432,12 +512,20 @@ if (RX_Buffer[size-2] != (crc_value&0xff) && RX_Buffer[size-1] != (crc_value >> 8)) { KwRunStat.CRCErr++; - KMem.ErrStat=500; + KwRunStat.ErrStat=500; CRC_OK = 0; }else { CRC_OK = 1; + if (p1->STSign != enReqSign) { + KwRunStat.PktErr++; + }else { + if (p1->DstAddr != MixAddr(nRadioChannel,nRadioAddr)) { + KwRunStat.ChnErr++; + } + } } //*/ + if(CRC_OK && p1->STSign == enReqSign && p1->DstAddr == MixAddr(nRadioChannel,nRadioAddr))// memcmp(RX_Buffer,PingMsg,4)==0 && ) { @@ -580,21 +668,7 @@ int KWLSlaveProc(int nChn) { - return 0; -} - -int KWL_Process(int nChn) -{ - RadioState_t stat = Radio.GetStatus(); - KMem.WDT[32]=stat; -// KMem.WDT[38]=Radio.Rssi(MODEM_FSK); - if (RadioEnableMaster){ - if (GetTick() - KwRunStat.lastSendtime > CYCLE_TIME *10 && KwRunStat.curStat == 0 ) //&& stat == RF_IDLE ) //200mS - { - KWireLessStart(); - } - }else //slave - { + RadioState_t stat = Radio.GetStatus(); if (stat == RF_IDLE){ KMem.WDT[48]++; Radio.Standby(); @@ -616,13 +690,74 @@ KWireLessStart(); } if (GetTick() - KwRunStat.lastRecvdtime > 4000){ // 200mS - // KMem.ErrStat=500; - KMem.ErrStat=500; + // KwRunStat.ErrStat=500; + KwRunStat.ErrStat=500; +// Radio.Standby(); +// KWireLessStart(); } if (GetTick() - KwRunStat.lastRecvdtime > 12000){ // 1200mS - KMem.ErrStat=5000; KMem.WFX[1]=0; - } + KwRunStat.ErrStat=5000; KMem.WFX[1]=0; + } + if (GetTick() - KwRunStat.lastRecvtime > 16000){ + KMem.WDT[52]++; + LoadKwConfig(); + KWireLessInit(RadioEnableMaster,nRadioChannel); + Radio.Standby(); + KWireLessStart(); + KwRunStat.lastRecvtime = GetTick(); + } + return 0; +} + +int KWL_Process(int nChn) +{ + RadioState_t stat = Radio.GetStatus(); + KMem.WDT[32]=stat; +// KMem.WDT[38]=Radio.Rssi(MODEM_FSK); + if (RadioEnableMaster){ + if (GetTick() - KwRunStat.lastSendtime > CYCLE_TIME *10 && Radio.IsChannelFree(MODEM_LORA,KwRunStat.RF_Freq,-60,1)){ + if (!KwRunStat.bMasterRecved) { + KwRunStat.ErrStat=5000; + KwRunStat.LostPackets++; + KwRunStat.CtnLstPkts++; + if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;} + // KwRunStat.ErrStat=500; + if (KwRunStat.CtnLstPkts > 1) { KwRunStat.ErrStat=2000;} + if (KwRunStat.CtnLstPkts == 2) {KwRunStat.Err1Count++;} + if (KwRunStat.CtnLstPkts > 3) { KwRunStat.ErrStat=5000;} + if (KwRunStat.CtnLstPkts == 4) {KwRunStat.Err2Count++;} + if (KwRunStat.CtnLstPkts > 6) { KwRunStat.ErrStat=5000; KMem.WFX[1]=0; } + if (KwRunStat.CtnLstPkts == 7) {KwRunStat.Err3Count++;} + if ((KwRunStat.CtnLstPkts &0x0f) == 0x0f) { + KMem.WDT[51]++; + LoadKwConfig(); + KWireLessInit(RadioEnableMaster,nRadioChannel); + Radio.Standby(); + // KWireLessStart(); + } + } + if (KwRunStat.curStat == 0 ){ //&& stat == RF_IDLE ) //200mS +// Radio.Standby(); + KWireLessStart(); + }else { + Radio.Standby(); + KWireLessStart(); + } + } + }else //slave + { + KWLSlaveProc(nChn); } + if (KwRunStat.RunStat) KwRunStat.RunStat--; + if (KwRunStat.ErrStat) KwRunStat.ErrStat--; + + KwRunStat.Tx_Power = WLCfg.Tx_Power; + KwRunStat.LoraBandWidth = WLCfg.LoraBandWidth; + KwRunStat.LoRaFactor = WLCfg.LoRaFactor; + KwRunStat.LoRaCodingRate = WLCfg.LoRaCodingRate; + KwRunStat.LoRaPreambleLen = WLCfg.LoRaPreambleLen; + + return 0; } -- Gitblit v1.9.1