SX126x-Arduino icon indicating copy to clipboard operation
SX126x-Arduino copied to clipboard

Duration to period conversions are false in RadioSetRxDutyCycle (radio.cpp)

Open JeromeBriot opened this issue 2 years ago • 0 comments

Hello,

If the arguments rxTime and sleepTime are in ms, then the call to SX126xSetRxDutyCycle is false in the code below (Radio.cpp):

void RadioSetRxDutyCycle(uint32_t rxTime, uint32_t sleepTime)
{
	SX126xSetDioIrqParams(IRQ_RADIO_ALL | IRQ_RX_TX_TIMEOUT,
						  IRQ_RADIO_ALL | IRQ_RX_TX_TIMEOUT,
						  IRQ_RADIO_NONE, IRQ_RADIO_NONE);
	SX126xSetRxDutyCycle(rxTime, sleepTime);
}

It should be:

void RadioSetRxDutyCycle(uint32_t rxTime, uint32_t sleepTime)
{
	SX126xSetDioIrqParams(IRQ_RADIO_ALL | IRQ_RX_TX_TIMEOUT,
						  IRQ_RADIO_ALL | IRQ_RX_TX_TIMEOUT,
						  IRQ_RADIO_NONE, IRQ_RADIO_NONE);


	// Duration (s) = Period * 0.000015625 (see DS_SX1261-2_V2.1 datasheet chapter 13.1.7)
	// Period = Duration (s) / 0.000015625
	// 1/0.000015625 => 64000 => SX126X RTC 64 kHz clock (see DS_SX1261-2_V2.1 datasheet chapter 4.1.1)
	// Period = Duration (s) * 64000
	// Period = Duration (ms) * 64000 / 1000 = Duration (ms) * 64 = Duration (ms) << 6
	//
	// Example for duration = 2ms => period = 2 << 6 = 128 => 128 * 0.000015625 = 0.002s = 2ms

	SX126xSetRxDutyCycle(rxTime << 6, sleepTime << 6);
}

To be consistent with the datasheet, it should be useful to rename the arguments of the SX126xSetRxDutyCycle function (sx126x.cpp):

void SX126xSetRxDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod)
{
	uint8_t buf[6];

	buf[0] = (uint8_t)((rxPeriod >> 16) & 0xFF);
	buf[1] = (uint8_t)((rxPeriod >> 8) & 0xFF);
	buf[2] = (uint8_t)(rxPeriod & 0xFF);
	buf[3] = (uint8_t)((sleepPeriod >> 16) & 0xFF);
	buf[4] = (uint8_t)((sleepPeriod >> 8) & 0xFF);
	buf[5] = (uint8_t)(sleepPeriod & 0xFF);
	SX126xWriteCommand(RADIO_SET_RXDUTYCYCLE, buf, 6);
	SX126xSetOperatingMode(MODE_RX_DC);
}

Thank you

JeromeBriot avatar Nov 27 '23 08:11 JeromeBriot