[Si443x] Fixed bit range and timeout on some modules (#165)
This commit is contained in:
parent
a525c40e55
commit
44dc0a4ea3
2 changed files with 29 additions and 24 deletions
|
@ -84,12 +84,17 @@ int16_t Si443x::transmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set mode to standby
|
|
||||||
state = standby();
|
|
||||||
|
|
||||||
// clear interrupt flags
|
// clear interrupt flags
|
||||||
clearIRQFlags();
|
clearIRQFlags();
|
||||||
|
|
||||||
|
// set mode to standby
|
||||||
|
standby();
|
||||||
|
|
||||||
|
// the next transmission will timeout without the following
|
||||||
|
_mod->SPIwriteRegister(SI443X_REG_INTERRUPT_ENABLE_2, 0x00);
|
||||||
|
_mod->SPIsetRegValue(SI443X_REG_MODULATION_MODE_CONTROL_2, SI443X_TX_DATA_SOURCE_FIFO, 5, 4);
|
||||||
|
state = setFrequencyRaw(_freq);
|
||||||
|
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,7 +140,8 @@ int16_t Si443x::standby() {
|
||||||
// set RF switch (if present)
|
// set RF switch (if present)
|
||||||
_mod->setRfSwitchState(LOW, LOW);
|
_mod->setRfSwitchState(LOW, LOW);
|
||||||
|
|
||||||
return(_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_XTAL_ON, 7, 0, 10));
|
//return(_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_XTAL_ON, 7, 0, 10));
|
||||||
|
return(ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t Si443x::transmitDirect(uint32_t frf) {
|
int16_t Si443x::transmitDirect(uint32_t frf) {
|
||||||
|
@ -166,7 +172,7 @@ int16_t Si443x::transmitDirect(uint32_t frf) {
|
||||||
|
|
||||||
// start direct transmission
|
// start direct transmission
|
||||||
directMode();
|
directMode();
|
||||||
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_TX_ON);
|
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_TX_ON | SI443X_XTAL_ON);
|
||||||
|
|
||||||
return(ERR_NONE);
|
return(ERR_NONE);
|
||||||
}
|
}
|
||||||
|
@ -176,7 +182,7 @@ int16_t Si443x::transmitDirect(uint32_t frf) {
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// start transmitting
|
// start transmitting
|
||||||
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_TX_ON);
|
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_TX_ON | SI443X_XTAL_ON);
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,7 +195,7 @@ int16_t Si443x::receiveDirect() {
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// start receiving
|
// start receiving
|
||||||
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_RX_ON);
|
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_RX_ON | SI443X_XTAL_ON);
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,10 +225,6 @@ int16_t Si443x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_TX_FIFO_RESET, 0, 0);
|
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_TX_FIFO_RESET, 0, 0);
|
||||||
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_TX_FIFO_CLEAR, 0, 0);
|
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_TX_FIFO_CLEAR, 0, 0);
|
||||||
|
|
||||||
// set interrupt mapping
|
|
||||||
state = _mod->SPIsetRegValue(SI443X_REG_INTERRUPT_ENABLE_1, SI443X_PACKET_SENT_ENABLED);
|
|
||||||
RADIOLIB_ASSERT(state);
|
|
||||||
|
|
||||||
// clear interrupt flags
|
// clear interrupt flags
|
||||||
clearIRQFlags();
|
clearIRQFlags();
|
||||||
|
|
||||||
|
@ -239,8 +241,12 @@ int16_t Si443x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
// set RF switch (if present)
|
// set RF switch (if present)
|
||||||
_mod->setRfSwitchState(LOW, HIGH);
|
_mod->setRfSwitchState(LOW, HIGH);
|
||||||
|
|
||||||
|
// set interrupt mapping
|
||||||
|
_mod->SPIwriteRegister(SI443X_REG_INTERRUPT_ENABLE_1, SI443X_PACKET_SENT_ENABLED);
|
||||||
|
_mod->SPIwriteRegister(SI443X_REG_INTERRUPT_ENABLE_2, 0x00);
|
||||||
|
|
||||||
// set mode to transmit
|
// set mode to transmit
|
||||||
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_TX_ON);
|
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_TX_ON | SI443X_XTAL_ON);
|
||||||
|
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
@ -254,20 +260,18 @@ int16_t Si443x::startReceive() {
|
||||||
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_RX_FIFO_RESET, 1, 1);
|
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_RX_FIFO_RESET, 1, 1);
|
||||||
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_RX_FIFO_CLEAR, 1, 1);
|
_mod->SPIsetRegValue(SI443X_REG_OP_FUNC_CONTROL_2, SI443X_RX_FIFO_CLEAR, 1, 1);
|
||||||
|
|
||||||
// set interrupt mapping
|
|
||||||
state = _mod->SPIsetRegValue(SI443X_REG_INTERRUPT_ENABLE_1, SI443X_VALID_PACKET_RECEIVED_ENABLED, SI443X_CRC_ERROR_ENABLED);
|
|
||||||
RADIOLIB_ASSERT(state);
|
|
||||||
state = _mod->SPIsetRegValue(SI443X_REG_INTERRUPT_ENABLE_2, 0x00);
|
|
||||||
RADIOLIB_ASSERT(state);
|
|
||||||
|
|
||||||
// clear interrupt flags
|
// clear interrupt flags
|
||||||
clearIRQFlags();
|
clearIRQFlags();
|
||||||
|
|
||||||
// set RF switch (if present)
|
// set RF switch (if present)
|
||||||
_mod->setRfSwitchState(HIGH, LOW);
|
_mod->setRfSwitchState(HIGH, LOW);
|
||||||
|
|
||||||
|
// set interrupt mapping
|
||||||
|
_mod->SPIwriteRegister(SI443X_REG_INTERRUPT_ENABLE_1, SI443X_PACKET_SENT_ENABLED);
|
||||||
|
_mod->SPIwriteRegister(SI443X_REG_INTERRUPT_ENABLE_2, 0x00);
|
||||||
|
|
||||||
// set mode to receive
|
// set mode to receive
|
||||||
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_RX_ON);
|
_mod->SPIwriteRegister(SI443X_REG_OP_FUNC_CONTROL_1, SI443X_RX_ON | SI443X_XTAL_ON);
|
||||||
|
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
@ -494,7 +498,7 @@ int16_t Si443x::setPreambleLength(uint8_t preambleLen) {
|
||||||
|
|
||||||
// set default preamble detection threshold to 50% of preamble length (in units of 4 bits)
|
// set default preamble detection threshold to 50% of preamble length (in units of 4 bits)
|
||||||
uint8_t preThreshold = preambleLen / 4;
|
uint8_t preThreshold = preambleLen / 4;
|
||||||
return(_mod->SPIsetRegValue(SI443X_REG_PREAMBLE_DET_CONTROL, preThreshold << 4, 3, 7));
|
return(_mod->SPIsetRegValue(SI443X_REG_PREAMBLE_DET_CONTROL, preThreshold << 4, 7, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Si443x::getPacketLength(bool update) {
|
size_t Si443x::getPacketLength(bool update) {
|
||||||
|
@ -557,6 +561,7 @@ int16_t Si443x::setFrequencyRaw(float newFreq) {
|
||||||
// check high/low band
|
// check high/low band
|
||||||
uint8_t bandSelect = SI443X_BAND_SELECT_LOW;
|
uint8_t bandSelect = SI443X_BAND_SELECT_LOW;
|
||||||
uint8_t freqBand = (newFreq / 10) - 24;
|
uint8_t freqBand = (newFreq / 10) - 24;
|
||||||
|
_freq = newFreq;
|
||||||
if(newFreq >= 480.0) {
|
if(newFreq >= 480.0) {
|
||||||
bandSelect = SI443X_BAND_SELECT_HIGH;
|
bandSelect = SI443X_BAND_SELECT_HIGH;
|
||||||
freqBand = (newFreq / 20) - 24;
|
freqBand = (newFreq / 20) - 24;
|
||||||
|
@ -605,8 +610,8 @@ bool Si443x::findChip() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Si443x::clearIRQFlags() {
|
void Si443x::clearIRQFlags() {
|
||||||
_mod->SPIreadRegister(SI443X_REG_INTERRUPT_STATUS_1);
|
uint8_t buff[2];
|
||||||
_mod->SPIreadRegister(SI443X_REG_INTERRUPT_STATUS_2);
|
_mod->SPIreadRegisterBurst(SI443X_REG_INTERRUPT_STATUS_1, 2, buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t Si443x::config() {
|
int16_t Si443x::config() {
|
||||||
|
@ -615,8 +620,7 @@ int16_t Si443x::config() {
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// disable POR and chip ready interrupts
|
// disable POR and chip ready interrupts
|
||||||
state = _mod->SPIsetRegValue(SI443X_REG_INTERRUPT_ENABLE_2, 0x00);
|
_mod->SPIwriteRegister(SI443X_REG_INTERRUPT_ENABLE_2, 0x00);
|
||||||
RADIOLIB_ASSERT(state);
|
|
||||||
|
|
||||||
// disable packet header
|
// disable packet header
|
||||||
state = _mod->SPIsetRegValue(SI443X_REG_HEADER_CONTROL_2, SI443X_SYNC_WORD_TIMEOUT_ON | SI443X_HEADER_LENGTH_HEADER_NONE, 7, 4);
|
state = _mod->SPIsetRegValue(SI443X_REG_HEADER_CONTROL_2, SI443X_SYNC_WORD_TIMEOUT_ON | SI443X_HEADER_LENGTH_HEADER_NONE, 7, 4);
|
||||||
|
|
|
@ -792,6 +792,7 @@ class Si443x: public PhysicalLayer {
|
||||||
|
|
||||||
float _br = 0;
|
float _br = 0;
|
||||||
float _freqDev = 0;
|
float _freqDev = 0;
|
||||||
|
float _freq = 0;
|
||||||
|
|
||||||
size_t _packetLength = 0;
|
size_t _packetLength = 0;
|
||||||
bool _packetLengthQueried = false;
|
bool _packetLengthQueried = false;
|
||||||
|
|
Loading…
Add table
Reference in a new issue