From 69287afcae0442aa6b39f89801668701d2299e84 Mon Sep 17 00:00:00 2001 From: Richard Unger Date: Fri, 10 May 2024 10:16:56 +0200 Subject: [PATCH] fix SPI operation order #43 --- src/encoders/a1334/A1334.cpp | 9 +++++---- src/encoders/aeat8800q24/AEAT8800Q24.cpp | 6 +++--- src/encoders/as5047/AS5047.cpp | 9 +++++---- src/encoders/as5047u/AS5047U.cpp | 17 +++++++++-------- src/encoders/as5048a/AS5048A.cpp | 9 +++++---- src/encoders/mt6816/MT6816.cpp | 4 ++-- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/encoders/a1334/A1334.cpp b/src/encoders/a1334/A1334.cpp index 85a4e11..23a7696 100644 --- a/src/encoders/a1334/A1334.cpp +++ b/src/encoders/a1334/A1334.cpp @@ -17,9 +17,10 @@ A1334::~A1334() { void A1334::init(SPIClass* _spi) { spi = _spi; - if (nCS>=0) + if (nCS>=0) { pinMode(nCS, OUTPUT); - digitalWrite(nCS, HIGH); + digitalWrite(nCS, HIGH); + } //SPI has an internal SPI-device counter, it is possible to call "begin()" from different devices spi->begin(); readRawAngle(); // read an angle @@ -42,13 +43,13 @@ A1334Angle A1334::readRawAngle() { uint16_t A1334::spi_transfer16(uint16_t outdata) { + spi->beginTransaction(settings); if (nCS>=0) digitalWrite(nCS, 0); - spi->beginTransaction(settings); uint16_t result = spi->transfer16(outdata); - spi->endTransaction(); if (nCS>=0) digitalWrite(nCS, 1); + spi->endTransaction(); return result; }; diff --git a/src/encoders/aeat8800q24/AEAT8800Q24.cpp b/src/encoders/aeat8800q24/AEAT8800Q24.cpp index 8be3bd5..9331438 100644 --- a/src/encoders/aeat8800q24/AEAT8800Q24.cpp +++ b/src/encoders/aeat8800q24/AEAT8800Q24.cpp @@ -78,14 +78,14 @@ void AEAT8800Q24::setConf2(AEAT8800Q24_CONF2_t value){ uint16_t AEAT8800Q24::transfer16SPI(uint16_t outValue) { // delay 1us between switching the CS line to SPI delayMicroseconds(1); - if (nCS >= 0) - digitalWrite(nCS, LOW); spi->endTransaction(); spi->beginTransaction(spiSettings); + if (nCS >= 0) + digitalWrite(nCS, LOW); uint16_t value = spi->transfer16(outValue); - spi->endTransaction(); if (nCS >= 0) digitalWrite(nCS, HIGH); + spi->endTransaction(); // delay 1us between switching the CS line to SSI delayMicroseconds(1); spi->beginTransaction(ssiSettings); diff --git a/src/encoders/as5047/AS5047.cpp b/src/encoders/as5047/AS5047.cpp index 9455775..f3b4305 100644 --- a/src/encoders/as5047/AS5047.cpp +++ b/src/encoders/as5047/AS5047.cpp @@ -17,9 +17,10 @@ AS5047::~AS5047() { void AS5047::init(SPIClass* _spi) { spi = _spi; - if (nCS>=0) + if (nCS>=0) { pinMode(nCS, OUTPUT); - digitalWrite(nCS, HIGH); + digitalWrite(nCS, HIGH); + } //SPI has an internal SPI-device counter, it is possible to call "begin()" from different devices spi->begin(); readRawAngle(); // read an angle @@ -230,13 +231,13 @@ uint16_t AS5047::calcParity(uint16_t data){ uint16_t AS5047::spi_transfer16(uint16_t outdata) { + spi->beginTransaction(settings); if (nCS>=0) digitalWrite(nCS, 0); - spi->beginTransaction(settings); uint16_t result = spi->transfer16(outdata); - spi->endTransaction(); if (nCS>=0) digitalWrite(nCS, 1); + spi->endTransaction(); // TODO check parity errorflag = ((result&AS5047_ERRFLG)>0); return result; diff --git a/src/encoders/as5047u/AS5047U.cpp b/src/encoders/as5047u/AS5047U.cpp index bfe70be..00a1f36 100644 --- a/src/encoders/as5047u/AS5047U.cpp +++ b/src/encoders/as5047u/AS5047U.cpp @@ -17,9 +17,10 @@ AS5047U::~AS5047U() { void AS5047U::init(SPIClass* _spi) { spi = _spi; - if (nCS>=0) + if (nCS>=0) { pinMode(nCS, OUTPUT); - digitalWrite(nCS, HIGH); + digitalWrite(nCS, HIGH); + } //SPI has an internal SPI-device counter, it is possible to call "begin()" from different devices spi->begin(); readRawAngle(); // read an angle @@ -291,13 +292,13 @@ uint16_t AS5047U::nop16(){ uint16_t AS5047U::spi_transfer16(uint16_t outdata) { + spi->beginTransaction(settings); if (nCS>=0) digitalWrite(nCS, 0); - spi->beginTransaction(settings); uint16_t result = spi->transfer16(outdata); - spi->endTransaction(); if (nCS>=0) digitalWrite(nCS, 1); + spi->endTransaction(); errorflag = ((result&AS5047U_ERROR)>0); warningflag = ((result&AS5047U_WARNING)>0); return result; @@ -321,26 +322,26 @@ uint16_t AS5047U::writeRegister24(uint16_t reg, uint16_t data) { buff[0] = (reg>>8)&0x3F; buff[1] = reg&0xFF; buff[2] = calcCRC(reg); + spi->beginTransaction(settings); if (nCS>=0) digitalWrite(nCS, 0); - spi->beginTransaction(settings); spi->transfer(buff, 3); - spi->endTransaction(); if (nCS>=0) digitalWrite(nCS, 1); + spi->endTransaction(); errorflag = ((buff[0]&0x40)>0); warningflag = ((buff[0]&0x80)>0); buff[0] = (data>>8)&0x3F; buff[1] = data&0xFF; buff[2] = calcCRC(data); + spi->beginTransaction(settings); if (nCS>=0) digitalWrite(nCS, 0); - spi->beginTransaction(settings); spi->transfer(buff, 3); - spi->endTransaction(); if (nCS>=0) digitalWrite(nCS, 1); + spi->endTransaction(); errorflag = ((buff[0]&0x40)>0); warningflag = ((buff[0]&0x80)>0); diff --git a/src/encoders/as5048a/AS5048A.cpp b/src/encoders/as5048a/AS5048A.cpp index 27ef254..b66f968 100644 --- a/src/encoders/as5048a/AS5048A.cpp +++ b/src/encoders/as5048a/AS5048A.cpp @@ -17,9 +17,10 @@ AS5048A::~AS5048A() { void AS5048A::init(SPIClass* _spi) { spi = _spi; - if (nCS>=0) + if (nCS>=0) { pinMode(nCS, OUTPUT); - digitalWrite(nCS, HIGH); + digitalWrite(nCS, HIGH); + } //SPI has an internal SPI-device counter, it is possible to call "begin()" from different devices spi->begin(); readRawAngle(); // read an angle @@ -103,13 +104,13 @@ uint16_t AS5048A::nop(){ } uint16_t AS5048A::spi_transfer16(uint16_t outdata) { + spi->beginTransaction(settings); if (nCS>=0) digitalWrite(nCS, 0); - spi->beginTransaction(settings); uint16_t result = spi->transfer16(outdata); - spi->endTransaction(); if (nCS>=0) digitalWrite(nCS, 1); + spi->endTransaction(); // TODO check parity errorflag = ((result&AS5048A_ERRFLG)>0); return result; diff --git a/src/encoders/mt6816/MT6816.cpp b/src/encoders/mt6816/MT6816.cpp index d874bad..fec02d0 100644 --- a/src/encoders/mt6816/MT6816.cpp +++ b/src/encoders/mt6816/MT6816.cpp @@ -44,13 +44,13 @@ bool MT6816::parityCheck(uint16_t data) { } uint16_t MT6816::spi_transfer16(uint16_t outdata) { + spi->beginTransaction(settings); if (nCS>=0) digitalWrite(nCS, 0); - spi->beginTransaction(settings); uint16_t result = spi->transfer16(outdata); - spi->endTransaction(); if (nCS>=0) digitalWrite(nCS, 1); + spi->endTransaction(); return result; }