kopia lustrzana https://github.com/jgromes/RadioLib
				
				
				
			[SX126x] Changed CAD to only use DIO1 (#19)
							rodzic
							
								
									c9b68163d5
								
							
						
					
					
						commit
						eddf96bbb2
					
				|  | @ -65,10 +65,10 @@ void loop() { | |||
|     // no preamble was detected, channel is free
 | ||||
|     Serial.println(F("channel is free!")); | ||||
| 
 | ||||
|   } else if (state == ERR_CAD_UNAVAILABLE) { | ||||
|     // no preamble was detected, channel is free
 | ||||
|     Serial.println(F("unable to perform scan!")); | ||||
|     Serial.println(F("[SX1262] Disable DIO2 RF control to run CAD.")); | ||||
|   } else { | ||||
|     // some other error occurred
 | ||||
|     Serial.print(F("failed, code ")); | ||||
|     Serial.println(state); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -150,7 +150,7 @@ void setup() { | |||
|   // Some SX126x modules use DIO2 as RF switch. To enable
 | ||||
|   // this feature, the following method can be used.
 | ||||
|   // NOTE: As long as DIO2 is configured to control RF switch,
 | ||||
|   //       Channel Activity Detection is disabled!
 | ||||
|   //       it can't be used as interrupt pin!
 | ||||
|   if (loraSX1262.setDio2AsRfSwitch() != ERR_NONE) { | ||||
|     Serial.println(F("Failed to set DIO2 as RF switch!")); | ||||
|     while (true); | ||||
|  |  | |||
|  | @ -232,4 +232,3 @@ ERR_INVALID_MODULATION_PARAMETERS	LITERAL1 | |||
| ERR_SPI_CMD_TIMEOUT	LITERAL1 | ||||
| ERR_SPI_CMD_INVALID	LITERAL1 | ||||
| ERR_SPI_CMD_FAILED	LITERAL1 | ||||
| ERR_CAD_UNAVAILABLE	LITERAL1 | ||||
|  |  | |||
|  | @ -461,11 +461,6 @@ | |||
| */ | ||||
| #define ERR_SPI_CMD_FAILED                    -707 | ||||
| 
 | ||||
| /*!
 | ||||
|   \brief SX126x scan channel not possible because DIO2 is used as RF antenna switch. | ||||
| */ | ||||
| #define ERR_CAD_UNAVAILABLE                  -708 | ||||
| 
 | ||||
| /*!
 | ||||
|   \} | ||||
| */ | ||||
|  |  | |||
|  | @ -285,11 +285,6 @@ int16_t SX126x::scanChannel() { | |||
|     return(ERR_WRONG_MODEM); | ||||
|   } | ||||
| 
 | ||||
|   if (_dio2RfSwitch) { | ||||
|     // If DIO2 is used as RF switch this function does not work
 | ||||
|     return(ERR_CAD_UNAVAILABLE); | ||||
|   } | ||||
| 
 | ||||
|   // set mode to standby
 | ||||
|   int16_t state = standby(); | ||||
|   if(state != ERR_NONE) { | ||||
|  | @ -297,7 +292,7 @@ int16_t SX126x::scanChannel() { | |||
|   } | ||||
| 
 | ||||
|   // set DIO pin mapping
 | ||||
|   state = setDioIrqParams(SX126X_IRQ_CAD_DETECTED | SX126X_IRQ_CAD_DONE, SX126X_IRQ_CAD_DONE, SX126X_IRQ_CAD_DETECTED); | ||||
|   state = setDioIrqParams(SX126X_IRQ_CAD_DETECTED | SX126X_IRQ_CAD_DONE, SX126X_IRQ_CAD_DETECTED | SX126X_IRQ_CAD_DONE); | ||||
|   if(state != ERR_NONE) { | ||||
|     return(state); | ||||
|   } | ||||
|  | @ -315,19 +310,23 @@ int16_t SX126x::scanChannel() { | |||
|   } | ||||
| 
 | ||||
|   // wait for channel activity detected or timeout
 | ||||
|   while(!digitalRead(_mod->getInt0())) { | ||||
|     if(digitalRead(_mod->getInt1())) { | ||||
|   while(!digitalRead(_mod->getInt0())); | ||||
| 
 | ||||
|   // check CAD result
 | ||||
|   uint16_t cadResult = getIrqStatus(); | ||||
|   if(cadResult & SX126X_IRQ_CAD_DETECTED) { | ||||
|     // detected some LoRa activity
 | ||||
|     clearIrqStatus(); | ||||
|     return(LORA_DETECTED); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // clear interrupt flags
 | ||||
|   } else if(cadResult & SX126X_IRQ_CAD_DONE) { | ||||
|     // channel is free
 | ||||
|     clearIrqStatus(); | ||||
| 
 | ||||
|     return(CHANNEL_FREE); | ||||
|   } | ||||
| 
 | ||||
|   return(ERR_UNKNOWN); | ||||
| } | ||||
| 
 | ||||
| int16_t SX126x::sleep() { | ||||
|   uint8_t data[] = {SX126X_SLEEP_START_COLD | SX126X_SLEEP_RTC_OFF}; | ||||
|   int16_t state = SPIwriteCommand(SX126X_CMD_SET_SLEEP, data, 1); | ||||
|  | @ -911,6 +910,16 @@ int16_t SX126x::setTCXO(float voltage, uint32_t timeout) { | |||
|   return(ERR_NONE); | ||||
| } | ||||
| 
 | ||||
| int16_t SX126x::setDio2AsRfSwitch(bool enable) { | ||||
|   uint8_t data = 0; | ||||
|   if(enable) { | ||||
|     data = SX126X_DIO2_AS_RF_SWITCH; | ||||
|   } else { | ||||
|     data = SX126X_DIO2_AS_IRQ; | ||||
|   } | ||||
|   return(SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, &data, 1)); | ||||
| } | ||||
| 
 | ||||
| int16_t SX126x::setTx(uint32_t timeout) { | ||||
|   uint8_t data[3] = {(uint8_t)((timeout >> 16) & 0xFF), (uint8_t)((timeout >> 8) & 0xFF), (uint8_t)(timeout & 0xFF)}; | ||||
|   return(SPIwriteCommand(SX126X_CMD_SET_TX, data, 3)); | ||||
|  | @ -971,7 +980,7 @@ int16_t SX126x::setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t di | |||
| uint16_t SX126x::getIrqStatus() { | ||||
|   uint8_t data[2]; | ||||
|   SPIreadCommand(SX126X_CMD_GET_IRQ_STATUS, data, 2); | ||||
|   return(((uint16_t)(data[1]) << 8) | data[0]); | ||||
|   return(((uint16_t)(data[0]) << 8) | data[1]); | ||||
| } | ||||
| 
 | ||||
| int16_t SX126x::clearIrqStatus(uint16_t clearIrqParams) { | ||||
|  | @ -1074,21 +1083,6 @@ int16_t SX126x::setFrequencyRaw(float freq) { | |||
|   return(ERR_NONE); | ||||
| } | ||||
| 
 | ||||
| int16_t SX126x::setDio2AsRfSwitch(bool enable) { | ||||
|   uint8_t data = 0; | ||||
|   if(enable) { | ||||
|     data = SX126X_DIO2_AS_RF_SWITCH; | ||||
|   } else { | ||||
|     data = SX126X_DIO2_AS_IRQ; | ||||
|   } | ||||
|   int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, &data, 1); | ||||
| 
 | ||||
|   if(state == ERR_NONE) { | ||||
|     _dio2RfSwitch = enable; | ||||
|   } | ||||
|   return(state); | ||||
| } | ||||
| 
 | ||||
| int16_t SX126x::config(uint8_t modem) { | ||||
|   // set regulator mode
 | ||||
|   uint8_t* data = new uint8_t[1]; | ||||
|  |  | |||
|  | @ -657,6 +657,13 @@ class SX126x: public PhysicalLayer { | |||
|     */ | ||||
|     int16_t setTCXO(float voltage, uint32_t timeout = 5000); | ||||
| 
 | ||||
|     /*!
 | ||||
|       \brief Set DIO2 to function as RF switch (default in Semtech example designs). | ||||
| 
 | ||||
|       \returns \ref status_codes | ||||
|     */ | ||||
|     int16_t setDio2AsRfSwitch(bool enable = true); | ||||
| 
 | ||||
|     /*!
 | ||||
|       \brief Gets effective data rate for the last transmitted packet. The value is calculated only for payload bytes. | ||||
| 
 | ||||
|  | @ -678,13 +685,6 @@ class SX126x: public PhysicalLayer { | |||
|     */ | ||||
|     float getSNR(); | ||||
| 
 | ||||
|     /*!
 | ||||
|       \brief Set DIO2 to function as RF switch (default in Semtech example designs). | ||||
| 
 | ||||
|       \returns \ref status_codes  | ||||
|     */ | ||||
|     int16_t setDio2AsRfSwitch(bool enable = true); | ||||
| 
 | ||||
|   protected: | ||||
|     // SX1276x SPI command implementations
 | ||||
|     int16_t setTx(uint32_t timeout = 0); | ||||
|  | @ -727,8 +727,6 @@ class SX126x: public PhysicalLayer { | |||
| 
 | ||||
|     float _dataRate; | ||||
| 
 | ||||
|     bool _dio2RfSwitch = false; | ||||
| 
 | ||||
|     int16_t config(uint8_t modem); | ||||
| 
 | ||||
|     // common low-level SPI interface
 | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 jgromes
						jgromes