This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Compiler/CC2630: Sensor controller stdio cannot allow to use two i2c

Part Number: CC2630
Other Parts Discussed in Thread: CC2650,

Tool/software: TI C/C++ Compiler

On my device, there are two i2c bus, one i2c (DIO23, DIO24)connects with temperature sensor,  the other i2c (DIO25, DIO26)connects with gsensor. But sensor controller stdio not allow me to create two separated tasks to access temperature sensor and gsensor. The compiler gives the following failures:

Constant already defined: ".define AUXIO_I2C_SCL 6"

Constant already defined: ".define AUXIO_I2C_SDA 7"

Constant already defined: ".define I2C_BASE_DELAY 9"

Constant already defined: ".define I2C_EXT_DELAY 4"

Constant already defined: ".define I2C_STRETCH_TIMEOUT_US 20000"

Constant already defined: ".define I2C_WAIT_STRETCH_DELAY 5"

  • Hi,

    Can you provide more information about your problem? Did you start with one of the example applications? If so, what modifications did you make?
  • The followings is from myDev.scp, you can use sensor controller stdio 1.4.0 to open it, in I/OMapping, you can know i am using two I2C bus, one is for gsensor, the other is rhTemp, but Code Generator cannot allow me to do this. Thanks for your help.

    <?xml version="1.0"?>
    <project name="myDev" version="1.4.0.42970">
    <desc><![CDATA[]]></desc>
    <pattr name="Board">CC2650 SensorTag + Capacitive Touch Skin</pattr>
    <pattr name="Chip name">CC2630</pattr>
    <pattr name="Chip package">QFN48 7x7 RGZ</pattr>
    <pattr name="Chip revision">-</pattr>
    <pattr name="Code prefix"></pattr>
    <pattr name="Operating system">TI-RTOS</pattr>
    <pattr name="Output directory">E:/work/pedometer/scif</pattr>
    <task name="gSensor">
    <desc><![CDATA[]]></desc>
    <tattr name="GSENSOR_ALERT_BUF_FULL" type="hex" content="const" scope="task" min="0000" max="ffff">0001</tattr>
    <tattr name="GSENSOR_ALERT_FREE_FALL" type="hex" content="const" scope="task" min="0000" max="ffff">0002</tattr>
    <tattr name="GSENSOR_BUF_SIZE" type="dec" content="const" scope="task" min="0" max="65535">480</tattr>
    <tattr name="GSENSOR_INT_REL" type="hex" content="const" scope="task" min="0000" max="ffff">001a</tattr>
    <tattr name="GSENSOR_XOUT_L" type="hex" content="const" scope="task" min="0000" max="ffff">0006</tattr>
    <tattr name="I2C_SLAVE_ADDR" type="hex" content="const" scope="task" min="0000" max="ffff">001c</tattr>
    <tattr name="output.lastX" desc="the last gsensor X value" type="dec" content="struct" scope="task" min="-32768" max="32767">0</tattr>
    <tattr name="output.lastY" desc="the last gsensor Y value" type="dec" content="struct" scope="task" min="-32768" max="32767">0</tattr>
    <tattr name="output.lastZ" desc="the last gsensor Z value" type="dec" content="struct" scope="task" min="-32768" max="32767">0</tattr>
    <resource_ref name="ADC" enabled="0"/>
    <resource_ref name="Analog Open-Drain Pins" enabled="0"/>
    <resource_ref name="Analog Open-Source Pins" enabled="0"/>
    <resource_ref name="Analog Pins" enabled="0"/>
    <resource_ref name="COMPA" enabled="0"/>
    <resource_ref name="COMPB" enabled="0"/>
    <resource_ref name="COMPB Event Trigger" enabled="0"/>
    <resource_ref name="Delay Insertion" enabled="1"/>
    <resource_ref name="Differential Output Pins" enabled="0"/>
    <resource_ref name="Digital Input Pins" enabled="0">
    <io_usage name="GSENSOR_IRQ" label="GSensor interrupt">
    <uattr name="Configuration on initialization">1</uattr>
    <uattr name="Configuration on uninitialization">1</uattr>
    <uattr name="Pin count">0</uattr>
    <uattr name="Pin/0000">DIO28</uattr>
    <uattr name="Pin/0001"></uattr>
    <uattr name="Pin/0002"></uattr>
    <uattr name="Pin/0003"></uattr>
    <uattr name="Pin/0004"></uattr>
    <uattr name="Pin/0005"></uattr>
    <uattr name="Pin/0006"></uattr>
    <uattr name="Pin/0007"></uattr>
    <uattr name="Pin/0008"></uattr>
    <uattr name="Pin/0009"></uattr>
    <uattr name="Pin/0010"></uattr>
    <uattr name="Pin/0011"></uattr>
    <uattr name="Pin/0012"></uattr>
    <uattr name="Pin/0013"></uattr>
    <uattr name="Pin/0014"></uattr>
    <uattr name="Pin/0015"></uattr>
    </io_usage>
    </resource_ref>
    <resource_ref name="Digital Open-Drain Pins" enabled="0"/>
    <resource_ref name="Digital Open-Source Pins" enabled="0"/>
    <resource_ref name="Digital Output Pins" enabled="0"/>
    <resource_ref name="GPIO Event Trigger" enabled="0"/>
    <resource_ref name="I2C Master" enabled="1">
    <rattr name="SCL frequency">0</rattr>
    <rattr name="SCL stretch timeout">20000</rattr>
    <io_usage>
    <uattr name="SCL pin/0000">DIO26</uattr>
    <uattr name="SDA pin/0000">DIO25</uattr>
    </io_usage>
    </resource_ref>
    <resource_ref name="ISRC" enabled="0"/>
    <resource_ref name="Math and Logic" enabled="0"/>
    <resource_ref name="Multi-Buffered Output Data Exchange" enabled="0">
    <rattr name="Buffer count">2</rattr>
    <rattr name="Indicate overflow at buffer check">1</rattr>
    <rattr name="Indicate overflow at buffer switch">0</rattr>
    <rattr name="Prevent overflow at buffer switch">1</rattr>
    </resource_ref>
    <resource_ref name="Peripheral Sharing" enabled="0"/>
    <resource_ref name="RTC Multi-Event Capture" enabled="0"/>
    <resource_ref name="RTC-Based Execution Scheduling" enabled="1"/>
    <resource_ref name="SPI Chip Select" enabled="0"/>
    <resource_ref name="SPI Data Transfer" enabled="0">
    <rattr name="Bit rate">0</rattr>
    <rattr name="MISO configuration when inactive">-1</rattr>
    <rattr name="MOSI configuration on initialization">0</rattr>
    <rattr name="MOSI configuration on uninitialization">0</rattr>
    <rattr name="SCLK configuration on initialization">0</rattr>
    <rattr name="SCLK configuration on uninitialization">0</rattr>
    <io_usage>
    <uattr name="MISO pin/0000"></uattr>
    <uattr name="MOSI pin/0000"></uattr>
    <uattr name="SCLK pin/0000"></uattr>
    </io_usage>
    </resource_ref>
    <resource_ref name="System CPU Alert" enabled="1"/>
    <resource_ref name="TDC" enabled="0"/>
    <resource_ref name="Timer 0" enabled="0"/>
    <resource_ref name="Timer Event Trigger" enabled="0"/>
    <resource_ref name="UART Emulator" enabled="0">
    <rattr name="RX buffer size">64</rattr>
    <rattr name="Required idle period before enabling RX">11</rattr>
    <rattr name="TX buffer size">64</rattr>
    <io_usage>
    <uattr name="RX pin/0000"></uattr>
    <uattr name="TX pin/0000"></uattr>
    </io_usage>
    </resource_ref>
    <sccode name="event0"><![CDATA[state.decTick = cfg.stopTick;
    state.moving = 1;

    fwScheduleTask(1);]]></sccode>
    <sccode name="execute"><![CDATA[macro readXYZ(){
    U16 resultRegH;
    U16 resultRegL;

    i2cStart();
    i2cTx(I2C_OP_WRITE | I2C_SLAVE_ADDR);
    i2cTx(GSENSOR_XOUT_L);

    // Read the result
    i2cRepeatedStart();
    i2cTx(I2C_OP_READ | I2C_SLAVE_ADDR);

    i2cRxAck(resultRegL);
    i2cRxAck(resultRegH);
    output.lastX = (resultRegH << 8)|(resultRegL); //x

    i2cRxAck(resultRegL);
    i2cRxAck(resultRegH);
    output.lastY = (resultRegH << 8)|(resultRegL); //y

    i2cRxAck(resultRegL);
    i2cRxNack(resultRegH);
    output.lastZ = (resultRegH << 8)|(resultRegL); //z

    i2cStop();
    }

    readXYZ(); //read gsensor all values]]></sccode>
    <sccode name="initialize"><![CDATA[fwScheduleTask(2);]]></sccode>
    <sccode name="terminate"><![CDATA[]]></sccode>
    <tt_iter></tt_iter>
    <tt_struct></tt_struct>
    </task>
    <task name="rhTemp">
    <desc><![CDATA[]]></desc>
    <tattr name="RHTEMP_CMD_MEA_RH_HOLD" type="hex" content="const" scope="task" min="0000" max="ffff">00e5</tattr>
    <tattr name="RHTEMP_CMD_MEA_TEMP_HOLD" type="hex" content="const" scope="task" min="0000" max="ffff">00e3</tattr>
    <tattr name="RHTEMP_I2C_SLAVE_ADDR" type="hex" content="const" scope="task" min="0000" max="ffff">0080</tattr>
    <tattr name="RHTEMP__CMD_RESET" type="hex" content="const" scope="task" min="0000" max="ffff">00fe</tattr>
    <tattr name="cfg.rhHighThr" type="dec" content="struct" scope="task" min="0" max="65535">65535</tattr>
    <tattr name="cfg.rhLowThr" type="dec" content="struct" scope="task" min="0" max="65535">0</tattr>
    <tattr name="cfg.tempHighThr" type="dec" content="struct" scope="task" min="0" max="65535">65535</tattr>
    <tattr name="cfg.tempLowThr" type="dec" content="struct" scope="task" min="0" max="65535">0</tattr>
    <tattr name="output.rh" type="dec" content="struct" scope="task" min="0" max="65535">0</tattr>
    <tattr name="output.temp" type="dec" content="struct" scope="task" min="0" max="65535">0</tattr>
    <resource_ref name="ADC" enabled="0"/>
    <resource_ref name="Analog Open-Drain Pins" enabled="0"/>
    <resource_ref name="Analog Open-Source Pins" enabled="0"/>
    <resource_ref name="Analog Pins" enabled="0"/>
    <resource_ref name="COMPA" enabled="0"/>
    <resource_ref name="COMPB" enabled="0"/>
    <resource_ref name="COMPB Event Trigger" enabled="0"/>
    <resource_ref name="Delay Insertion" enabled="0"/>
    <resource_ref name="Differential Output Pins" enabled="0"/>
    <resource_ref name="Digital Input Pins" enabled="0"/>
    <resource_ref name="Digital Open-Drain Pins" enabled="0"/>
    <resource_ref name="Digital Open-Source Pins" enabled="0"/>
    <resource_ref name="Digital Output Pins" enabled="0"/>
    <resource_ref name="GPIO Event Trigger" enabled="0"/>
    <resource_ref name="I2C Master" enabled="1">
    <rattr name="SCL frequency">0</rattr>
    <rattr name="SCL stretch timeout">20000</rattr>
    <io_usage>
    <uattr name="SCL pin/0000">DIO24</uattr>
    <uattr name="SDA pin/0000">DIO23</uattr>
    </io_usage>
    </resource_ref>
    <resource_ref name="ISRC" enabled="0"/>
    <resource_ref name="Math and Logic" enabled="0"/>
    <resource_ref name="Multi-Buffered Output Data Exchange" enabled="0">
    <rattr name="Buffer count">2</rattr>
    <rattr name="Indicate overflow at buffer check">1</rattr>
    <rattr name="Indicate overflow at buffer switch">0</rattr>
    <rattr name="Prevent overflow at buffer switch">1</rattr>
    </resource_ref>
    <resource_ref name="Peripheral Sharing" enabled="0"/>
    <resource_ref name="RTC Multi-Event Capture" enabled="0"/>
    <resource_ref name="RTC-Based Execution Scheduling" enabled="1"/>
    <resource_ref name="SPI Chip Select" enabled="0"/>
    <resource_ref name="SPI Data Transfer" enabled="0">
    <rattr name="Bit rate">0</rattr>
    <rattr name="MISO configuration when inactive">-1</rattr>
    <rattr name="MOSI configuration on initialization">0</rattr>
    <rattr name="MOSI configuration on uninitialization">0</rattr>
    <rattr name="SCLK configuration on initialization">0</rattr>
    <rattr name="SCLK configuration on uninitialization">0</rattr>
    <io_usage>
    <uattr name="MISO pin/0000"></uattr>
    <uattr name="MOSI pin/0000"></uattr>
    <uattr name="SCLK pin/0000"></uattr>
    </io_usage>
    </resource_ref>
    <resource_ref name="System CPU Alert" enabled="1"/>
    <resource_ref name="TDC" enabled="0"/>
    <resource_ref name="Timer 0" enabled="0"/>
    <resource_ref name="Timer Event Trigger" enabled="0"/>
    <resource_ref name="UART Emulator" enabled="0">
    <rattr name="RX buffer size">64</rattr>
    <rattr name="Required idle period before enabling RX">11</rattr>
    <rattr name="TX buffer size">64</rattr>
    <io_usage>
    <uattr name="RX pin/0000"></uattr>
    <uattr name="TX pin/0000"></uattr>
    </io_usage>
    </resource_ref>
    <sccode name="event0"><![CDATA[]]></sccode>
    <sccode name="execute"><![CDATA[// Select the result register
    U16 resultRegH;
    U16 resultRegL;

    i2cStart();
    i2cTx(I2C_OP_WRITE | RHTEMP_I2C_SLAVE_ADDR);
    i2cTx(RHTEMP_CMD_MEA_RH_HOLD);

    // Read the result
    i2cRepeatedStart();
    i2cTx(I2C_OP_READ | RHTEMP_I2C_SLAVE_ADDR);
    i2cRxAck(resultRegH);
    i2cRxNack(resultRegL);
    i2cStop();
    output.rh = (resultRegH << 8)|(resultRegL);


    fwScheduleTask(1);]]></sccode>
    <sccode name="initialize"><![CDATA[fwScheduleTask(1);]]></sccode>
    <sccode name="terminate"><![CDATA[]]></sccode>
    <tt_iter></tt_iter>
    <tt_struct></tt_struct>
    </task>
    </project>

  • Hello Wit,
    The Sensor Controller uses bit-banging to implement I2C, since there is no hardware support for this. In order to get as close to 400 kHz as possible (30 CPU instructions per bit), the pin mapping must be hardcoded so that the most efficient CPU instructions can be used.

    The best solution I can think of is to duplicate the I2C resource definition and all associated procedure definitions and assembly files, and in the duplicate rename all occurrences of "I2C" to something else. Duplicate all I2C resources/procedures in these folders and also edit the new files to make sure everything is referencing your new name.

    C:\Program Files (x86)\Texas Instruments\Sensor Controller Studio\resource_defs\
    C:\Program Files (x86)\Texas Instruments\Sensor Controller Studio\proc_defs\
  • Hi Eirik,

        Totally understood, thanks a lot!