Hey,
I am trying to read the value from ZMOD4410 sensor using 2nd gen AI algorithm provided by Renesas in FSP 5.1.0. I am using Renesas EK-RA2E1 development kit.I used the API to configure and read the sensor data provided by Developer assistance in E2-Studio.Here I am attaching my code snippet please help me to figure out why sensor sterilization getting failed.
#include "common_utils.h" FSP_CPP_HEADER void R_BSP_WarmStart(bsp_warm_start_event_t event); FSP_CPP_FOOTER ///* TODO: Enable if you want to open I2C Communications Device */ //#define G_COMMS_I2C_DEVICE0_NON_BLOCKING (1) // //#if G_COMMS_I2C_DEVICE0_NON_BLOCKING //volatile bool g_i2c_completed = false; //#endif // ///* TODO: Enable if you want to use a callback */ //#define G_COMMS_I2C_DEVICE0_CALLBACK_ENABLE (1) //#if G_COMMS_I2C_DEVICE0_CALLBACK_ENABLE //void rm_zmod4xxx_comms_i2c_callback(rm_comms_callback_args_t * p_args) //{ //#if G_COMMS_I2C_DEVICE0_NON_BLOCKING // if (RM_COMMS_EVENT_OPERATION_COMPLETE == p_args->event) // { // g_i2c_completed = true; // } //#else // FSP_PARAMETER_NOT_USED(p_args); //#endif //} //#endif /* Quick setup for g_comms_i2c_device0. * - g_comms_i2c_bus0 must be setup before calling this function * (See Developer Assistance -> g_comms_i2c_device0 -> g_comms_i2c_bus0 -> Quick Setup). */ void g_comms_i2c_device0_quick_setup(void); /* Quick setup for g_comms_i2c_device0. */ void g_comms_i2c_device0_quick_setup(void) { fsp_err_t err; /* Open I2C Communications device instance, this must be done before calling any COMMS_I2C API */ err = g_comms_i2c_device0.p_api->open(g_comms_i2c_device0.p_ctrl, g_comms_i2c_device0.p_cfg); assert(FSP_SUCCESS == err); #if G_COMMS_I2C_DEVICE0_NON_BLOCKING while (!g_i2c_completed) { ; } #endif } /* TODO: Enable if you want to open I2C bus */ void g_comms_i2c_bus0_quick_setup(void); /* Quick setup for g_comms_i2c_bus0. */ void g_comms_i2c_bus0_quick_setup(void) { fsp_err_t err; i2c_master_instance_t * p_driver_instance = (i2c_master_instance_t *) g_comms_i2c_bus0_extended_cfg.p_driver_instance; /* Open I2C driver, this must be done before calling any COMMS API */ err = p_driver_instance->p_api->open(p_driver_instance->p_ctrl, p_driver_instance->p_cfg); assert(FSP_SUCCESS == err); #if BSP_CFG_RTOS /* Create a semaphore for blocking if a semaphore is not NULL */ if (NULL != g_comms_i2c_bus0_extended_cfg.p_blocking_semaphore) { #if BSP_CFG_RTOS == 1 // AzureOS tx_semaphore_create(g_comms_i2c_bus0_extended_cfg.p_blocking_semaphore->p_semaphore_handle, g_comms_i2c_bus0_extended_cfg.p_blocking_semaphore->p_semaphore_name, (ULONG) 0); #elif BSP_CFG_RTOS == 2 // FreeRTOS *(g_comms_i2c_bus0_extended_cfg.p_blocking_semaphore->p_semaphore_handle) = xSemaphoreCreateCountingStatic((UBaseType_t) 1, (UBaseType_t) 0, g_comms_i2c_bus0_extended_cfg.p_blocking_semaphore->p_semaphore_memory); #endif } /* Create a recursive mutex for bus lock if a recursive mutex is not NULL */ if (NULL != g_comms_i2c_bus0_extended_cfg.p_bus_recursive_mutex) { #if BSP_CFG_RTOS == 1 // AzureOS tx_mutex_create(g_comms_i2c_bus0_extended_cfg.p_bus_recursive_mutex->p_mutex_handle, g_comms_i2c_bus0_extended_cfg.p_bus_recursive_mutex->p_mutex_name, TX_INHERIT); #elif BSP_CFG_RTOS == 2 // FreeRTOS *(g_comms_i2c_bus0_extended_cfg.p_bus_recursive_mutex->p_mutex_handle) = xSemaphoreCreateRecursiveMutexStatic(g_comms_i2c_bus0_extended_cfg.p_bus_recursive_mutex->p_mutex_memory); #endif } #endif } /* TODO: Enable if you want to open ZMOD4XXX */ #define G_ZMOD4XXX_SENSOR0_NON_BLOCKING (1) #define G_ZMOD4XXX_SENSOR0_IRQ_ENABLE (1) #if G_ZMOD4XXX_SENSOR0_NON_BLOCKING volatile bool g_zmod4xxx_i2c_completed = false; volatile rm_zmod4xxx_event_t g_zmod4xxx_i2c_callback_event; #endif #if G_ZMOD4XXX_SENSOR0_IRQ_ENABLE volatile bool g_zmod4xxx_irq_completed = false; #endif /* TODO: Enable if you want to use a I2C callback */ #define G_ZMOD4XXX_SENSOR0_I2C_CALLBACK_ENABLE (1) #if G_ZMOD4XXX_SENSOR0_I2C_CALLBACK_ENABLE void zmod4xxx_comms_i2c_callback(rm_zmod4xxx_callback_args_t * p_args) { #if G_ZMOD4XXX_SENSOR0_NON_BLOCKING g_zmod4xxx_i2c_callback_event = p_args->event; if (RM_ZMOD4XXX_EVENT_ERROR != p_args->event) { g_zmod4xxx_i2c_completed = true; } #else FSP_PARAMETER_NOT_USED(p_args); #endif } #endif /* TODO: Enable if you want to use a IRQ callback */ #define G_ZMOD4XXX_SENSOR0_IRQ_CALLBACK_ENABLE (1) #if G_ZMOD4XXX_SENSOR0_IRQ_CALLBACK_ENABLE void zmod4xxx_irq_callback(rm_zmod4xxx_callback_args_t * p_args) { #if G_ZMOD4XXX_SENSOR0_IRQ_ENABLE if (RM_ZMOD4XXX_EVENT_MEASUREMENT_COMPLETE == p_args->event) { g_zmod4xxx_irq_completed = true; } #else FSP_PARAMETER_NOT_USED(p_args); #endif } #endif /* Quick setup for g_zmod4xxx_sensor0. * - g_comms_i2c_bus0 must be setup before calling this function * (See Developer Assistance -> g_zmod4xxx_sensor0 -> ZMOD4xxx ***** on rm_zmod4xxx -> g_comms_i2c_device0 -> g_comms_i2c_bus0 -> Quick Setup). */ void g_zmod4xxx_sensor0_quick_setup(void); /* Quick setup for g_zmod4xxx_sensor0. */ void g_zmod4xxx_sensor0_quick_setup(void) { fsp_err_t err; /* Open ZMOD4XXX sensor instance, this must be done before calling any ZMOD4XXX API */ err = g_zmod4xxx_sensor0.p_api->open(g_zmod4xxx_sensor0.p_ctrl, g_zmod4xxx_sensor0.p_cfg); assert(FSP_SUCCESS == err); } /* Quick getting IAQ 2nd Gen. values for g_zmod4xxx_sensor0. * - g_zmod4xxx_sensor0 must be setup before calling this function. */ void g_zmod4xxx_sensor0_quick_getting_iaq_2nd_gen_data(rm_zmod4xxx_iaq_2nd_data_t * p_gas_data); /* Quick getting gas data for g_zmod4xxx_sensor0. */ void g_zmod4xxx_sensor0_quick_getting_iaq_2nd_gen_data(rm_zmod4xxx_iaq_2nd_data_t * p_gas_data) { fsp_err_t err; rm_zmod4xxx_raw_data_t zmod4xxx_raw_data; bool in_stabilization = false; /* Clear callback flags */ #if G_ZMOD4XXX_SENSOR0_IRQ_ENABLE g_zmod4xxx_irq_completed = false; #endif #if G_ZMOD4XXX_SENSOR0_NON_BLOCKING g_zmod4xxx_i2c_completed = false; #endif do { /* Start the measurement */ err = g_zmod4xxx_sensor0.p_api->measurementStart(g_zmod4xxx_sensor0.p_ctrl); APP_PRINT("Started measurement.....\n\n"); assert(FSP_SUCCESS == err); #if G_ZMOD4XXX_SENSOR0_NON_BLOCKING while (!g_zmod4xxx_i2c_completed) { ; } APP_PRINT("Finished measurement.....\n"); g_zmod4xxx_i2c_completed = false; #endif do { /* Wait for the measurement to complete */ #if G_ZMOD4XXX_SENSOR0_IRQ_ENABLE while (!g_zmod4xxx_irq_completed) { ; } g_zmod4xxx_irq_completed = false; #else err = g_zmod4xxx_sensor0.p_api->statusCheck(g_zmod4xxx_sensor0.p_ctrl); assert(FSP_SUCCESS == err); #if G_ZMOD4XXX_SENSOR0_NON_BLOCKING while (!g_zmod4xxx_i2c_completed) { ; } g_zmod4xxx_i2c_completed = false; #endif #endif /* Check if a device error occurs */ err = g_zmod4xxx_sensor0.p_api->deviceErrorCheck(g_zmod4xxx_sensor0.p_ctrl); APP_PRINT("Sterted device error check.....\n"); assert(FSP_SUCCESS == err); #if G_ZMOD4XXX_SENSOR0_NON_BLOCKING while (!g_zmod4xxx_i2c_completed) { ; } APP_PRINT("finished device error check.....\n"); g_zmod4xxx_i2c_completed = false; if ((RM_ZMOD4XXX_EVENT_DEV_ERR_POWER_ON_RESET == g_zmod4xxx_i2c_callback_event) || (RM_ZMOD4XXX_EVENT_DEV_ERR_ACCESS_CONFLICT == g_zmod4xxx_i2c_callback_event)) { /* Error during read of sensor status. Please reset device. */ while (1) { ; } } #endif /* Read ADC data from ZMOD4xxx sensor */ err = g_zmod4xxx_sensor0.p_api->read(g_zmod4xxx_sensor0.p_ctrl, &zmod4xxx_raw_data); APP_PRINT("Reading raw data.....\n"); if (err == FSP_ERR_SENSOR_MEASUREMENT_NOT_FINISHED) { R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS); } APP_PRINT("finished reading raw data.....\n\n"); } while (err == FSP_ERR_SENSOR_MEASUREMENT_NOT_FINISHED); assert(FSP_SUCCESS == err); #if G_ZMOD4XXX_SENSOR0_NON_BLOCKING while (!g_zmod4xxx_i2c_completed) { ; } g_zmod4xxx_i2c_completed = false; #endif /* Calculate IAQ 2nd Gen. values from ZMOD4xxx ADC data */ err = g_zmod4xxx_sensor0.p_api->iaq2ndGenDataCalculate(g_zmod4xxx_sensor0.p_ctrl, &zmod4xxx_raw_data, p_gas_data); APP_PRINT("Oho started AI 2nd gen algo.....\n"); if (err == FSP_SUCCESS) { in_stabilization = false; APP_PRINT("Stablised sensor .....\n"); } else if(err == FSP_ERR_SENSOR_IN_STABILIZATION) { in_stabilization = true; APP_PRINT("Failed in Stablised sensor.....\n"); } else { assert(false); APP_PRINT("Unknown error in 2nd gen.....\n"); } /* Delay required time. See Table 3 in the ZMOD4410 Programming Manual. */ R_BSP_SoftwareDelay(1990, BSP_DELAY_UNITS_MILLISECONDS); } while (true == in_stabilization); } volatile rm_zmod4xxx_iaq_2nd_data_t iaq_2nd_gen_data; /*******************************************************************************************************************//** * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function * is called by main() when no RTOS is used. **********************************************************************************************************************/ void hal_entry(void) { /* TODO: add your own code here */ // R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_LOW); R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); g_comms_i2c_bus0_quick_setup(); g_zmod4xxx_sensor0_quick_setup(); R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS); while(1) { g_zmod4xxx_sensor0_quick_getting_iaq_2nd_gen_data((rm_zmod4xxx_iaq_2nd_data_t*)& iaq_2nd_gen_data); //R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } /*******************************************************************************************************************//** * This function is called at various points during the startup process. This implementation uses the event that is * called right before main() to set up the pins. * * @param[in] event Where at in the start up process the code is currently at **********************************************************************************************************************/ void R_BSP_WarmStart(bsp_warm_start_event_t event) { if (BSP_WARM_START_RESET == event) { #if BSP_FEATURE_FLASH_LP_VERSION != 0 /* Enable reading from data flash. */ R_FACI_LP->DFLCTL = 1U; /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */ #endif } if (BSP_WARM_START_POST_C == event) { /* C runtime environment and system clocks are setup. */ /* Configure pins. */ R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); } } #if BSP_TZ_SECURE_BUILD BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable (); /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */ BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable () { } #endif
err = g_zmod4xxx_sensor0.p_api->iaq2ndGenDataCalculate(g_zmod4xxx_sensor0.p_ctrl, &zmod4xxx_raw_data, p_gas_data);
this API returning the error "FSP_ERR_SENSOR_IN_STABILIZATION" even after long time of running sensor.I have also checked the schematic and wiring that seems ok. Also tried to change the sensor few times.Please let me where is the issue
Hello, i suppose there is small error in line no 212 change #else to #endif and comment line no 222