wave spectrum
/
SX126xDevKit
original
CwTransmitter/CwTransmitter.cpp
- Committer:
- wavespectrum
- Date:
- 2021-02-15
- Revision:
- 8:cdb739697925
- Parent:
- Demo/DemoApplication.cpp@ 7:274ca9fe1080
File content as of revision 8:cdb739697925:
#include "mbed.h" #include "radio.h" #include "sx126x-hal.h" #include "Eeprom.h" #include "CwTransmitter.h" /*! * \brief Defines the local payload buffer size */ #define BUFFER_SIZE 255 /*! * \brief Defines the size of the token defining message type in the payload * cf. above. */ #define PER_SIZE 3 /*! * \brief Define time used in PingPong demo to synch with cycle * RX_TIMEOUT_MARGIN is the free time between each cycle (time reserve) */ #define RX_TIMEOUT_MARGIN 150 // ms #define RX_TX_TRANSITION_WAIT 5 // ms /*! * \brief Define the possible message type for the Ping-Pong and PER apps */ /*! * \brief Buffer and its size */ uint8_t BufferSize = BUFFER_SIZE; uint8_t Buffer[BUFFER_SIZE]; /*! * \brief Function to be executed on Radio Tx Done event */ /*! * \brief Function executed on Radio Rx Error event */ void OnRxError( IrqErrorCode_t ); /*! * \brief Function executed on Radio CAD Done event */ void OnCadDone( bool channelActivityDetected ); /*! * \brief All the callbacks are stored in a structure */ RadioCallbacks_t RadioEvents = { }; // SPI // mosi, miso, sclk, nss, dio0, dio1, dio2, dio3, rst, freqSel, deviceSel, antSwPower, callbacks... SX126xHal Radio( D11, D12, D13, D7, D3, D5, NC, NC, A0, A1, A2, D8, &RadioEvents ); /*! * \brief Tx LED toggling on transmition success */ DigitalOut TX_LED( A4 ); /*! * \brief Rx LED toggling on reception success */ DigitalOut RX_LED( A5 ); /*! * \brief Mask of IRQs */ uint16_t IrqMask = 0x0000; /*! * \brief Locals parameters and status for radio API * NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING */ PacketParams_t PacketParams; PacketStatus_t PacketStatus; ModulationParams_t ModulationParams; /*! * \brief Ticker for master to synch Tx frames. Flags for PER and PingPong demo * for Synch TX in cycle. */ Ticker SendNextPacket; static bool SendNext = false; /*! * \brief Hold last Rx packet number to compute PER in PER and PingPong demo */ static uint32_t PacketRxSequence = 0; static uint32_t PacketRxSequencePrev = 0; void LedBlink( void ); void InitializeDemoParameters( uint8_t modulation ); uint16_t GetTimeOnAir( uint8_t modulation ); void SendNextPacketEvent( void ); // ************************** RF Test Demo ****************************** // * * // * * // * * // ***************************************************************************** uint8_t DemoStandby( void ) { Radio.SetStandby( STDBY_XOSC ); return 0; } uint8_t PrepDemoTxCw( uint32_t rf_frequency,int8_t power, RadioRampTimes_t rampTime ) { RX_LED = 1; TX_LED = 1; Radio.Init( ); // Can also be set in LDO mode but consume more power Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode ); memset( &Buffer, 0x00, BufferSize ); RX_LED = 0; TX_LED = 0; PacketRxSequence = 0; PacketRxSequencePrev = 0; Eeprom.EepromData.DemoSettings.CntPacketTx = 0; Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0; Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0; Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0; if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) { return 0; } InitializeDemoParameters( PACKET_TYPE_LORA ); TX_LED = 0; RX_LED = 0; uint8_t value = Radio.ReadReg( 0x08d8 ); Radio.WriteReg( 0x08d8, value | 0x1E ); Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode ); Radio.SetRfFrequency( rf_frequency ); Radio.SetTxParams( power, rampTime ); Radio.SetStandby( STDBY_XOSC ); return 0; } uint8_t RunDemoTxCw( void ) { Radio.SetTxContinuousWave( ); return 0; } void ComputePerPayload( uint8_t *buffer, uint8_t bufferSize ) { uint32_t i = 0; Eeprom.EepromData.DemoSettings.CntPacketRxOK++; PacketRxSequence = ( ( uint32_t )buffer[1] << 24 ) | \ ( ( uint32_t )buffer[2] << 16 ) | \ ( ( uint32_t )buffer[3] << 8 ) | \ buffer[4]; if( ( PacketRxSequence <= PacketRxSequencePrev ) || \ ( PacketRxSequencePrev == 0xFFFFFFFF ) ) { // Sequence went back => resynchronization // Don't count missed packets this time i = 0; } else { // Determine number of missed packets i = PacketRxSequence - PacketRxSequencePrev - 1; } // Be ready for the next PacketRxSequencePrev = PacketRxSequence; // increment 'missed' counter for the RX session Eeprom.EepromData.DemoSettings.CntPacketRxKO += i; Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0; } uint8_t GetConnectedDevice( void ) { return( Radio.GetDeviceType( ) ); } uint8_t GetMatchingFrequency( void ) { return( Radio.GetFreqSelect( ) ); } void InitializeDemoParameters( uint8_t modulation ) { Radio.SetStandby( STDBY_RC ); Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode ); printf("> InitializeDemoParameters\n\r"); if( modulation == PACKET_TYPE_LORA ) { printf("set param LORA for demo\n\r"); ModulationParams.PacketType = PACKET_TYPE_LORA; PacketParams.PacketType = PACKET_TYPE_LORA; ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) Eeprom.EepromData.DemoSettings.ModulationParam1; ModulationParams.Params.LoRa.Bandwidth = ( RadioLoRaBandwidths_t ) Eeprom.EepromData.DemoSettings.ModulationParam2; ModulationParams.Params.LoRa.CodingRate = ( RadioLoRaCodingRates_t ) Eeprom.EepromData.DemoSettings.ModulationParam3; PacketParams.Params.LoRa.PreambleLength = Eeprom.EepromData.DemoSettings.PacketParam1; PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsMode_t )Eeprom.EepromData.DemoSettings.PacketParam2; PacketParams.Params.LoRa.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam3; PacketParams.Params.LoRa.CrcMode = ( RadioLoRaCrcModes_t ) Eeprom.EepromData.DemoSettings.PacketParam4; PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t ) Eeprom.EepromData.DemoSettings.PacketParam5; Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength; if( ( ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) || ( ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) ) { if( PacketParams.Params.LoRa.PreambleLength < 12 ) { PacketParams.Params.LoRa.PreambleLength = 12; } } } else// if( modulation == PACKET_TYPE_GFSK ) { printf("set param GFSK for demo\n\r"); ModulationParams.PacketType = PACKET_TYPE_GFSK; PacketParams.PacketType = PACKET_TYPE_GFSK; ModulationParams.Params.Gfsk.BitRate = Eeprom.EepromData.DemoSettings.ModulationParam1; ModulationParams.Params.Gfsk.Fdev = Eeprom.EepromData.DemoSettings.ModulationParam2; ModulationParams.Params.Gfsk.ModulationShaping = ( RadioModShapings_t ) Eeprom.EepromData.DemoSettings.ModulationParam3; ModulationParams.Params.Gfsk.Bandwidth = ( RadioRxBandwidth_t ) Eeprom.EepromData.DemoSettings.ModulationParam4; PacketParams.Params.Gfsk.PreambleLength = Eeprom.EepromData.DemoSettings.PacketParam1; PacketParams.Params.Gfsk.PreambleMinDetect = ( RadioPreambleDetection_t )Eeprom.EepromData.DemoSettings.PacketParam2; PacketParams.Params.Gfsk.SyncWordLength = Eeprom.EepromData.DemoSettings.PacketParam3; PacketParams.Params.Gfsk.AddrComp = ( RadioAddressComp_t ) Eeprom.EepromData.DemoSettings.PacketParam4; PacketParams.Params.Gfsk.HeaderType = ( RadioPacketLengthModes_t )Eeprom.EepromData.DemoSettings.PacketParam5; PacketParams.Params.Gfsk.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam6; PacketParams.Params.Gfsk.CrcLength = ( RadioCrcTypes_t ) Eeprom.EepromData.DemoSettings.PacketParam7; PacketParams.Params.Gfsk.DcFree = ( RadioDcFree_t ) Eeprom.EepromData.DemoSettings.PacketParam8; Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Gfsk.PayloadLength; } Radio.SetStandby( STDBY_RC ); Radio.ClearIrqStatus( IRQ_RADIO_ALL ); Radio.SetPacketType( ModulationParams.PacketType ); Radio.SetModulationParams( &ModulationParams ); Radio.SetPacketParams( &PacketParams ); Radio.SetBufferBaseAddresses( 0x00, 0x00 ); // only used in GFSK Radio.SetSyncWord( ( uint8_t[] ){ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0 } ); Radio.SetWhiteningSeed( 0x01FF ); RX_LED = 0; TX_LED = 0; } /*! * \brief Callback of ticker PerSendNextPacket */ void SendNextPacketEvent( void ) { SendNext = true; } void LedBlink( void ) { if( ( TX_LED == 0 ) && ( RX_LED == 0 ) ) { TX_LED = 1; } else if( ( TX_LED == 1 ) && ( RX_LED == 0 ) ) { RX_LED = 1; } else if( ( TX_LED == 1 ) && ( RX_LED == 1 ) ) { TX_LED = 0; } else { RX_LED = 0; } }