[SX126x] Added post-transaction error checking (#575)
This commit is contained in:
parent
3baa4bd80f
commit
3bdc8963a4
2 changed files with 83 additions and 5 deletions
|
@ -1233,6 +1233,10 @@ uint8_t SX126x::randomByte() {
|
||||||
return(randByte);
|
return(randByte);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t SX126x::getLastError() {
|
||||||
|
return(_lastError);
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE)
|
#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE)
|
||||||
void SX126x::setDirectAction(void (*func)(void)) {
|
void SX126x::setDirectAction(void (*func)(void)) {
|
||||||
// SX126x is unable to perform direct mode reception
|
// SX126x is unable to perform direct mode reception
|
||||||
|
@ -1330,8 +1334,15 @@ int16_t SX126x::writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX126x::readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) {
|
int16_t SX126x::readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) {
|
||||||
|
// send the command
|
||||||
uint8_t cmd[] = { RADIOLIB_SX126X_CMD_READ_REGISTER, (uint8_t)((addr >> 8) & 0xFF), (uint8_t)(addr & 0xFF) };
|
uint8_t cmd[] = { RADIOLIB_SX126X_CMD_READ_REGISTER, (uint8_t)((addr >> 8) & 0xFF), (uint8_t)(addr & 0xFF) };
|
||||||
return(SX126x::SPItransfer(cmd, 3, false, NULL, data, numBytes, true));
|
int16_t state = SX126x::SPItransfer(cmd, 3, false, NULL, data, numBytes, true);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// check the status
|
||||||
|
state = checkCommandResult();
|
||||||
|
return(state);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX126x::writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) {
|
int16_t SX126x::writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) {
|
||||||
|
@ -1619,20 +1630,77 @@ int16_t SX126x::config(uint8_t modem) {
|
||||||
return(RADIOLIB_ERR_NONE);
|
return(RADIOLIB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t SX126x::checkCommandResult() {
|
||||||
|
int16_t state = RADIOLIB_ERR_NONE;
|
||||||
|
|
||||||
|
#if defined(RADIOLIB_SPI_PARANOID)
|
||||||
|
// get the status
|
||||||
|
uint8_t spiStatus = 0;
|
||||||
|
uint8_t cmd = RADIOLIB_SX126X_CMD_GET_STATUS;
|
||||||
|
state = SX126x::SPItransfer(&cmd, 1, false, NULL, &spiStatus, 1, true);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// translate to RadioLib status code
|
||||||
|
switch(spiStatus) {
|
||||||
|
case RADIOLIB_SX126X_STATUS_CMD_TIMEOUT:
|
||||||
|
_lastError = RADIOLIB_ERR_SPI_CMD_TIMEOUT;
|
||||||
|
break;
|
||||||
|
case RADIOLIB_SX126X_STATUS_CMD_INVALID:
|
||||||
|
_lastError = RADIOLIB_ERR_SPI_CMD_INVALID;
|
||||||
|
break;
|
||||||
|
case RADIOLIB_SX126X_STATUS_CMD_FAILED:
|
||||||
|
_lastError = RADIOLIB_ERR_SPI_CMD_FAILED;
|
||||||
|
break;
|
||||||
|
case RADIOLIB_SX126X_STATUS_SPI_FAILED:
|
||||||
|
_lastError = RADIOLIB_ERR_CHIP_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_lastError = RADIOLIB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(state);
|
||||||
|
}
|
||||||
|
|
||||||
int16_t SX126x::SPIwriteCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
int16_t SX126x::SPIwriteCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
||||||
return(SX126x::SPItransfer(cmd, cmdLen, true, data, NULL, numBytes, waitForBusy));
|
// send the command
|
||||||
|
int16_t state = SX126x::SPItransfer(cmd, cmdLen, true, data, NULL, numBytes, waitForBusy);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// check the status
|
||||||
|
state = checkCommandResult();
|
||||||
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX126x::SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
int16_t SX126x::SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
||||||
return(SX126x::SPItransfer(&cmd, 1, true, data, NULL, numBytes, waitForBusy));
|
// send the command
|
||||||
|
int16_t state = SX126x::SPItransfer(&cmd, 1, true, data, NULL, numBytes, waitForBusy);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// check the status
|
||||||
|
state = checkCommandResult();
|
||||||
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX126x::SPIreadCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
int16_t SX126x::SPIreadCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
||||||
return(SX126x::SPItransfer(cmd, cmdLen, false, NULL, data, numBytes, waitForBusy));
|
// send the command
|
||||||
|
int16_t state = SX126x::SPItransfer(cmd, cmdLen, false, NULL, data, numBytes, waitForBusy);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// check the status
|
||||||
|
state = checkCommandResult();
|
||||||
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX126x::SPIreadCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
int16_t SX126x::SPIreadCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy) {
|
||||||
return(SX126x::SPItransfer(&cmd, 1, false, NULL, data, numBytes, waitForBusy));
|
// send the command
|
||||||
|
int16_t state = SX126x::SPItransfer(&cmd, 1, false, NULL, data, numBytes, waitForBusy);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
// check the status
|
||||||
|
state = checkCommandResult();
|
||||||
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes, bool waitForBusy, uint32_t timeout) {
|
int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes, bool waitForBusy, uint32_t timeout) {
|
||||||
|
|
|
@ -935,6 +935,13 @@ class SX126x: public PhysicalLayer {
|
||||||
*/
|
*/
|
||||||
uint8_t randomByte();
|
uint8_t randomByte();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Get the last recorded transaction error.
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t getLastError();
|
||||||
|
|
||||||
#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE)
|
#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE)
|
||||||
/*!
|
/*!
|
||||||
\brief Dummy method, to ensure PhysicalLayer compatibility.
|
\brief Dummy method, to ensure PhysicalLayer compatibility.
|
||||||
|
@ -1024,7 +1031,10 @@ class SX126x: public PhysicalLayer {
|
||||||
|
|
||||||
size_t _implicitLen = 0;
|
size_t _implicitLen = 0;
|
||||||
|
|
||||||
|
int16_t _lastError = RADIOLIB_ERR_NONE;
|
||||||
|
|
||||||
int16_t config(uint8_t modem);
|
int16_t config(uint8_t modem);
|
||||||
|
int16_t checkCommandResult();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue