Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

One-time IDAC Auto-Calibration in PSoC 4 - KBA229095

One-time IDAC Auto-Calibration in PSoC 4 - KBA229095

50 questions asked 25 likes received 25 sign-ins

Author: AH_96           Version: **

Translation - Japanese: PSoC 4 IDAC のワンタイム オートキャリブレーション - KBA229095- Community Translated (JA)

Is it possible to obtain the IDAC value from autocalibration once while programming and use it during subsequent power-up in PSoC® 4?


Yes, it is possible to obtain the value from autocalibration and use the same value for the application without manually configuring each board. This can be implemented using the bootloader architecture.

Upon power-on reset, the bootloader will run first. The bootloader firmware runs the autocalibration algorithm and the IDAC value, obtained by using the CapSense_GetParam API, can be stored in flash. Once the autocalibration is complete, user can load the bootloadable application. The Bootloadable application then reads the stored data and sets the IDAC value using the CapSense_SetParam API. Both the APIs (CapSense_GetParam and CapSense_SetParam) must be called after CapSense_Start().

If the bootloader project need not bootload the new application, you can configure the communication component to Custom Interface and manually define the following five bootloader functions:

  1. void CyBtldrCommStart(void)
  2. void CyBtldrCommStop(void)
  3. void CyBtldrCommReset(void)
  4. cystatus CyBtldrCommWrite(uint8* buffer, uint16 size, uint16* count, uint8 timeOut)
  5. cystatus CyBtldrCommRead (uint8* buffer, uint16 size, uint16* count, uint8 timeOut)


Figure 1: Bootloader - selecting Communication component

Writing to the bootloadable flash area contents, could, however, result in bootloadable checksum validation failure. Therefore, the IDAC values need to be placed in the memory section called “checksum exclude region”. It is a memory region at the end of the Bootloadable application that is not used in the checksum verification. The size of the checksum exclude section can be set in the Bootloadable component configuration window. It is recommended to configure the size aligned to the flash row boundary. Refer to appropriate device datasheet for flash row size. This allows updating the checksum exclude section without changing the data in the code and data sections.

The IDAC value is an 8-bit value. Therefore, depending on the number of sensors and flash row size, the appropriate checksum exclude area size needs to be set in the bootloadable component configuration as shown in Figure 3.



Figure 3: Bootloadable - specifying checksum exclude

This will add a checksum exclude section in the linker script of the size mentioned in the GUI. While writing the IDAC value in the bootloader project, the data needs to be written in the checksum exclude region allocated in the bootloadable application. The macro, CY_FLASH_NUMBER_ROWS, will return the total number of rows of flash; this needs to be subtracted with the number of rows reserved for checksum exclude+1 (The last row is metadata and should not be modified. Therefore, an extra row of flash must be left).

Data can be written into the flash by using the API CySysFlashWriteRow, which returns CY_SYS_FLASH_SUCCESS if the operation was successful.

Bootloader code snippet:

//define the row for writing the IDAC value. In this case, 2 rows of flash were reserved therefore, data must

//be written in the third row from last

        #define CY_TEST_FLASH_ROW       (CY_FLASH_NUMBER_ROWS - 3u)

        //code for acquiring IDAC value

        uint32 val;


CapSense_1_GetParam(CapSense_1_LINEARSLIDER0_IDAC_MOD0_PARAM_ID, &val);

data[0] = (uint8) val;

CapSense_1_GetParam(CapSense_1_LINEARSLIDER0_SNS0_IDAC_COMP0_PARAM_ID, &val);

data[1] = (uint8)val;

        //Writing data into flash

returnValue = CySysFlashWriteRow(CY_TEST_FLASH_ROW, data);

        if (returnValue != CY_SYS_FLASH_SUCCESS)




        //Run the bootloadable application       


In the bootloadable project, data can be read directly by accessing the flash content using pointers.

        //Absolute address of flash row


        for (i = 0u; i < 2; i++)


source = (*((uint8 *) (CY_TEST_FLASH_ADDR + i)));

/* Check if source and destination values are equal */

data = source;



imodval = data[0];

CapSense_1_SetParam(CapSense_1_LINEARSLIDER0_IDAC_MOD0_PARAM_ID, imodval);

icompval = data[1];

CapSense_1_SetParam(CapSense_1_LINEARSLIDER0_SNS0_IDAC_COMP0_PARAM_ID, icompval);

Related Documents;

Bootloader component data sheet

Introduction to Bootloaders

Bootloader code examples for PSoC® 3/PSoC 4/ PSoC 4BLE/PSoC 5LP