Fixed the errors with UART unlocking in i2c functions.

This commit is contained in:
David Žaitlík 2022-05-23 21:37:51 +02:00
parent 4c6609fed6
commit de85f9771a
4 changed files with 42 additions and 8 deletions

View File

@ -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)

View File

@ -6,6 +6,7 @@
*/
#include <sgp40.h>
#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];

View File

@ -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) {

View File

@ -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;