Added SPI verification after write
This commit is contained in:
parent
2d788da0c2
commit
43764a1f96
2 changed files with 56 additions and 27 deletions
|
@ -18,7 +18,7 @@ Module::Module(int cs, int tx, int rx, int int0, int int1) {
|
|||
ModuleSerial = new SoftwareSerial(_tx, _rx);
|
||||
}
|
||||
|
||||
uint8_t Module::init(uint8_t interface, uint8_t gpio) {
|
||||
void Module::init(uint8_t interface, uint8_t gpio) {
|
||||
DEBUG_BEGIN(9600);
|
||||
DEBUG_PRINTLN();
|
||||
|
||||
|
@ -97,7 +97,7 @@ bool Module::ATgetResponse() {
|
|||
return(false);
|
||||
}
|
||||
|
||||
uint8_t Module::SPIgetRegValue(uint8_t reg, uint8_t msb, uint8_t lsb) {
|
||||
int16_t Module::SPIgetRegValue(uint8_t reg, uint8_t msb, uint8_t lsb) {
|
||||
if((msb > 7) || (lsb > 7) || (lsb > msb)) {
|
||||
return(ERR_INVALID_BIT_RANGE);
|
||||
}
|
||||
|
@ -107,24 +107,64 @@ uint8_t Module::SPIgetRegValue(uint8_t reg, uint8_t msb, uint8_t lsb) {
|
|||
return(maskedValue);
|
||||
}
|
||||
|
||||
uint8_t Module::SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes) {
|
||||
digitalWrite(_cs, LOW);
|
||||
SPI.transfer(reg | SPI_READ);
|
||||
for(uint8_t i = 0; i < numBytes; i++) {
|
||||
inBytes[i] = SPI.transfer(reg);
|
||||
int16_t Module::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t lsb) {
|
||||
if((msb > 7) || (lsb > 7) || (lsb > msb)) {
|
||||
return(ERR_INVALID_BIT_RANGE);
|
||||
}
|
||||
digitalWrite(_cs, HIGH);
|
||||
|
||||
uint8_t currentValue = SPIreadRegister(reg);
|
||||
uint8_t mask = ~((0b11111111 << (msb + 1)) | (0b11111111 >> (8 - lsb)));
|
||||
uint8_t newValue = (currentValue & ~mask) | (value & mask);
|
||||
SPIwriteRegister(reg, newValue);
|
||||
|
||||
// some registers need a bit of time to process the change
|
||||
// e.g. SX127X_REG_OP_MODE
|
||||
delay(5);
|
||||
|
||||
// check if the write was successful
|
||||
uint8_t readValue = SPIreadRegister(reg);
|
||||
if(readValue != newValue) {
|
||||
DEBUG_PRINTLN();
|
||||
DEBUG_PRINT_STR("address:\t0x");
|
||||
DEBUG_PRINTLN_HEX(reg);
|
||||
DEBUG_PRINT_STR("bits:\t\t");
|
||||
DEBUG_PRINT(msb);
|
||||
DEBUG_PRINT(' ');
|
||||
DEBUG_PRINTLN(lsb);
|
||||
DEBUG_PRINT_STR("value:\t\t0b");
|
||||
DEBUG_PRINTLN_BIN(value);
|
||||
DEBUG_PRINT_STR("current:\t0b");
|
||||
DEBUG_PRINTLN_BIN(currentValue);
|
||||
DEBUG_PRINT_STR("mask:\t\t0b");
|
||||
DEBUG_PRINTLN_BIN(mask);
|
||||
DEBUG_PRINT_STR("new:\t\t0b");
|
||||
DEBUG_PRINTLN_BIN(newValue);
|
||||
DEBUG_PRINT_STR("read:\t\t0b");
|
||||
DEBUG_PRINTLN_BIN(readValue);
|
||||
DEBUG_PRINTLN();
|
||||
|
||||
return(ERR_SPI_WRITE_FAILED);
|
||||
}
|
||||
|
||||
return(ERR_NONE);
|
||||
}
|
||||
|
||||
uint8_t Module::SPIreadRegisterBurstStr(uint8_t reg, uint8_t numBytes, char* inBytes) {
|
||||
void Module::SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes) {
|
||||
digitalWrite(_cs, LOW);
|
||||
SPI.transfer(reg | SPI_READ);
|
||||
for(uint8_t i = 0; i < numBytes; i++) {
|
||||
inBytes[i] = SPI.transfer(reg);
|
||||
}
|
||||
digitalWrite(_cs, HIGH);
|
||||
}
|
||||
|
||||
void Module::SPIreadRegisterBurstStr(uint8_t reg, uint8_t numBytes, char* inBytes) {
|
||||
digitalWrite(_cs, LOW);
|
||||
SPI.transfer(reg | SPI_READ);
|
||||
for(uint8_t i = 0; i < numBytes; i++) {
|
||||
inBytes[i] = SPI.transfer(reg);
|
||||
}
|
||||
digitalWrite(_cs, HIGH);
|
||||
return(ERR_NONE);
|
||||
}
|
||||
|
||||
uint8_t Module::SPIreadRegister(uint8_t reg) {
|
||||
|
@ -138,18 +178,6 @@ uint8_t Module::SPIreadRegister(uint8_t reg) {
|
|||
return(inByte);
|
||||
}
|
||||
|
||||
uint8_t Module::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t lsb) {
|
||||
if((msb > 7) || (lsb > 7) || (lsb > msb)) {
|
||||
return(ERR_INVALID_BIT_RANGE);
|
||||
}
|
||||
|
||||
uint8_t currentValue = SPIreadRegister(reg);
|
||||
uint8_t mask = ~((0b11111111 << (msb + 1)) | (0b11111111 >> (8 - lsb)));
|
||||
uint8_t newValue = (currentValue & ~mask) | (value & mask);
|
||||
SPIwriteRegister(reg, newValue);
|
||||
return(ERR_NONE);
|
||||
}
|
||||
|
||||
void Module::SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, uint8_t numBytes) {
|
||||
digitalWrite(_cs, LOW);
|
||||
SPI.transfer(reg | SPI_WRITE);
|
||||
|
|
11
src/Module.h
11
src/Module.h
|
@ -20,19 +20,20 @@ class Module {
|
|||
uint32_t baudrate = 9600;
|
||||
const char* AtLineFeed = "\r\n";
|
||||
|
||||
uint8_t init(uint8_t interface, uint8_t gpio);
|
||||
void init(uint8_t interface, uint8_t gpio);
|
||||
|
||||
void ATemptyBuffer();
|
||||
bool ATgetResponse();
|
||||
bool ATsendCommand(const char* cmd);
|
||||
bool ATsendData(uint8_t* data, uint32_t len);
|
||||
|
||||
uint8_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0);
|
||||
uint8_t SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes);
|
||||
uint8_t SPIreadRegisterBurstStr(uint8_t reg, uint8_t numBytes, char* str);
|
||||
int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0);
|
||||
int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0);
|
||||
|
||||
void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes);
|
||||
void SPIreadRegisterBurstStr(uint8_t reg, uint8_t numBytes, char* str);
|
||||
uint8_t SPIreadRegister(uint8_t reg);
|
||||
|
||||
uint8_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0);
|
||||
void SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, uint8_t numBytes);
|
||||
void SPIwriteRegisterBurstStr(uint8_t reg, const char* data, uint8_t numBytes);
|
||||
void SPIwriteRegister(uint8_t reg, uint8_t data);
|
||||
|
|
Loading…
Add table
Reference in a new issue