From 43764a1f9687a5fc18c6f96a0831473c32ff39cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Grome=C5=A1?= Date: Mon, 23 Jul 2018 11:19:34 +0200 Subject: [PATCH] Added SPI verification after write --- src/Module.cpp | 72 +++++++++++++++++++++++++++++++++++--------------- src/Module.h | 11 ++++---- 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index b6ce558a..229ee5b7 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -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); diff --git a/src/Module.h b/src/Module.h index d5d1012a..1f7c8e69 100644 --- a/src/Module.h +++ b/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);