Added more registers and achecks.

This commit is contained in:
David Žaitlík
2022-06-19 12:51:34 +02:00
parent 06ec3f82eb
commit e0e7c8489e
45 changed files with 6561 additions and 6418 deletions

View File

@@ -49,23 +49,17 @@ config_read(&config);
* Device description data can be accessed using direct readout from the memory
* Device configuration data can be accessed using config_t struct.
*/
#define CONFIG_DEFAULT_LED_ON 1
#define CONFIG_DEFAULT_LED_BRIGHTNESS 100
#define CONFIG_DEFAULT_LED_ALERT1_LIMIT 1500
#define CONFIG_DEFAULT_LED_ALERT2_LIMIT 3000
#define CONFIG_DEFAULT_LED_SMOOTH 1
#define CONFIG_DEFAULT_SCD4x_T_OFFSET 0
#define CONFIG_DEFAULT_BAUDRATE_INDEX 0
#define CONFIG_SERIAL_NUMBER_1_LENGTH 2
#define CONFIG_SERIAL_NUMBER_2_LENGTH 2
#define CONFIG_MODBUS_ADDR_LENGTH 2
#define CONFIG_LTR329_GAIN_LENGHT 2
#define CONFIG_LTR329_MODE_LENGTH 2
#define CONFIG_LTR329_INTEG_TIME_LENGTH 2
#define CONFIG_LTR329_MEAS_RATE_LENGTH 2
#define CONFIG_BAUDRATE_INDEX_LENGTH 2
#define CONFIG_LED_ON_LENGTH 2
#define CONFIG_LED_BRIGHTNESS_LENGTH 2
#define CONFIG_LED_SMOOTH_LENGTH 2
#define CONFIG_LED_ALERT1_LENGTH 2
#define CONFIG_LED_ALERT2_LENGTH 2
#define CONFIG_LED_ALERT2_LENGTH 2
#define CONFIG_SCD4x_T_OFFSET_LENGTH 2
#define VENDOR_NAME_LENGTH 64
#define PRODUCT_CODE_LENGTH 64
#define PRODUCT_NAME_LENGTH 64
@@ -77,16 +71,16 @@ config_read(&config);
#define EEPROM_ADDR_START ((uint32_t)0x08080000)
#define EEPROM_ADDR_END ((uint32_t)0x080803FF)
#define CONFIG_EEPROM_ADDR_MODBUS_ADDR EEPROM_ADDR_START
#define CONFIG_EEPROM_ADDR_SERIAL_NUMBER_1 (EEPROM_ADDR_START)
#define CONFIG_EEPROM_ADDR_SERIAL_NUMBER_2 (CONFIG_EEPROM_ADDR_SERIAL_NUMBER_1 + CONFIG_SERIAL_NUMBER_1_LENGTH)
#define CONFIG_EEPROM_ADDR_MODBUS_ADDR (CONFIG_EEPROM_ADDR_SERIAL_NUMBER_2 + CONFIG_SERIAL_NUMBER_2_LENGTH)
#define CONFIG_EEPROM_ADDR_BAUDRATE_INDEX (CONFIG_EEPROM_ADDR_MODBUS_ADDR + CONFIG_MODBUS_ADDR_LENGTH)
#define CONFIG_EEPROM_ADDR_LED_ON (CONFIG_EEPROM_ADDR_BAUDRATE_INDEX + CONFIG_BAUDRATE_INDEX_LENGTH)
#define CONFIG_EEPROM_ADDR_LED_BRIGHTNESS (CONFIG_EEPROM_ADDR_LED_ON + CONFIG_LED_ON_LENGTH)
#define CONFIG_EEPROM_ADDR_LED_SMOOTH (CONFIG_EEPROM_ADDR_LED_BRIGHTNESS + CONFIG_LED_BRIGHTNESS_LENGTH)
#define CONFIG_EEPROM_ADDR_LED_ALERT1 (CONFIG_EEPROM_ADDR_LED_SMOOTH + CONFIG_LED_SMOOTH_LENGTH)
#define CONFIG_EEPROM_ADDR_LED_ALERT2 (CONFIG_EEPROM_ADDR_LED_ALERT1 + CONFIG_LED_ALERT1_LENGTH)
#define CONFIG_EEPROM_ADDR_SCD4x_T_OFFSET (CONFIG_EEPROM_ADDR_LED_ALERT2 + CONFIG_LED_ALERT2_LENGTH)
#define CONFIG_EEPROM_ADDR_LTR329_GAIN (CONFIG_EEPROM_ADDR_BAUDRATE_INDEX + CONFIG_BAUDRATE_INDEX_LENGTH)
#define CONFIG_EEPROM_ADDR_LTR329_MODE (CONFIG_EEPROM_ADDR_LTR329_GAIN + CONFIG_LTR329_GAIN_LENGHT)
#define CONFIG_EEPROM_ADDR_LTR329_INTEG_TIME (CONFIG_EEPROM_ADDR_LTR329_MODE + CONFIG_LTR329_MODE_LENGTH)
#define CONFIG_EEPROM_ADDR_LTR329_MEAS_RATE (CONFIG_EEPROM_ADDR_LTR329_INTEG_TIME + CONFIG_LTR329_INTEG_TIME_LENGTH)
#define CONFIG_EEPROM_ADDR_VENDOR_NAME (CONFIG_EEPROM_ADDR_SCD4x_T_OFFSET + CONFIG_SCD4x_T_OFFSET_LENGTH)
#define CONFIG_EEPROM_ADDR_VENDOR_NAME (CONFIG_EEPROM_ADDR_LTR329_MEAS_RATE + CONFIG_LTR329_MEAS_RATE_LENGTH)
#define CONFIG_EEPROM_ADDR_PRODUCT_CODE (CONFIG_EEPROM_ADDR_VENDOR_NAME + VENDOR_NAME_LENGTH)
#define CONFIG_EEPROM_ADDR_PRODUCT_NAME (CONFIG_EEPROM_ADDR_PRODUCT_CODE + PRODUCT_CODE_LENGTH)
#define CONFIG_EEPROM_ADDR_REVISION (CONFIG_EEPROM_ADDR_PRODUCT_NAME + PRODUCT_NAME_LENGTH)

View File

@@ -53,6 +53,7 @@ extern "C" {
#include "sht4x.h"
#include "ltr329.h"
#include "modbus.h"
#include "crc8.h"
#include "config.h"
/* USER CODE END Includes */

View File

@@ -79,7 +79,8 @@ enum
REGISTER_NUM_RH = 30005, /* %, from SHT4x */
REGISTER_NUM_LIGHT_INTENSITY_0 = 30006, /* ticks, from LTR329 */ /*TODO: Find out what it is */
REGISTER_NUM_LIGHT_INTENSITY_1 = 30007, /* ticks, from LTR329 */ /*TODO: Find out what it is */
/* VOC Index has initial blackout beriod, when the data is not ready. VOC index is 0 during this period */
REGISTER_NUM_ERROR_T_RH = 30008, /* 0 = OK, 1 I2C = ERROR, 2 = CRC ERROR */
REGISTER_NUM_ERROR_LIGHT = 30009 /* 0 = OK, 1 = I2C ERROR */
} data_registers_numbers;
enum
@@ -99,7 +100,7 @@ enum
int16_t T_SHT4x, TF_SHT4x;
uint16_t RH_SHT4x;
uint16_t light_ch0, light_ch1;
uint16_t error_sht, error_ltr;
/* Struct to store the sensor config */
config_t sensor_config;
/* Device ID struct */
@@ -108,7 +109,6 @@ uint8_t sensor_config_pending_write = 0;
uint8_t baudrate_changed = 0;
uint8_t ltr329_config_changed = 0;
uint8_t modbus_address_changed = 0;
uint8_t co2_valid = 0;
/* USER CODE END PV */
@@ -267,8 +267,6 @@ int main(void)
/* Initiualize LTR329 */
int8_t ltr_ret;
uint8_t ltr_cont_reg_val;
uint8_t ltr_rate_reg_val;
do
{
ltr_ret = ltr329_write_settings(LTR329_GAIN_48X, LTR329_MODE_ACTIVE, LTR329_INTEGRATION_100MS, LTR329_MEAS_RATE_100MS);
@@ -285,7 +283,7 @@ int main(void)
sensor_config.ltr329_integ_time = ltr329_int_time;
sensor_config.ltr329_meas_rate = ltr329_meas_rate;
static uint32_t new_baud;
/*static uint32_t new_baud;*/
/* Enter the main loop */
while (1)
{
@@ -329,34 +327,70 @@ int main(void)
{
while (!LL_USART_IsActiveFlag_TXE(USART2));
uart_disable_interrupts();
LL_USART_SetBaudRate(USART2, SYSTICK_FREQ_HZ, LL_USART_OVERSAMPLING_16, config_baudrates[sensor_config.baudrate_index]);
uart_enable_interrupts();
LL_USART_SetBaudRate(USART2, SYSTICK_FREQ_HZ, LL_USART_OVERSAMPLING_16,
config_baudrates[sensor_config.baudrate_index]);
LL_USART_EnableDirectionRx(USART2);
LL_USART_EnableDirectionTx(USART2);
baudrate_changed = 0;
ltr329_config_changed = 0;
uart_enable_interrupts();
new_baud = LL_USART_GetBaudRate(USART2, SYSTICK_FREQ_HZ, LL_USART_OVERSAMPLING_16);
/*new_baud = LL_USART_GetBaudRate(USART2, SYSTICK_FREQ_HZ, LL_USART_OVERSAMPLING_16);*/
}
if(ltr329_config_changed)
{
ltr329_write_settings(sensor_config.ltr329_gain, sensor_config.ltr329_mode, sensor_config.ltr329_integ_time, sensor_config.ltr329_meas_rate);
uart_disable_interrupts();
ltr329_write_settings(sensor_config.ltr329_gain,
sensor_config.ltr329_mode,
sensor_config.ltr329_integ_time,
sensor_config.ltr329_meas_rate);
ltr329_config_changed = 0;
uart_enable_interrupts();
}
/* It is time for measurement */
if (tim21_elapsed_period == 1)
{
/* TODO: Check the data */
/* Read SHT4x data (always connected) */
sht4x_measure(&T_SHT4x, &RH_SHT4x);
int8_t sht_read_ret = sht4x_measure(&T_SHT4x, &RH_SHT4x);
TF_SHT4x = CELSIUS_TO_FAHRENHEIT(T_SHT4x);
if (sht_read_ret == SHT4X_OK)
{
error_sht = 0;
} else
{
/* TODO: Do something */
if (sht_read_ret == SHT4X_ERROR)
{
error_sht = 1;
} else if (sht_read_ret == SHT4X_CRC8_ERROR)
{
error_sht = 2;
}
}
/* Red LTR329 values */
uint8_t data_valid, new_data;
ltr329_gain_t set_gain;
ltr_ret = ltr329_read_status_register(&data_valid, &new_data, &set_gain);
/* TODO: Do something with the flags */
ltr_ret = ltr329_measure(&light_ch0, &light_ch1);
if (ltr_ret == LTR329_OK)
{
if (new_data == 1)
{
ltr_ret = ltr329_measure(&light_ch0, &light_ch1);
if (ltr_ret == LTR329_OK)
{
error_ltr = 0;
} else
{
error_ltr = 1;
}
}
} else
{
error_ltr = 1;
}
/* Reset the TIM21 Elapsed Period Flag */
tim21_elapsed_period = 0;
@@ -705,6 +739,12 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction)
case REGISTER_NUM_LIGHT_INTENSITY_1:
transaction->input_registers[i] = (uint16_t)light_ch1;
break;
case REGISTER_NUM_ERROR_T_RH:
transaction->input_registers[i] = (uint16_t)error_sht;
break;
case REGISTER_NUM_ERROR_LIGHT:
transaction->input_registers[i] = (uint16_t)error_ltr;
break;
default:
return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED;
}
@@ -723,19 +763,15 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction)
break;
case REGISTER_NUM_LTR329_GAIN:
transaction->holding_registers[i] = (uint16_t)(sensor_config.ltr329_gain);
/* TODO : IMPLEMENT */
break;
case REGISTER_NUM_LTR329_INTEGRATION_TIME:
transaction->holding_registers[i] = (uint16_t)(sensor_config.ltr329_integ_time);
/* TODO : IMPLEMENT */
break;
case REGISTER_NUM_LTR329_MEAS_RATE:
transaction->holding_registers[i] = (uint16_t)(sensor_config.ltr329_meas_rate);
/* TODO : IMPLEMENT */
break;
case REGISTER_NUM_LTR329_MODE:
transaction->holding_registers[i] = (uint16_t)(sensor_config.ltr329_mode);
/* TODO : IMPLEMENT */
break;
default:
return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED;