[SX126x] Fixed issues in configuration

This commit is contained in:
jgromes 2019-05-11 11:56:39 +02:00
parent 663473c554
commit 657642a591
2 changed files with 47 additions and 12 deletions

View file

@ -7,6 +7,9 @@ SX126x::SX126x(Module* mod) : PhysicalLayer(SX126X_CRYSTAL_FREQ, SX126X_DIV_EXPO
_sf = 9; _sf = 9;
_cr = SX126X_LORA_CR_4_7; _cr = SX126X_LORA_CR_4_7;
_ldro = 0x00; _ldro = 0x00;
_payloadLength = 255;
_crcType = SX126X_LORA_CRC_ON;
_preambleLength = 8;
} }
int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float currentLimit, uint16_t preambleLength) { int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float currentLimit, uint16_t preambleLength) {
@ -63,7 +66,15 @@ int16_t SX126x::receive(uint8_t* data, size_t len) {
} }
int16_t SX126x::transmitDirect(uint32_t frf) { int16_t SX126x::transmitDirect(uint32_t frf) {
// user requested to start transmitting immediately (required for RTTY)
if(frf != 0) {
setRfFrequency(frf);
}
// start transmitting
uint8_t data[] = {SX126X_CMD_NOP};
SPIwriteCommand(SX126X_CMD_SET_TX_CONTINUOUS_WAVE, data, 1);
return(ERR_NONE);
} }
int16_t SX126x::receiveDirect() { int16_t SX126x::receiveDirect() {
@ -119,7 +130,7 @@ int16_t SX126x::setBandwidth(float bw) {
// update modulation parameters // update modulation parameters
_bwKhz = bw; _bwKhz = bw;
setModulationParams(_bw, _sf, _cr); setModulationParams(_sf, _bw, _cr);
return(ERR_NONE); return(ERR_NONE);
} }
@ -136,7 +147,7 @@ int16_t SX126x::setSpreadingFactor(uint8_t sf) {
// update modulation parameters // update modulation parameters
_sf = sf; _sf = sf;
setModulationParams(_bw, _sf, _cr); setModulationParams(_sf, _bw, _cr);
return(ERR_NONE); return(ERR_NONE);
} }
@ -153,7 +164,7 @@ int16_t SX126x::setCodingRate(uint8_t cr) {
// update modulation parameters // update modulation parameters
_cr = cr - 4; _cr = cr - 4;
setModulationParams(_bw, _sf, _cr); setModulationParams(_sf, _bw, _cr);
return(ERR_NONE); return(ERR_NONE);
} }
@ -181,7 +192,7 @@ int16_t SX126x::setCurrentLimit(float currentLimit) {
int16_t SX126x::setPreambleLength(uint16_t preambleLength) { int16_t SX126x::setPreambleLength(uint16_t preambleLength) {
// update packet parameters // update packet parameters
_preambleLength = preambleLength; _preambleLength = preambleLength;
setPacketParams((uint8_t)((_preambleLength >> 8) & 0xFF), (uint8_t)(_preambleLength & 0xFF), _payloadLength, _crcType); setPacketParams(_preambleLength, _payloadLength, _crcType);
return(ERR_NONE); return(ERR_NONE);
} }
@ -209,7 +220,7 @@ void SX126x::setCad() {
void SX126x::setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax, uint8_t paLut) { void SX126x::setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax, uint8_t paLut) {
uint8_t data[4] = {paDutyCycle, deviceSel, hpMax, paLut}; uint8_t data[4] = {paDutyCycle, deviceSel, hpMax, paLut};
SPIwriteCommand(SX126X_CMD_SET_TX_PARAMS, data, 4); SPIwriteCommand(SX126X_CMD_SET_PA_CONFIG, data, 4);
} }
void SX126x::writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { void SX126x::writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) {
@ -267,9 +278,15 @@ void SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldr
SPIwriteCommand(SX126X_CMD_SET_MODULATION_PARAMS, data, 4); SPIwriteCommand(SX126X_CMD_SET_MODULATION_PARAMS, data, 4);
} }
void SX126x::setPacketParams(uint16_t preambleLength, uint8_t headerType, uint8_t payloadLength, uint8_t crcType, uint8_t invertIQ) { void SX126x::setPacketParams(uint16_t preambleLength, uint8_t payloadLength, uint8_t crcType, uint8_t headerType, uint8_t invertIQ) {
uint8_t data[7] = {(uint8_t)((preambleLength >> 8) & 0xFF), (uint8_t)(preambleLength & 0xFF), headerType, payloadLength, crcType, invertIQ}; uint8_t data[6] = {(uint8_t)((preambleLength >> 8) & 0xFF), (uint8_t)(preambleLength & 0xFF), headerType, payloadLength, crcType, invertIQ};
SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, data, 7); SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, data, 6);
}
uint8_t SX126x::getStatus() {
uint8_t data[1];
SPIreadCommand(SX126X_CMD_GET_STATUS, data, 1);
return(data[0]);
} }
uint8_t SX126x::getRssiInt() { uint8_t SX126x::getRssiInt() {
@ -279,6 +296,7 @@ uint8_t SX126x::getRssiInt() {
} }
int16_t SX126x::setFrequencyRaw(float freq) { int16_t SX126x::setFrequencyRaw(float freq) {
// TODO CalibrateImage
// calculate raw value // calculate raw value
uint32_t frf = (freq * (uint32_t(1) << SX126X_DIV_EXPONENT)) / SX126X_CRYSTAL_FREQ; uint32_t frf = (freq * (uint32_t(1) << SX126X_DIV_EXPONENT)) / SX126X_CRYSTAL_FREQ;
setRfFrequency(frf); setRfFrequency(frf);
@ -333,18 +351,34 @@ void SX126x::SPItransfer(uint8_t cmd, bool write, uint8_t* dataOut, uint8_t* dat
// send command byte // send command byte
spi->transfer(cmd); spi->transfer(cmd);
DEBUG_PRINT(cmd, HEX);
DEBUG_PRINT('\t');
// send/receive all bytes // send/receive all bytes
if(write) { if(write) {
for(uint8_t n = 0; n < numBytes; n++) { for(uint8_t n = 0; n < numBytes; n++) {
spi->transfer(dataOut[n]); uint8_t in = spi->transfer(dataOut[n]);
DEBUG_PRINT(dataOut[n], HEX);
DEBUG_PRINT('\t');
DEBUG_PRINT(in, HEX);
DEBUG_PRINT('\t');
} }
DEBUG_PRINTLN();
} else { } else {
// skip the first byte for read-type commands (status-only) // skip the first byte for read-type commands (status-only)
spi->transfer(SX126X_CMD_NOP); uint8_t in = spi->transfer(SX126X_CMD_NOP);
DEBUG_PRINT(SX126X_CMD_NOP, HEX);
DEBUG_PRINT('\t');
DEBUG_PRINT(in, HEX);
DEBUG_PRINT('\t')
for(uint8_t n = 0; n < numBytes; n++) { for(uint8_t n = 0; n < numBytes; n++) {
dataIn[n] = spi->transfer(SX126X_CMD_NOP); dataIn[n] = spi->transfer(SX126X_CMD_NOP);
DEBUG_PRINT(SX126X_CMD_NOP, HEX);
DEBUG_PRINT('\t');
DEBUG_PRINT(dataIn[n], HEX);
DEBUG_PRINT('\t');
} }
DEBUG_PRINTLN();
} }
// stop transfer // stop transfer

View file

@ -341,7 +341,7 @@ class SX126x: public PhysicalLayer {
protected: protected:
// SX1276x SPI command implementations // SX1276x SPI command implementations
void setTx(uint32_t timeout); void setTx(uint32_t timeout = 0);
void setRx(uint32_t timeout); void setRx(uint32_t timeout);
void setCad(); void setCad();
void setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax = SX126X_PA_CONFIG_HP_MAX, uint8_t paLut = SX126X_PA_CONFIG_PA_LUT); void setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax = SX126X_PA_CONFIG_HP_MAX, uint8_t paLut = SX126X_PA_CONFIG_PA_LUT);
@ -353,6 +353,7 @@ class SX126x: public PhysicalLayer {
void setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_80U); void setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_80U);
void setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF); void setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF);
void setPacketParams(uint16_t preambleLength, uint8_t payloadLength, uint8_t crcType, uint8_t headerType = SX126X_LORA_HEADER_EXPLICIT, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); void setPacketParams(uint16_t preambleLength, uint8_t payloadLength, uint8_t crcType, uint8_t headerType = SX126X_LORA_HEADER_EXPLICIT, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD);
uint8_t getStatus();
uint8_t getRssiInt(); uint8_t getRssiInt();
int16_t setFrequencyRaw(float freq); int16_t setFrequencyRaw(float freq);