Added length mode configuration methods and handling
This commit is contained in:
parent
b599a35879
commit
7e42f77c95
2 changed files with 67 additions and 9 deletions
|
@ -3,6 +3,7 @@
|
||||||
CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_EXPONENT, CC1101_MAX_PACKET_LENGTH) {
|
CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_EXPONENT, CC1101_MAX_PACKET_LENGTH) {
|
||||||
_mod = module;
|
_mod = module;
|
||||||
_packetLengthQueried = false;
|
_packetLengthQueried = false;
|
||||||
|
_packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) {
|
int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) {
|
||||||
|
@ -20,15 +21,15 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po
|
||||||
flagFound = true;
|
flagFound = true;
|
||||||
} else {
|
} else {
|
||||||
#ifdef RADIOLIB_DEBUG
|
#ifdef RADIOLIB_DEBUG
|
||||||
Serial.print(F("CC1101 not found! ("));
|
RADIOLIB_DEBUG_PRINT(F("CC1101 not found! ("));
|
||||||
Serial.print(i + 1);
|
RADIOLIB_DEBUG_PRINT(i + 1);
|
||||||
Serial.print(F(" of 10 tries) CC1101_REG_VERSION == "));
|
RADIOLIB_DEBUG_PRINT(F(" of 10 tries) CC1101_REG_VERSION == "));
|
||||||
|
|
||||||
char buffHex[7];
|
char buffHex[7];
|
||||||
sprintf(buffHex, "0x%04X", version);
|
sprintf(buffHex, "0x%04X", version);
|
||||||
Serial.print(buffHex);
|
RADIOLIB_DEBUG_PRINT(buffHex);
|
||||||
Serial.print(F(", expected 0x0014"));
|
RADIOLIB_DEBUG_PRINT(F(", expected 0x0014"));
|
||||||
Serial.println();
|
RADIOLIB_DEBUG_PRINTLN();
|
||||||
#endif
|
#endif
|
||||||
delay(1000);
|
delay(1000);
|
||||||
i++;
|
i++;
|
||||||
|
@ -192,8 +193,10 @@ int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// write packet length
|
// optionally write packet length
|
||||||
SPIwriteRegister(CC1101_REG_FIFO, len);
|
if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) {
|
||||||
|
SPIwriteRegister(CC1101_REG_FIFO, len);
|
||||||
|
}
|
||||||
|
|
||||||
// check address filtering
|
// check address filtering
|
||||||
uint8_t filter = SPIgetRegValue(CC1101_REG_PKTCTRL1, 1, 0);
|
uint8_t filter = SPIgetRegValue(CC1101_REG_PKTCTRL1, 1, 0);
|
||||||
|
@ -477,7 +480,11 @@ uint8_t CC1101::getLQI() {
|
||||||
|
|
||||||
size_t CC1101::getPacketLength(bool update) {
|
size_t CC1101::getPacketLength(bool update) {
|
||||||
if(!_packetLengthQueried && update) {
|
if(!_packetLengthQueried && update) {
|
||||||
_packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO);
|
|
||||||
|
uint8_t format = SPIgetRegValue(CC1101_REG_PKTCTRL0, 1, 0);
|
||||||
|
if (format == CC1101_LENGTH_CONFIG_VARIABLE) {
|
||||||
|
_packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO);
|
||||||
|
}
|
||||||
_packetLengthQueried = true;
|
_packetLengthQueried = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,6 +504,38 @@ int16_t CC1101::config() {
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t CC1101::fixedPacketLengthMode(uint8_t len) {
|
||||||
|
if (len > CC1101_MAX_PACKET_LENGTH) {
|
||||||
|
return(ERR_PACKET_TOO_LONG);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_FIXED, 1, 0);
|
||||||
|
if (state != ERR_NONE) {
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = SPIsetRegValue(CC1101_REG_PKTLEN, len);
|
||||||
|
if (state != ERR_NONE) {
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) {
|
||||||
|
if (maxLen > CC1101_MAX_PACKET_LENGTH) {
|
||||||
|
return(ERR_PACKET_TOO_LONG);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0);
|
||||||
|
if (state != ERR_NONE) {
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = SPIsetRegValue(CC1101_REG_PKTLEN, maxLen);
|
||||||
|
if (state != ERR_NONE) {
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int16_t CC1101::directMode() {
|
int16_t CC1101::directMode() {
|
||||||
// set mode to standby
|
// set mode to standby
|
||||||
SPIsendCommand(CC1101_CMD_IDLE);
|
SPIsendCommand(CC1101_CMD_IDLE);
|
||||||
|
|
|
@ -739,6 +739,24 @@ class CC1101: public PhysicalLayer {
|
||||||
*/
|
*/
|
||||||
size_t getPacketLength(bool update = true);
|
size_t getPacketLength(bool update = true);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Set modem in fixed packet length mode.
|
||||||
|
|
||||||
|
\param len Packet length.
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t fixedPacketLengthMode(uint8_t len = CC1101_MAX_PACKET_LENGTH);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Set modem in variable packet length mode.
|
||||||
|
|
||||||
|
\param len Maximum packet length.
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t variablePacketLengthMode(uint8_t maxLen = CC1101_MAX_PACKET_LENGTH);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Module* _mod;
|
Module* _mod;
|
||||||
|
|
||||||
|
@ -748,6 +766,7 @@ class CC1101: public PhysicalLayer {
|
||||||
|
|
||||||
size_t _packetLength;
|
size_t _packetLength;
|
||||||
bool _packetLengthQueried;
|
bool _packetLengthQueried;
|
||||||
|
uint8_t _packetLengthConfig;
|
||||||
|
|
||||||
int16_t config();
|
int16_t config();
|
||||||
int16_t directMode();
|
int16_t directMode();
|
||||||
|
|
Loading…
Add table
Reference in a new issue