From 8d9accf4ae63222cccc70f79cae7049ed461e17f Mon Sep 17 00:00:00 2001 From: Moritz Martinius Date: Sun, 29 Dec 2024 17:40:55 +0100 Subject: [PATCH] Restart measurement if cycle fails --- Core/Src/main.cpp | 72 +++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/Core/Src/main.cpp b/Core/Src/main.cpp index 55accd1..3c096be 100644 --- a/Core/Src/main.cpp +++ b/Core/Src/main.cpp @@ -49,41 +49,40 @@ int main(void) { usart2->println("I2C1 intialized successful"); } // init NAU7802 - { - std::vector data = {0x01}; - // reset NAU7802 - checkHalStatus(i2c1->write(0x2A, 0x00, data)); - usart2->println("Reset nau"); - HAL_Delay(100); - // power up digital logic - data[0] = 0x02; - i2c1->write(0x2A, 0x00, data); - HAL_Delay(100); - usart2->println("PUP digi"); + std::vector data = {0x01}; + // reset NAU7802 + checkHalStatus(i2c1->write(0x2A, 0x00, data)); + usart2->println("Reset nau"); + HAL_Delay(100); - // power up analog logic - data[0] = 0x06; - i2c1->write(0x2A, 0x00, data); - HAL_Delay(100); + // power up digital logic + data[0] = 0x02; + i2c1->write(0x2A, 0x00, data); + HAL_Delay(100); + usart2->println("PUP digi"); - usart2->println("PUP analog"); + // power up analog logic + data[0] = 0x06; + i2c1->write(0x2A, 0x00, data); + HAL_Delay(100); - // use internal LDO as reference - data[0] = 0x86; - checkHalStatus(i2c1->write(0x2A, 0x00, data)); - HAL_Delay(100); + usart2->println("PUP analog"); - // print status back to usart - auto ret = i2c1->read(0x2A, 0x00); - checkHalStatus(ret.first); - usart2->println("NAU7802 reports state " + std::to_string(ret.second) + " at 0x00"); + // use internal LDO as reference + data[0] = 0x86; + checkHalStatus(i2c1->write(0x2A, 0x00, data)); + HAL_Delay(100); - // REG_CHPS CLK_CHP off - data[0] = 0x30; - checkHalStatus(i2c1->write(0x2A, 0x15, data)); - HAL_Delay(100); - } + // print status back to usart + auto ret = i2c1->read(0x2A, 0x00); + checkHalStatus(ret.first); + usart2->println("NAU7802 reports state " + std::to_string(ret.second) + " at 0x00"); + + // REG_CHPS CLK_CHP off + data[0] = 0x30; + checkHalStatus(i2c1->write(0x2A, 0x15, data)); + HAL_Delay(100); uint32_t measurement = 0; auto val = i2c1->read(0x2A, 0x12); @@ -96,6 +95,18 @@ int main(void) { measurement |= val.second; while (1) { + val = i2c1->read(0x2A, 0x00); + if ((val.second & 0x20) != 0x20) { + // Measurement cycle not ready, lets wait a bit... + usart2->print("."); + // restart measurement cycle + data[0] = (val.second | 0x10); + i2c1->write(0x2A, 0x00, data); + HAL_Delay(100); + + continue; + } + measurement = 0; val = i2c1->read(0x2A, 0x12); measurement |= (val.second << 16); @@ -107,8 +118,7 @@ int main(void) { measurement |= val.second; usart2->println("Measurement " + std::to_string(measurement) + " counts"); - - HAL_Delay(1000); + HAL_Delay(100); } }