From de85f9771aef5b20b31c0da17b74157c70d0356f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20=C5=BDaitl=C3=ADk?= Date: Mon, 23 May 2022 21:37:51 +0200 Subject: [PATCH] Fixed the errors with UART unlocking in i2c functions. --- fw/Core/Src/scd4x.c | 8 ++++---- fw/Core/Src/sgp40.c | 17 +++++++++++++++++ fw/Core/Src/sht4x.c | 8 ++++---- fw/Core/Src/sps30.c | 17 +++++++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/fw/Core/Src/scd4x.c b/fw/Core/Src/scd4x.c index 7c9bb9e..330d74d 100644 --- a/fw/Core/Src/scd4x.c +++ b/fw/Core/Src/scd4x.c @@ -79,19 +79,19 @@ int8_t scd4x_read_measurement(uint16_t *co2, int16_t *temperature, uint16_t *rel return SCD4X_ERROR; }*/ - // disable interrupts to prevent MODBUS/I2C conflict - uart_disable_interrupts(); // start measurement buffer[0] = SCD4X_READ_MEASUREMENT >> 8; buffer[1] = SCD4X_READ_MEASUREMENT & 0x00ff; + // disable interrupts to prevent MODBUS/I2C conflict + uart_disable_interrupts(); result = i2c_transmit(SCD4X_I2C_ADDRESS<<1, buffer, 2); + uart_enable_interrupts(); if (result != I2C_OK) { return SCD4X_ERROR; } - uart_enable_interrupts(); LL_mDelay(1); // 10 ms should be enough - uart_disable_interrupts(); // read out + uart_disable_interrupts(); result = i2c_receive(SCD4X_I2C_ADDRESS<<1, buffer, 9); uart_enable_interrupts(); if (result != I2C_OK) diff --git a/fw/Core/Src/sgp40.c b/fw/Core/Src/sgp40.c index 0edee8b..d5c65d0 100644 --- a/fw/Core/Src/sgp40.c +++ b/fw/Core/Src/sgp40.c @@ -6,6 +6,7 @@ */ #include +#include "main.h" /* for uart_disable_interrupts() */ int8_t sgp40_send_cmd(sgp40_cmd_t cmd) { @@ -15,7 +16,9 @@ int8_t sgp40_send_cmd(sgp40_cmd_t cmd) // start measurement buffer[0] = cmd >> 8; buffer[1] = cmd & 0x00ff; + uart_disable_interrupts(); result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 2); + uart_enable_interrupts(); if (result == I2C_ERROR_TX_INCOMPLETE) { return SGP40_ERROR; } @@ -40,14 +43,18 @@ int8_t sgp40_measure_raw_signal(uint16_t * voc_ticks) buffer[7] = 0x93; /* Returns NACK if CRC is wrong */ + uart_disable_interrupts(); result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8); + uart_enable_interrupts(); if (result != I2C_OK) { return SGP40_ERROR; } LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms + uart_disable_interrupts(); result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3); + uart_enable_interrupts(); if (result != I2C_OK) { return SGP40_ERROR; @@ -81,14 +88,18 @@ int8_t sgp40_measure_raw_signal_compensated(uint16_t * voc_ticks, uint16_t relat buffer[7] = crc8_calculate(buffer+5, 2); /* Returns NACK if CRC is wrong */ + uart_disable_interrupts(); result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8); + uart_enable_interrupts(); if (result != I2C_OK) { return SGP40_ERROR; } LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms + uart_disable_interrupts(); result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3); + uart_enable_interrupts(); if (result != I2C_OK) { return SGP40_ERROR; @@ -115,7 +126,9 @@ int8_t SGP40_execute_self_test ( uint8_t * test_result) LL_mDelay(350); + uart_disable_interrupts(); result = i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 3); + uart_enable_interrupts(); if (result != I2C_OK) { return SGP40_ERROR; } @@ -134,11 +147,15 @@ int8_t SGP40_get_serial_number(uint8_t serial[6]) { uint8_t buffer[16]; + uart_disable_interrupts(); sgp40_send_cmd(SGP40_GET_SERIAL_NUMBER); + uart_enable_interrupts(); LL_mDelay(5); + uart_disable_interrupts(); i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 9); + uart_enable_interrupts(); serial[0] = buffer[0]; serial[1] = buffer[1]; diff --git a/fw/Core/Src/sht4x.c b/fw/Core/Src/sht4x.c index 9033319..2d05774 100644 --- a/fw/Core/Src/sht4x.c +++ b/fw/Core/Src/sht4x.c @@ -23,18 +23,18 @@ int8_t sht4x_measure(int16_t *temperature, uint16_t *relative_humidity) uint8_t buffer[32]; int result; + /* start measurement */ + buffer[0] = SHT4X_START_MEAS_HIGH_PRECISION; /* disable interrupts to prevent modbus/i2c conflict */ uart_disable_interrupts(); - // start measurement - buffer[0] = SHT4X_START_MEAS_HIGH_PRECISION; result = i2c_transmit(SHT4X_I2C_ADDRESS<<1, buffer, 1); + uart_enable_interrupts(); if (result != I2C_OK) { return SHT4X_ERROR; } - uart_enable_interrupts(); LL_mDelay(10); /* 10 ms should be enough */ - uart_disable_interrupts(); /* read out */ + uart_disable_interrupts(); result = i2c_receive(SHT4X_I2C_ADDRESS<<1, buffer, 6); uart_enable_interrupts(); if (result != I2C_OK) { diff --git a/fw/Core/Src/sps30.c b/fw/Core/Src/sps30.c index db4c115..884395d 100644 --- a/fw/Core/Src/sps30.c +++ b/fw/Core/Src/sps30.c @@ -6,6 +6,7 @@ */ #include "sps30.h" +#include "main.h" /* for uart_disable_interrupts() */ int8_t sps30_send_cmd(sps30_cmd_t cmd) { @@ -15,7 +16,9 @@ int8_t sps30_send_cmd(sps30_cmd_t cmd) // start measurement buffer[0] = cmd >> 8; buffer[1] = cmd & 0x00ff; + uart_disable_interrupts(); result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2); + uart_enable_interrupts(); // TODO: Proc to vraci NACK? Vyresit. if (result != I2C_OK) { return SPS30_ERROR; @@ -35,7 +38,9 @@ int8_t sps30_start_measurement( void ) buffer[3] = 0x00; buffer[4] = crc8_calculate(buffer + 2, 2); + uart_disable_interrupts(); result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 5); + uart_enable_interrupts(); if (result != I2C_OK) { return SPS30_ERROR; @@ -57,13 +62,17 @@ int8_t sps30_read_measured_values(sps30_data_t *measured_data) // start measurement buffer[0] = SPS30_READ_MEASURED_VALUES >> 8; buffer[1] = SPS30_READ_MEASURED_VALUES & 0xFF; + uart_disable_interrupts(); result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2); + uart_enable_interrupts(); if (result != I2C_OK) { return SPS30_ERROR; } LL_mDelay(10); // 10 ms should be enough // read out + uart_disable_interrupts(); result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 3 * SPS30_MEASURED_VALUES_COUNT); + uart_enable_interrupts(); if (result != I2C_OK) { return SPS30_ERROR; @@ -125,13 +134,17 @@ int8_t sps30_read_status_register ( void ) // start measurement buffer[0] = SPS30_READ_DEVICE_STATUS_REGISTER >> 8; buffer[1] = SPS30_READ_DEVICE_STATUS_REGISTER & 0x00ff; + uart_disable_interrupts(); result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2); + uart_enable_interrupts(); if (result != I2C_OK) { return SPS30_ERROR; } LL_mDelay(10); // 10 ms should be enough // read out + uart_disable_interrupts(); result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 6); + uart_enable_interrupts(); // TODO return SPS30_OK; @@ -147,7 +160,9 @@ int8_t sps30_read_firmware_version ( uint8_t * fw_ver_hi, uint8_t * fw_ver_lo ) // start measurement i2c_tx_buffer[0] = SPS30_READ_VERSION >> 8; i2c_tx_buffer[1] = SPS30_READ_VERSION & 0x00ff; + uart_disable_interrupts(); result = i2c_transmit(SPS30_I2C_ADDRESS<<1, i2c_tx_buffer, 2); + uart_enable_interrupts(); // TODO: Proc to vraci NACK? Vyresit. /*if (result != I2C_OK) { @@ -157,7 +172,9 @@ int8_t sps30_read_firmware_version ( uint8_t * fw_ver_hi, uint8_t * fw_ver_lo ) LL_mDelay(1); // 10 ms should be enough // read out + uart_disable_interrupts(); result = i2c_receive(SPS30_I2C_ADDRESS<<1, i2c_rx_buffer, 3); + uart_enable_interrupts(); /*if (result != I2C_OK) { return SPS30_ERROR;