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;
|
return SCD4X_ERROR;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
// disable interrupts to prevent MODBUS/I2C conflict
|
|
||||||
uart_disable_interrupts();
|
|
||||||
// start measurement
|
// start measurement
|
||||||
buffer[0] = SCD4X_READ_MEASUREMENT >> 8;
|
buffer[0] = SCD4X_READ_MEASUREMENT >> 8;
|
||||||
buffer[1] = SCD4X_READ_MEASUREMENT & 0x00ff;
|
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);
|
result = i2c_transmit(SCD4X_I2C_ADDRESS<<1, buffer, 2);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SCD4X_ERROR;
|
return SCD4X_ERROR;
|
||||||
}
|
}
|
||||||
uart_enable_interrupts();
|
|
||||||
LL_mDelay(1); // 10 ms should be enough
|
LL_mDelay(1); // 10 ms should be enough
|
||||||
uart_disable_interrupts();
|
|
||||||
// read out
|
// read out
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SCD4X_I2C_ADDRESS<<1, buffer, 9);
|
result = i2c_receive(SCD4X_I2C_ADDRESS<<1, buffer, 9);
|
||||||
uart_enable_interrupts();
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK)
|
if (result != I2C_OK)
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sgp40.h>
|
#include <sgp40.h>
|
||||||
|
#include "main.h" /* for uart_disable_interrupts() */
|
||||||
|
|
||||||
int8_t sgp40_send_cmd(sgp40_cmd_t cmd)
|
int8_t sgp40_send_cmd(sgp40_cmd_t cmd)
|
||||||
{
|
{
|
||||||
@ -15,7 +16,9 @@ int8_t sgp40_send_cmd(sgp40_cmd_t cmd)
|
|||||||
// start measurement
|
// start measurement
|
||||||
buffer[0] = cmd >> 8;
|
buffer[0] = cmd >> 8;
|
||||||
buffer[1] = cmd & 0x00ff;
|
buffer[1] = cmd & 0x00ff;
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 2);
|
result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 2);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result == I2C_ERROR_TX_INCOMPLETE) {
|
if (result == I2C_ERROR_TX_INCOMPLETE) {
|
||||||
return SGP40_ERROR;
|
return SGP40_ERROR;
|
||||||
}
|
}
|
||||||
@ -40,14 +43,18 @@ int8_t sgp40_measure_raw_signal(uint16_t * voc_ticks)
|
|||||||
buffer[7] = 0x93;
|
buffer[7] = 0x93;
|
||||||
|
|
||||||
/* Returns NACK if CRC is wrong */
|
/* Returns NACK if CRC is wrong */
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8);
|
result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SGP40_ERROR;
|
return SGP40_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms
|
LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms
|
||||||
|
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3);
|
result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK)
|
if (result != I2C_OK)
|
||||||
{
|
{
|
||||||
return SGP40_ERROR;
|
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);
|
buffer[7] = crc8_calculate(buffer+5, 2);
|
||||||
|
|
||||||
/* Returns NACK if CRC is wrong */
|
/* Returns NACK if CRC is wrong */
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8);
|
result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SGP40_ERROR;
|
return SGP40_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms
|
LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms
|
||||||
|
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3);
|
result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK)
|
if (result != I2C_OK)
|
||||||
{
|
{
|
||||||
return SGP40_ERROR;
|
return SGP40_ERROR;
|
||||||
@ -115,7 +126,9 @@ int8_t SGP40_execute_self_test ( uint8_t * test_result)
|
|||||||
|
|
||||||
LL_mDelay(350);
|
LL_mDelay(350);
|
||||||
|
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 3);
|
result = i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 3);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SGP40_ERROR;
|
return SGP40_ERROR;
|
||||||
}
|
}
|
||||||
@ -134,11 +147,15 @@ int8_t SGP40_get_serial_number(uint8_t serial[6])
|
|||||||
{
|
{
|
||||||
uint8_t buffer[16];
|
uint8_t buffer[16];
|
||||||
|
|
||||||
|
uart_disable_interrupts();
|
||||||
sgp40_send_cmd(SGP40_GET_SERIAL_NUMBER);
|
sgp40_send_cmd(SGP40_GET_SERIAL_NUMBER);
|
||||||
|
uart_enable_interrupts();
|
||||||
|
|
||||||
LL_mDelay(5);
|
LL_mDelay(5);
|
||||||
|
|
||||||
|
uart_disable_interrupts();
|
||||||
i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 9);
|
i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 9);
|
||||||
|
uart_enable_interrupts();
|
||||||
|
|
||||||
serial[0] = buffer[0];
|
serial[0] = buffer[0];
|
||||||
serial[1] = buffer[1];
|
serial[1] = buffer[1];
|
||||||
|
@ -23,18 +23,18 @@ int8_t sht4x_measure(int16_t *temperature, uint16_t *relative_humidity)
|
|||||||
uint8_t buffer[32];
|
uint8_t buffer[32];
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
/* start measurement */
|
||||||
|
buffer[0] = SHT4X_START_MEAS_HIGH_PRECISION;
|
||||||
/* disable interrupts to prevent modbus/i2c conflict */
|
/* disable interrupts to prevent modbus/i2c conflict */
|
||||||
uart_disable_interrupts();
|
uart_disable_interrupts();
|
||||||
// start measurement
|
|
||||||
buffer[0] = SHT4X_START_MEAS_HIGH_PRECISION;
|
|
||||||
result = i2c_transmit(SHT4X_I2C_ADDRESS<<1, buffer, 1);
|
result = i2c_transmit(SHT4X_I2C_ADDRESS<<1, buffer, 1);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SHT4X_ERROR;
|
return SHT4X_ERROR;
|
||||||
}
|
}
|
||||||
uart_enable_interrupts();
|
|
||||||
LL_mDelay(10); /* 10 ms should be enough */
|
LL_mDelay(10); /* 10 ms should be enough */
|
||||||
uart_disable_interrupts();
|
|
||||||
/* read out */
|
/* read out */
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SHT4X_I2C_ADDRESS<<1, buffer, 6);
|
result = i2c_receive(SHT4X_I2C_ADDRESS<<1, buffer, 6);
|
||||||
uart_enable_interrupts();
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sps30.h"
|
#include "sps30.h"
|
||||||
|
#include "main.h" /* for uart_disable_interrupts() */
|
||||||
|
|
||||||
int8_t sps30_send_cmd(sps30_cmd_t cmd)
|
int8_t sps30_send_cmd(sps30_cmd_t cmd)
|
||||||
{
|
{
|
||||||
@ -15,7 +16,9 @@ int8_t sps30_send_cmd(sps30_cmd_t cmd)
|
|||||||
// start measurement
|
// start measurement
|
||||||
buffer[0] = cmd >> 8;
|
buffer[0] = cmd >> 8;
|
||||||
buffer[1] = cmd & 0x00ff;
|
buffer[1] = cmd & 0x00ff;
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
|
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
|
||||||
|
uart_enable_interrupts();
|
||||||
// TODO: Proc to vraci NACK? Vyresit.
|
// TODO: Proc to vraci NACK? Vyresit.
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SPS30_ERROR;
|
return SPS30_ERROR;
|
||||||
@ -35,7 +38,9 @@ int8_t sps30_start_measurement( void )
|
|||||||
buffer[3] = 0x00;
|
buffer[3] = 0x00;
|
||||||
buffer[4] = crc8_calculate(buffer + 2, 2);
|
buffer[4] = crc8_calculate(buffer + 2, 2);
|
||||||
|
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 5);
|
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 5);
|
||||||
|
uart_enable_interrupts();
|
||||||
|
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SPS30_ERROR;
|
return SPS30_ERROR;
|
||||||
@ -57,13 +62,17 @@ int8_t sps30_read_measured_values(sps30_data_t *measured_data)
|
|||||||
// start measurement
|
// start measurement
|
||||||
buffer[0] = SPS30_READ_MEASURED_VALUES >> 8;
|
buffer[0] = SPS30_READ_MEASURED_VALUES >> 8;
|
||||||
buffer[1] = SPS30_READ_MEASURED_VALUES & 0xFF;
|
buffer[1] = SPS30_READ_MEASURED_VALUES & 0xFF;
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
|
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SPS30_ERROR;
|
return SPS30_ERROR;
|
||||||
}
|
}
|
||||||
LL_mDelay(10); // 10 ms should be enough
|
LL_mDelay(10); // 10 ms should be enough
|
||||||
// read out
|
// read out
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 3 * SPS30_MEASURED_VALUES_COUNT);
|
result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 3 * SPS30_MEASURED_VALUES_COUNT);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK)
|
if (result != I2C_OK)
|
||||||
{
|
{
|
||||||
return SPS30_ERROR;
|
return SPS30_ERROR;
|
||||||
@ -125,13 +134,17 @@ int8_t sps30_read_status_register ( void )
|
|||||||
// start measurement
|
// start measurement
|
||||||
buffer[0] = SPS30_READ_DEVICE_STATUS_REGISTER >> 8;
|
buffer[0] = SPS30_READ_DEVICE_STATUS_REGISTER >> 8;
|
||||||
buffer[1] = SPS30_READ_DEVICE_STATUS_REGISTER & 0x00ff;
|
buffer[1] = SPS30_READ_DEVICE_STATUS_REGISTER & 0x00ff;
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
|
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
|
||||||
|
uart_enable_interrupts();
|
||||||
if (result != I2C_OK) {
|
if (result != I2C_OK) {
|
||||||
return SPS30_ERROR;
|
return SPS30_ERROR;
|
||||||
}
|
}
|
||||||
LL_mDelay(10); // 10 ms should be enough
|
LL_mDelay(10); // 10 ms should be enough
|
||||||
// read out
|
// read out
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 6);
|
result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 6);
|
||||||
|
uart_enable_interrupts();
|
||||||
// TODO
|
// TODO
|
||||||
|
|
||||||
return SPS30_OK;
|
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
|
// start measurement
|
||||||
i2c_tx_buffer[0] = SPS30_READ_VERSION >> 8;
|
i2c_tx_buffer[0] = SPS30_READ_VERSION >> 8;
|
||||||
i2c_tx_buffer[1] = SPS30_READ_VERSION & 0x00ff;
|
i2c_tx_buffer[1] = SPS30_READ_VERSION & 0x00ff;
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, i2c_tx_buffer, 2);
|
result = i2c_transmit(SPS30_I2C_ADDRESS<<1, i2c_tx_buffer, 2);
|
||||||
|
uart_enable_interrupts();
|
||||||
|
|
||||||
// TODO: Proc to vraci NACK? Vyresit.
|
// TODO: Proc to vraci NACK? Vyresit.
|
||||||
/*if (result != I2C_OK) {
|
/*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
|
LL_mDelay(1); // 10 ms should be enough
|
||||||
// read out
|
// read out
|
||||||
|
uart_disable_interrupts();
|
||||||
result = i2c_receive(SPS30_I2C_ADDRESS<<1, i2c_rx_buffer, 3);
|
result = i2c_receive(SPS30_I2C_ADDRESS<<1, i2c_rx_buffer, 3);
|
||||||
|
uart_enable_interrupts();
|
||||||
/*if (result != I2C_OK)
|
/*if (result != I2C_OK)
|
||||||
{
|
{
|
||||||
return SPS30_ERROR;
|
return SPS30_ERROR;
|
||||||
|
Loading…
Reference in New Issue
Block a user