Fixed the errors with UART unlocking in i2c functions.
This commit is contained in:
parent
4c6609fed6
commit
de85f9771a
@ -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)
|
||||
|
@ -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];
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user