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.

I2C multiple device problem with f28335



Hello,

i'm working with IMU 9dof  http://www.sparkfun.com/products/10321 which contain accelerometor,gyro and magnetometer.Each device also have slave address.I done with the data from each devide with but i can't combine three devices in one code.Please tell me how can comunicate with this IMU.Here is my code

  /*
 * File: combine_3.c
 *
 * Real-Time Workshop code generated for Simulink model combine_3.
 *
 * Model version                        : 1.2
 * Real-Time Workshop file version      : 7.4  (R2009b)  29-Jun-2009
 * Real-Time Workshop file generated on : Sun Apr 10 15:07:11 2011
 * TLC version                          : 7.4 (Jul 14 2009)
 * C/C++ source code generated on       : Sun Apr 10 15:07:12 2011
 *
 * Target selection: ccslink_ert.tlc
 * Embedded hardware selection: Texas Instruments->C2000
 * Code generation objectives: Unspecified
 * Validation result: Not run
 */

#include "combine_3.h"
#include "combine_3_private.h"

/* user code (top of source file) */
/* System '<Root>' */
int counter;

/* Exported block signals */
real_T fgyro[3];                       /* '<Root>/Magnetic sensor' */
real_T facc[3];                        /* '<Root>/Magnetic sensor1' */
real_T fmag[3];                        /* '<Root>/Magnetic sensor2' */
uint8_T Rcv;                           /* '<Root>/SCI Receive' */

/* Block signals (auto storage) */
BlockIO_combine_3 combine_3_B;

/* Real-time model */
RT_MODEL_combine_3 combine_3_M_;
RT_MODEL_combine_3 *combine_3_M = &combine_3_M_;

/* Model step function */
void combine_3_step(void)
{
  /* local block i/o variables */
  uint8_T rtb_TmpSignalConversionAtSCITra[56];

  {
    int16_T i;
    real_T tmp;

    {
      /* user code (Output function Header) */
      /* System '<Root>' */
      int16 gyro[3], acc[3],mag[3], dummy, i, j, k;

      /////////////////////////////doc gyro
      if (counter==0) {
        /////////////////////////////////////////doc cam bien gyro/////////////////////////////////////
       
       I2caRegs.I2CSAR = 0x68;        // Set slave address
   I2caRegs.I2CMDR.all = 0x64A0;
        I2caRegs.I2CDXR = 0x1D;
        gyro[0] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        gyro[0] |= I2caRegs.I2CDRR;
        gyro[1] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        gyro[1] |= I2caRegs.I2CDRR;
        gyro[2] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        gyro[2] |= I2caRegs.I2CDRR;
       
        for (i=0; i<3; i++) {
          if (gyro[i] >= 0x2000)
            fgyro[i] = (float)(gyro[i] - 0x3FFF) * 0.07326;
          else
            fgyro[i] = (float)gyro[i] * 0.07326;
        }

    

        ///////////////////////////////////////////doc cam bien acc/////////////////////////////
            
        I2caRegs.I2CSAR = 0x53;
        I2caRegs.I2CMDR.all = 0x64A0;
        I2caRegs.I2CDXR = 0x03;
        acc[0] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        acc[0] |= I2caRegs.I2CDRR;
        acc[1] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        acc[1] |= I2caRegs.I2CDRR;
        acc[2] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        acc[2] |= I2caRegs.I2CDRR;
    
       for (i=0; i<3; i++) {
          if (acc[i] >= 0x2000)
            facc[i] = (float)(acc[i] - 0x3FFF) * 0.07326;
          else
            facc[i] = (float)acc[i] * 0.07326;
        } 

      
   ////////////////////////////////////mag

      I2caRegs.I2CSAR = 0x1E;
   I2caRegs.I2CMDR.all = 0x64A0;
   I2caRegs.I2CDXR = 0x32;
   
     mag[0] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        mag[0] |= I2caRegs.I2CDRR;
        mag[1] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        mag[1] |= I2caRegs.I2CDRR;
        mag[2] = (I2caRegs.I2CDRR <<8) & 0xFF00;
        mag[2] |= I2caRegs.I2CDRR;
     
     for (i=0; i<3; i++) {
          if (mag[i] >= 0x2000)
            fmag[i] = (float)(mag[i] - 0x3FFF) * 0.07326;
          else
            fmag[i] = (float)mag[i] * 0.07326;
        }
   
      } else if (counter==3)           // read data via I2C
      {
        //I2caRegs.I2CCNT = 6;
        // I2caRegs.I2CMDR.all = 0x6C20;
        I2caRegs.I2CSAR = 0x68;  
        I2caRegs.I2CMDR.all = 0x64A0;
  I2caRegs.I2CDXR = 0x1d;
       
        I2caRegs.I2CSAR = 0x53;  
        I2caRegs.I2CMDR.all = 0x64A0;
  I2caRegs.I2CDXR = 0x32;

     I2caRegs.I2CSAR = 0x1E; 
     I2caRegs.I2CMDR.all = 0x64A0;
     I2caRegs.I2CDXR = 0x03;
      }

      counter++;
      if (counter==4)
        counter = 0;

      /* S-Function Block: <Root>/SCI Receive (c28xsci_rx) */
      {
        int i;
        char recbuff[1];
        int errFlg = NOERROR;
        for (i = 0; i < 1; i++)
          recbuff[i] = 0;

        /* Receiving data */
        errFlg = scib_rcv(recbuff, 1, LONGLOOP);
        if (errFlg != NOERROR)
          goto RXERRB;
        memcpy( &Rcv, recbuff, 1);
       RXERRB:
        asm(" NOP");
      }

      /* DataTypeConversion: '<S3>/Data Type Conversion' incorporates:
       *  Inport: '<Root>/Magnetic sensor'
       */
      if (rtIsNaN(fgyro[0]) || rtIsInf(fgyro[0])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(fgyro[0]), 65536.0);
      }

      combine_3_B.DataTypeConversion[0] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
        : (int16_T)(uint16_T)tmp;
      if (rtIsNaN(fgyro[1]) || rtIsInf(fgyro[1])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(fgyro[1]), 65536.0);
      }

      combine_3_B.DataTypeConversion[1] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
        : (int16_T)(uint16_T)tmp;
      if (rtIsNaN(fgyro[2]) || rtIsInf(fgyro[2])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(fgyro[2]), 65536.0);
      }

      combine_3_B.DataTypeConversion[2] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
        : (int16_T)(uint16_T)tmp;

      /* S-Function (IntToStr5): '<S3>/S-Function Builder 1' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[0],
        combine_3_B.SFunctionBuilder1 );

      /* S-Function (IntToStr5): '<S3>/S-Function Builder 2' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[1],
        combine_3_B.SFunctionBuilder2 );

      /* S-Function (IntToStr5): '<S3>/S-Function Builder 3' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[2],
        combine_3_B.SFunctionBuilder3 );

      /* DataTypeConversion: '<S2>/Data Type Conversion' incorporates:
       *  Inport: '<Root>/Magnetic sensor1'
       */
      if (rtIsNaN(facc[0]) || rtIsInf(facc[0])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(facc[0]), 65536.0);
      }

      combine_3_B.DataTypeConversion_f[0] = tmp < 0.0 ? -((int16_T)(uint16_T)
        (-tmp)) : (int16_T)(uint16_T)tmp;
      if (rtIsNaN(facc[1]) || rtIsInf(facc[1])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(facc[1]), 65536.0);
      }

      combine_3_B.DataTypeConversion_f[1] = tmp < 0.0 ? -((int16_T)(uint16_T)
        (-tmp)) : (int16_T)(uint16_T)tmp;
      if (rtIsNaN(facc[2]) || rtIsInf(facc[2])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(facc[2]), 65536.0);
      }

      combine_3_B.DataTypeConversion_f[2] = tmp < 0.0 ? -((int16_T)(uint16_T)
        (-tmp)) : (int16_T)(uint16_T)tmp;

      /* S-Function (IntToStr5): '<S2>/S-Function Builder 1' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[0],
        combine_3_B.SFunctionBuilder1_h );

      /* S-Function (IntToStr5): '<S2>/S-Function Builder 2' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[1],
        combine_3_B.SFunctionBuilder2_n );

      /* S-Function (IntToStr5): '<S2>/S-Function Builder 3' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[2],
        combine_3_B.SFunctionBuilder3_a );

      /* DataTypeConversion: '<S4>/Data Type Conversion' incorporates:
       *  Inport: '<Root>/Magnetic sensor2'
       */
      if (rtIsNaN(fmag[0]) || rtIsInf(fmag[0])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(fmag[0]), 65536.0);
      }

      combine_3_B.DataTypeConversion_c[0] = tmp < 0.0 ? -((int16_T)(uint16_T)
        (-tmp)) : (int16_T)(uint16_T)tmp;
      if (rtIsNaN(fmag[1]) || rtIsInf(fmag[1])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(fmag[1]), 65536.0);
      }

      combine_3_B.DataTypeConversion_c[1] = tmp < 0.0 ? -((int16_T)(uint16_T)
        (-tmp)) : (int16_T)(uint16_T)tmp;
      if (rtIsNaN(fmag[2]) || rtIsInf(fmag[2])) {
        tmp = 0.0;
      } else {
        tmp = fmod(floor(fmag[2]), 65536.0);
      }

      combine_3_B.DataTypeConversion_c[2] = tmp < 0.0 ? -((int16_T)(uint16_T)
        (-tmp)) : (int16_T)(uint16_T)tmp;

      /* S-Function (IntToStr5): '<S4>/S-Function Builder 1' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[0],
        combine_3_B.SFunctionBuilder1_m );

      /* S-Function (IntToStr5): '<S4>/S-Function Builder 2' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[1],
        combine_3_B.SFunctionBuilder2_b );

      /* S-Function (IntToStr5): '<S4>/S-Function Builder 3' */
      IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[2],
        combine_3_B.SFunctionBuilder3_p );

      /* SignalConversion: '<Root>/TmpSignal ConversionAtSCI TransmitInport1' incorporates:
       *  Constant: '<Root>/Constant0'
       *  Constant: '<Root>/Constant2'
       *  Constant: '<Root>/Constant3'
       *  Constant: '<Root>/Constant4'
       *  Constant: '<Root>/Constant6'
       *  Constant: '<S2>/Constant1'
       *  Constant: '<S2>/Constant2'
       *  Constant: '<S3>/Constant1'
       *  Constant: '<S3>/Constant2'
       *  Constant: '<S4>/Constant1'
       *  Constant: '<S4>/Constant2'
       */
      rtb_TmpSignalConversionAtSCITra[0] = combine_3_P.Constant0_Value;
      rtb_TmpSignalConversionAtSCITra[1] = combine_3_P.Constant2_Value;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 2] = combine_3_B.SFunctionBuilder1[i];
      }

      rtb_TmpSignalConversionAtSCITra[7] = combine_3_P.Constant1_Value_b;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 8] = combine_3_B.SFunctionBuilder2[i];
      }

      rtb_TmpSignalConversionAtSCITra[13] = combine_3_P.Constant2_Value_b;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 14] =
          combine_3_B.SFunctionBuilder3[i];
      }

      rtb_TmpSignalConversionAtSCITra[19] = combine_3_P.Constant4_Value;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 20] =
          combine_3_B.SFunctionBuilder1_h[i];
      }

      rtb_TmpSignalConversionAtSCITra[25] = combine_3_P.Constant1_Value_c;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 26] =
          combine_3_B.SFunctionBuilder2_n[i];
      }

      rtb_TmpSignalConversionAtSCITra[31] = combine_3_P.Constant2_Value_o;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 32] =
          combine_3_B.SFunctionBuilder3_a[i];
      }

      rtb_TmpSignalConversionAtSCITra[37] = combine_3_P.Constant6_Value;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 38] =
          combine_3_B.SFunctionBuilder1_m[i];
      }

      rtb_TmpSignalConversionAtSCITra[43] = combine_3_P.Constant1_Value_e;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 44] =
          combine_3_B.SFunctionBuilder2_b[i];
      }

      rtb_TmpSignalConversionAtSCITra[49] = combine_3_P.Constant2_Value_n;
      for (i = 0; i < 5; i++) {
        rtb_TmpSignalConversionAtSCITra[i + 50] =
          combine_3_B.SFunctionBuilder3_p[i];
      }

      rtb_TmpSignalConversionAtSCITra[55] = combine_3_P.Constant3_Value;

      /* S-Function Block: <Root>/SCI Transmit (c28xsci_tx) */
      {
        scib_xmit((char*)rtb_TmpSignalConversionAtSCITra, 56);
      }

      /* S-Function Block: <Root>/I2C Transmit1 (c280xi2c_tx) */
      {
        int unsigned tx_loop= 0;
        while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
          tx_loop++;
        if (tx_loop!=10000) {
          I2caRegs.I2CSAR = 53;        // Set slave address
          I2caRegs.I2CCNT= 2;          // Set data length

          /* mode:1 (1:master 0:slave)  Addressing mode:0 (1:10-bit 0:7-bit)
             free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
             bit count:0 (0:8bit) stop condition:0 (1:enabled 0: disabled)*/
          I2caRegs.I2CMDR.all = 26144;
          tx_loop= 0;
          while (I2caRegs.I2CFFTX.bit.TXFFST>14 && tx_loop<10000)
            tx_loop++;
          if (tx_loop!=10000) {
            I2caRegs.I2CDXR = (uint8_T)(combine_3_P.Constant1_Value&0xFF);
            I2caRegs.I2CDXR = (uint8_T)((combine_3_P.Constant1_Value>>8&0xFF));
          }
        }
      }

      /* S-Function Block: <Root>/I2C Transmit2 (c280xi2c_tx) */
      {
        int unsigned tx_loop= 0;
        while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
          tx_loop++;
        if (tx_loop!=10000) {
          I2caRegs.I2CSAR = 68;        // Set slave address
          I2caRegs.I2CCNT= 2;          // Set data length

          /* mode:1 (1:master 0:slave)  Addressing mode:0 (1:10-bit 0:7-bit)
             free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
             bit count:0 (0:8bit) stop condition:0 (1:enabled 0: disabled)*/
          I2caRegs.I2CMDR.all = 26144;
          tx_loop= 0;
          while (I2caRegs.I2CFFTX.bit.TXFFST>14 && tx_loop<10000)
            tx_loop++;
          if (tx_loop!=10000) {
            I2caRegs.I2CDXR = (uint8_T)(combine_3_P.Constant5_Value&0xFF);
            I2caRegs.I2CDXR = (uint8_T)((combine_3_P.Constant5_Value>>8&0xFF));
          }
        }
      }

      /* S-Function Block: <Root>/I2C Transmit3 (c280xi2c_tx) */
      {
        int unsigned tx_loop= 0;
        while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
          tx_loop++;
        if (tx_loop!=10000) {
          I2caRegs.I2CSAR = 1;         // Set slave address
          I2caRegs.I2CCNT= 2;          // Set data length

          /* mode:1 (1:master 0:slave)  Addressing mode:0 (1:10-bit 0:7-bit)
             free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
             bit count:0 (0:8bit) stop condition:0 (1:enabled 0: disabled)*/
          I2caRegs.I2CMDR.all = 26144;
          tx_loop= 0;
          while (I2caRegs.I2CFFTX.bit.TXFFST>14 && tx_loop<10000)
            tx_loop++;
          if (tx_loop!=10000) {
            I2caRegs.I2CDXR = (uint8_T)(combine_3_P.Constant7_Value&0xFF);
            I2caRegs.I2CDXR = (uint8_T)((combine_3_P.Constant7_Value>>8&0xFF));
          }
        }
      }
    }
  }
}

/* Model initialize function */
void combine_3_initialize(boolean_T firstTime)
{
  (void)firstTime;

  /* Registration code */

  /* initialize non-finites */
  rt_InitInfAndNaN(sizeof(real_T));

  /* initialize error status */
  rtmSetErrorStatus(combine_3_M, (NULL));

  /* block I/O */
  (void) memset(((void *) &combine_3_B),0,
                sizeof(BlockIO_combine_3));

  /* exported global signals */
  Rcv = 0;

  /* external inputs */
  (void) memset(fgyro,0,
                3*sizeof(real_T));
  (void) memset(facc,0,
                3*sizeof(real_T));
  (void) memset(fmag,0,
                3*sizeof(real_T));

  /* Start for S-Function (c28xsci_rx): '<Root>/SCI Receive' */

  /* Initialize Rcv */
  Rcv = 27;

  {
    {
      /* user code (Initialize function Header) */
      /* System '<Root>' */
      int i, j, k;
      for (i=0; i<10000; i++)
        for (j=0; j<1000; j++)
          k = i + j;

      /* user code (Initialize function Trailer) */
      /* System '<Root>' */
      counter = 0;
      I2caRegs.I2CSAR = 0x68;          // Set slave address
      I2caRegs.I2CMDR.all = 0x66A0;
      I2caRegs.I2CDXR = 0x16;          //DLPF_FS register
   /* I2caRegs.I2CMDR.bit.TRX = 1;     //Set to Transmit mode bit 9 =1
      I2caRegs.I2CMDR.bit.MST = 1;     //Set to Master mode   bit 10
      I2caRegs.I2CMDR.bit.FREE = 1;    //Run in FREE mode     bit 14
      I2caRegs.I2CMDR.bit.STP = 0;     //Stop when internal counter becomes 0 bit 11
      I2caRegs.I2CMDR.bit.RM = 1;      // bit 7
      I2caRegs.I2CMDR.bit.IRS = 1;     //bit 5
      I2caRegs.I2CMDR.bit.STT = 1;     //Send the start bit, transmission will follow bit 13 */
      I2caRegs.I2CDXR = 0x19;          //00011001 LPF bandwith 188Hz, internal Sampling rate 1kHz, full scale 2000 o/s
    
      I2caRegs.I2CSAR = 0x53;          // Set slave address
   I2caRegs.I2CMDR.all = 0x66A0;
      I2caRegs.I2CDXR = 0x2c;          //measurement mode _ Power_ctl
   
     /* I2caRegs.I2CMDR.bit.TRX = 1;     //Set to Transmit mode bit 9 =1
      I2caRegs.I2CMDR.bit.MST = 1;     //Set to Master mode   bit 10
      I2caRegs.I2CMDR.bit.FREE = 1;    //Run in FREE mode     bit 14
      I2caRegs.I2CMDR.bit.STP = 0;     //Stop when internal counter becomes 0 bit 11
      I2caRegs.I2CMDR.bit.RM = 1;      // bit 7
      I2caRegs.I2CMDR.bit.IRS = 1;     //bit 5
      I2caRegs.I2CMDR.bit.STT = 1;     //Send the start bit, transmission will follow bit 13 */
      I2caRegs.I2CDXR = 0x09;          //data_format with full resolution
      I2caRegs.I2CDXR = 0x08;          //BW_rate 50Hz
      I2caRegs.I2CDXR = 0x00;
      I2caRegs.I2CDXR = 0x00;
      I2caRegs.I2CDXR = 0x00;
      I2caRegs.I2CDXR = 0x08;

      I2caRegs.I2CSAR = 0x1E;
   I2caRegs.I2CMDR.all = 0x66A0;
   I2caRegs.I2CDXR = 0x00;
    /*I2caRegs.I2CMDR.bit.TRX = 1;     //Set to Transmit mode bit 9 =1
      I2caRegs.I2CMDR.bit.MST = 1;     //Set to Master mode   bit 10
      I2caRegs.I2CMDR.bit.FREE = 1;    //Run in FREE mode     bit 14
      I2caRegs.I2CMDR.bit.STP = 0;     //Stop when internal counter becomes 0 bit 11
      I2caRegs.I2CMDR.bit.RM = 1;      // bit 7
      I2caRegs.I2CMDR.bit.IRS = 1;     //bit 5
      I2caRegs.I2CMDR.bit.STT = 1;     //Send the start bit, transmission will follow bit 13 */
      I2caRegs.I2CDXR = 0x06;
      I2caRegs.I2CDXR = 0x00;
      I2caRegs.I2CDXR = 0x00;

      for (i=0; i<1000; i++)
        for (j=0; j<1000; j++)
          k = i + j;
    }
  }
}

/* Model terminate function */
void combine_3_terminate(void)
{
  /* (no terminate code required) */
}

/*
 * File trailer for Real-Time Workshop generated code.
 *
 * [EOF]
 */

Thanks in advance,

hung

 PS : we just work with  the red text because this is generated code from matlab simulink.

  • I don't have any experience with the C2000 but I'll try to comment. I think that you need to wait for transactions to complete before. It's not just your read code in red. Your write code should also wait between devices. Based upon what I've read in the sprufz9c.pdf:

    //------------------
    // Write values
    while(I2caRegs.I2CSTR.bit.ARDY==0) continue; // Wait for idle
    I2caRegs.I2CSAR     = 68;    // Set slave address
    I2caRegs.I2CCNT     = 2;     // Set data length
    I2caRegs.I2CDXR     = value1;// Load FIFO
    I2caRegs.I2CDXR     = value2;// Load FIFO
    I2caRegs.I2CMDR.all = 0x6E20;// Start Tx S,A,D(n),P

    //------------------
    // Write register address and read 6 values
    while(I2caRegs.I2CSTR.bit.ARDY==0) continue; // Wait for idle
    I2caRegs.I2CSAR = 0x68;      // Set slave address
    I2caRegs.I2CCNT = 1;         // Set data length
    I2caRegs.I2CDXR = 0x1D;      // Load FIFO with register address
    I2caRegs.I2CMDR.all = 0x6620;// Start Tx S,A,D(n)

    while(I2caRegs.I2CSTR.bit.ARDY==0) continue; // Wait for idle
    I2caRegs.I2CSAR = 0x68;      // Set slave address
    I2caRegs.I2CCNT = 6;         // Set data length
    I2caRegs.I2CMDR.all = 0x6C20;// Start Rx S,A,D(n),P

    while(I2caRegs.I2CSTR.bit.ARDY==0) continue; // Wait for idle
    value1 = I2caRegs.I2CDRR;
    value2 = I2caRegs.I2CDRR;
    value3 = I2caRegs.I2CDRR;
    value4 = I2caRegs.I2CDRR;
    value5 = I2caRegs.I2CDRR;
    value6 = I2caRegs.I2CDRR;

    I am guessing that writing the CMD to register starts the state machine in the I2C controller.

     

  • Hi Hung

    It seems like what you're trying to do is send a location 0x1D to the gyro and then read data from that location. But you are in master receiver mode(   I2caRegs.I2CMDR.all = 0x64A0) all the time and it doesnt look that location is being sent across.

       I2caRegs.I2CSAR = 0x68;        // Set slave address

      I2caRegs.I2CMDR.all = 0x64A0;// This needs to be 66A0 first
            I2caRegs.I2CDXR = 0x1D; // send location over and then switch over to master reciver 0x6C20 to receive data into FIFO. Also set data count in I2CCNT
            gyro[0] = (I2caRegs.I2CDRR <<8) & 0xFF00;
            gyro[0] |= I2caRegs.I2CDRR;
            gyro[1] = (I2caRegs.I2CDRR <<8) & 0xFF00;
            gyro[1] |= I2caRegs.I2CDRR;
            gyro[2] = (I2caRegs.I2CDRR <<8) & 0xFF00;
            gyro[2] |= I2caRegs.I2CDRR;

     

  • Hi Vishal Coelho

    At first thank you very much because your quick reply.I fixed my code and this time i only work with two device accelerometer and gyro.

    The initialize code here, i set the mode is tranmiter at first 0x6E20 for two divice accelerometer and gyro:

     /* user code (Initialize function Header) */

          /* System '<Root>' */

          int i, j, k;

          for (i=0; i<10000; i++)

            for (j=0; j<1000; j++)

              k = i + j;

          /* user code (Initialize function Trailer) */

          /* System '<Root>' */

          counter = 0;

     //////////////////////////////////////////////// gyro

     

          I2caRegs.I2CSAR = 0x68;          // Set slave address

          I2caRegs.I2CCNT = 2;             // Set data length

          I2caRegs.I2CDXR = 0x16;          //DLPF_FS register

          I2caRegs.I2CMDR.all = 0x6E20;      

          I2caRegs.I2CDXR = 0x19;          //00011001 LPF bandwith 188Hz, internal Sampling rate 1kHz, full scale 2000 o/s

          

          for (i=0; i<5000; i++)

            for (j=0; j<1000; j++)

              k = i + j;

    ////////////////////////////////////////////////////////////////////////////////acc

           I2caRegs.I2CSAR = 0x53;          // Set slave address

          I2caRegs.I2CCNT = 7;             // Set data length

          I2caRegs.I2CDXR = 0x2c;          //measurement mode _ Power_ctl

          I2caRegs.I2CMDR.all = 0x6E20;     

          I2caRegs.I2CDXR = 0x09;          //data_format with full resolution

          I2caRegs.I2CDXR = 0x08;          //BW_rate 50Hz

          I2caRegs.I2CDXR = 0x00;

          I2caRegs.I2CDXR = 0x00;

          I2caRegs.I2CDXR = 0x00;

          I2caRegs.I2CDXR = 0x08;

          for (i=0; i<5000; i++)

            for (j=0; j<1000; j++)

              k = i + j;   

    Then i set the mode to receive 0x6C20 in this code and read data from gyro with  start address to read 0x1D and accelerometer 0x32.

     

     ///////////////////////////////////////////////acc

          I2caRegs.I2CSAR = 0x53;      // Set slave address

          I2caRegs.I2CCNT = 6;

          I2caRegs.I2CMDR.all = 0x6C20;    

         

            acc[0] = (I2caRegs.I2CDRR <<8) & 0xFF00;

            acc[0] |= I2caRegs.I2CDRR;

            acc[1] = (I2caRegs.I2CDRR <<8) & 0xFF00;

            acc[1] |= I2caRegs.I2CDRR;

            acc[2] = (I2caRegs.I2CDRR <<8) & 0xFF00;

            acc[2] |= I2caRegs.I2CDRR;

            for (i=0; i<3; i++) {

              if (acc[i] >= 0x2000)

                facc[i] = (float)(acc[i] - 0x3FFF) * 0.07326;

              else

                facc[i] = (float)acc[i] * 0.07326;

              I2caRegs.I2CSAR = 0x53;      // Set slave address

              I2caRegs.I2CCNT = 4;         // Set data length

              I2caRegs.I2CDXR = 0x30;

              I2caRegs.I2CMDR.all = 0x6E20;  

     I2caRegs.I2CDXR = 0x31;

              I2caRegs.I2CDXR = 0x00;

              I2caRegs.I2CDXR = 0x08; }  

            /////////////////////////////////////////doc cam bien gyro/////////////////////////////////////

     

          I2caRegs.I2CSAR = 0x68;          // Set slave address

          I2caRegs.I2CCNT = 6;

          I2caRegs.I2CMDR.all = 0x6C20;         


            gyro[0] = (I2caRegs.I2CDRR <<8) & 0xFF00;

            gyro[0] |= I2caRegs.I2CDRR;

            gyro[1] = (I2caRegs.I2CDRR <<8) & 0xFF00;

            gyro[1] |= I2caRegs.I2CDRR;

            gyro[2] = (I2caRegs.I2CDRR <<8) & 0xFF00;

            gyro[2] |= I2caRegs.I2CDRR;

            for (i=0; i<3; i++) {

              if (gyro[i] >= 0x2000)

                fgyro[i] = (float)(gyro[i] - 0x3FFF) * 0.07326;

              else

                fgyro[i] = (float)gyro[i] * 0.07326;


              I2caRegs.I2CSAR = 0x68;      // Set slave address

              I2caRegs.I2CCNT = 2;         // Set data length

              I2caRegs.I2CDXR = 0x1C;

              I2caRegs.I2CMDR.all = 0x6E20;          

              I2caRegs.I2CDXR = 0x00;

     } 


     //////////////////////////////////////////////////////


     

          } else if (counter==3)           // read data via I2C

          {

           // I2caRegs.I2CSAR = 0x68;      // Set slave address

            I2caRegs.I2CCNT = 6;

            I2caRegs.I2CMDR.all = 0x6C20;

            

          }


          counter++;

          if (counter==4)

            counter = 0;

    Every device stand alone work ok but when i combine two device togetherwith  the data's always zero foe two device.I don't understand the protocol to work with 2 slave address.Please show me how to fix this.Do you have any example code for I2C with two slave adress? 

    Thank you again



     

     

  • - You should test the status register instead of using 5000x1000 loops.

    - You need to wait for the receive to complete before reading from I2CDRR.

    - I2C protocol is very specifc. The basic write form is contain start, slave address, data to write, and stop. The basic write reg/read form is start, slave address, register address, start, slave address, data to read, and stop. The documenation for your processor shows how to setup the I2C controller for these forms.

    - Is it possible to move this code to another file can call those functions from your generated matlab simulink code.

    - Attached is possible example code. Use it for ideas. It probably will not compile.

    /*
     * File: combine_3.c
     *
     * Real-Time Workshop code generated for Simulink model combine_3.
     *
     * Model version                        : 1.2
     * Real-Time Workshop file version      : 7.4  (R2009b)  29-Jun-2009
     * Real-Time Workshop file generated on : Sun Apr 10 15:07:11 2011
     * TLC version                          : 7.4 (Jul 14 2009)
     * C/C++ source code generated on       : Sun Apr 10 15:07:12 2011
     *
     * Target selection: ccslink_ert.tlc
     * Embedded hardware selection: Texas Instruments->C2000
     * Code generation objectives: Unspecified
     * Validation result: Not run
     */
    
    #include "combine_3.h"
    #include "combine_3_private.h"
    
    /* user code (top of source file) */
    /* System '<Root>' */
    int counter;
    
    #define ACC_I2C_ADDR  0x53
    #define MAG_I2C_ADDR  0x1E
    #define GYRO_I2C_ADDR 0x68
    
    //TODO: Verify this is the correct bit to test for transaction done.
    void i2c_wait_till_idle(void)
    {
      while(I2caRegs.I2CSTR.bit.ARDY==0) continue; // Wait for idle
    }
    
    void i2c_write_uint16(uint8_T addr, uint16_T val)
    {
      int unsigned tx_loop= 0;
      while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
        tx_loop++;
      if (tx_loop!=10000)
      {
        I2caRegs.I2CSAR = addr;      // Set slave address
        I2caRegs.I2CCNT= 2;          // Set data length
    
        /* mode:1 (1:master 0:slave)  Addressing mode:0 (1:10-bit 0:7-bit)
           free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
           bit count:0 (0:8bit) stop condition:0 (1:enabled 0: disabled)*/
        I2caRegs.I2CMDR.all = 0x6E20; //Was 26144 or 0x6620
        tx_loop= 0;
        while (I2caRegs.I2CFFTX.bit.TXFFST>14 && tx_loop<10000)
          tx_loop++;
        if (tx_loop!=10000)
        {
          I2caRegs.I2CDXR = (uint8_T)(val&0xFF);
          I2caRegs.I2CDXR = (uint8_T)(val>>8&0xFF);
        }
      }
    }
    
    void i2c_write_reg_uint8xn(uint8_T addr, uint8_T reg, const uint8_T val[], int n)
    {
      int i;
    
      i2c_wait_till_idle();
      I2caRegs.I2CSAR     = addr;  // Set slave address
      I2caRegs.I2CCNT     = n+1;   // Set data length
      I2caRegs.I2CDXR     = reg;   // Load FIFO
      for(i=0; i<n; i++)
        I2caRegs.I2CDXR   = val[i];// Load FIFO
      I2caRegs.I2CMDR.all = 0x6E20;// Start Tx S,A,D(n),P
    }
    
    void i2c_read_reg_int16x3(uint8_T addr, uint8_T reg, int16 value[3])
    {
      i2c_wait_till_idle();
      I2caRegs.I2CSAR = addr;      // Set slave address
      I2caRegs.I2CCNT = 1;         // Set data length
      I2caRegs.I2CDXR = reg;      // Load FIFO with register address
      I2caRegs.I2CMDR.all = 0x6620;// Start Tx S,A,D(n)
    
      i2c_wait_till_idle();
      I2caRegs.I2CSAR = addr;      // Set slave address
      I2caRegs.I2CCNT = 6;         // Set data length
      I2caRegs.I2CMDR.all = 0x6C20;// Start Rx S,A,D(n),P
    
      i2c_wait_till_idle();
    
      value[0]  = (I2caRegs.I2CDRR <<8) & 0xFF00;
      value[0] |=  I2caRegs.I2CDRR;
      value[1]  = (I2caRegs.I2CDRR <<8) & 0xFF00;
      value[1] |=  I2caRegs.I2CDRR;
      value[2]  = (I2caRegs.I2CDRR <<8) & 0xFF00;
      value[2] |=  I2caRegs.I2CDRR;
    }
    
    void int16_to_real(const int16 ival[], real_T fval[], int n)
    {
      int   i;
    
      for (i=0; i<n; i++)
      {
        if (ival[i] >= 0x2000)
          fval[i] = (float)(ival[i] - 0x3FFF) * 0.07326;
        else
          fval[i] = (float)ival[i] * 0.07326;
      }
    }
    
    void gyro_init(void)
    {
      // Reg = 0x16, DLPF_FS register
      //00011001 LPF bandwith 188Hz, internal Sampling rate 1kHz, full scale 2000 o/s
      const uint8_T val[1] = {0x19};
      i2c_write_reg_uint8xn(GYRO_I2C_ADDR, 0x16, val, 1);
    }
    
    void gyro_read(real_T fgyro[3])
    {
      int16 gyro[3];
    
      i2c_read_reg_int16x3(GYRO_I2C_ADDR, 0x1D, gyro);
      int16_to_real(gyro, fgyro, 3);
    }
    
    void_acc_init(void)
    {
      // Reg=0x2c, measurement mode _ Power_ctl
      // [0] = 0x09 data_format with full resolution
      // [1] = 0x08 BW_rate 50Hz
      uint8_T val[6] = {0x09,0x08,0x00,0x00,0x00,0x08};
      i2c_write_reg_uint8xn(ACC_I2C_ADDR, 0x2C, val, 6);
    }
    
    void acc_read(real_T facc[3])
    {
      int16 acc[3];
    
      i2c_read_reg_int16x3(ACC_I2C_ADDR, 0x03, acc);
      int16_to_real(acc, facc, 3);
    }
    
    void mag_init(void)
    {
      // Reg = 0x00, ??????
      uint8_T val[3] = {0x06,0x00,0x00};
      i2c_write_reg_uint8xn(MAG_I2C_ADDR, 0x00, val, 3);
    }
    
    void mag_read(real_T fmag[3])
    {
      int16 mag[3];
      int   i;
    
      i2c_read_reg_int16x3(MAG_I2C_ADDR, 0x32, mag);
      int16_to_real(mag, fmag, 3);
    }
    
    /* Exported block signals */
    real_T fgyro[3];                       /* '<Root>/Magnetic sensor' */
    real_T facc[3];                        /* '<Root>/Magnetic sensor1' */
    real_T fmag[3];                        /* '<Root>/Magnetic sensor2' */
    uint8_T Rcv;                           /* '<Root>/SCI Receive' */
    
    /* Block signals (auto storage) */
    BlockIO_combine_3 combine_3_B;
    
    /* Real-time model */
    RT_MODEL_combine_3 combine_3_M_;
    RT_MODEL_combine_3 *combine_3_M = &combine_3_M_;
    
    /* Model step function */
    void combine_3_step(void)
    {
      /* local block i/o variables */
      uint8_T rtb_TmpSignalConversionAtSCITra[56];
    
      {
        int16_T i;
        real_T tmp;
    
        {
          /* user code (Output function Header) */
          /* System '<Root>' */
          int16 i, j, k;
    
          if (counter==0) {
            gyro_read(fgyro);
            acc_read(facc);
            mag_read(fmag);
          }
          else if (counter==3)           // read data via I2C
          {
            //TODO:?????
          }
    
          counter++;
          if (counter==4)
            counter = 0;
    
          /* S-Function Block: <Root>/SCI Receive (c28xsci_rx) */
          {
            int i;
            char recbuff[1];
            int errFlg = NOERROR;
            for (i = 0; i < 1; i++)
              recbuff[i] = 0;
    
            /* Receiving data */
            errFlg = scib_rcv(recbuff, 1, LONGLOOP);
            if (errFlg != NOERROR)
              goto RXERRB;
            memcpy( &Rcv, recbuff, 1);
           RXERRB:
            asm(" NOP");
          }
    
          /* DataTypeConversion: '<S3>/Data Type Conversion' incorporates:
           *  Inport: '<Root>/Magnetic sensor'
           */
          if (rtIsNaN(fgyro[0]) || rtIsInf(fgyro[0])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fgyro[0]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion[0] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
            : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fgyro[1]) || rtIsInf(fgyro[1])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fgyro[1]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion[1] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
            : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fgyro[2]) || rtIsInf(fgyro[2])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fgyro[2]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion[2] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
            : (int16_T)(uint16_T)tmp;
    
          /* S-Function (IntToStr5): '<S3>/S-Function Builder 1' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[0],
            combine_3_B.SFunctionBuilder1 );
    
          /* S-Function (IntToStr5): '<S3>/S-Function Builder 2' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[1],
            combine_3_B.SFunctionBuilder2 );
    
          /* S-Function (IntToStr5): '<S3>/S-Function Builder 3' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[2],
            combine_3_B.SFunctionBuilder3 );
    
          /* DataTypeConversion: '<S2>/Data Type Conversion' incorporates:
           *  Inport: '<Root>/Magnetic sensor1'
           */
          if (rtIsNaN(facc[0]) || rtIsInf(facc[0])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(facc[0]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_f[0] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(facc[1]) || rtIsInf(facc[1])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(facc[1]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_f[1] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(facc[2]) || rtIsInf(facc[2])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(facc[2]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_f[2] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
    
          /* S-Function (IntToStr5): '<S2>/S-Function Builder 1' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[0],
            combine_3_B.SFunctionBuilder1_h );
    
          /* S-Function (IntToStr5): '<S2>/S-Function Builder 2' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[1],
            combine_3_B.SFunctionBuilder2_n );
    
          /* S-Function (IntToStr5): '<S2>/S-Function Builder 3' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[2],
            combine_3_B.SFunctionBuilder3_a );
    
          /* DataTypeConversion: '<S4>/Data Type Conversion' incorporates:
           *  Inport: '<Root>/Magnetic sensor2'
           */
          if (rtIsNaN(fmag[0]) || rtIsInf(fmag[0])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fmag[0]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_c[0] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fmag[1]) || rtIsInf(fmag[1])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fmag[1]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_c[1] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fmag[2]) || rtIsInf(fmag[2])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fmag[2]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_c[2] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
    
          /* S-Function (IntToStr5): '<S4>/S-Function Builder 1' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[0],
            combine_3_B.SFunctionBuilder1_m );
    
          /* S-Function (IntToStr5): '<S4>/S-Function Builder 2' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[1],
            combine_3_B.SFunctionBuilder2_b );
    
          /* S-Function (IntToStr5): '<S4>/S-Function Builder 3' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[2],
            combine_3_B.SFunctionBuilder3_p );
    
          /* SignalConversion: '<Root>/TmpSignal ConversionAtSCI TransmitInport1' incorporates:
           *  Constant: '<Root>/Constant0'
           *  Constant: '<Root>/Constant2'
           *  Constant: '<Root>/Constant3'
           *  Constant: '<Root>/Constant4'
           *  Constant: '<Root>/Constant6'
           *  Constant: '<S2>/Constant1'
           *  Constant: '<S2>/Constant2'
           *  Constant: '<S3>/Constant1'
           *  Constant: '<S3>/Constant2'
           *  Constant: '<S4>/Constant1'
           *  Constant: '<S4>/Constant2'
           */
          rtb_TmpSignalConversionAtSCITra[0] = combine_3_P.Constant0_Value;
          rtb_TmpSignalConversionAtSCITra[1] = combine_3_P.Constant2_Value;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 2] = combine_3_B.SFunctionBuilder1[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[7] = combine_3_P.Constant1_Value_b;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 8] = combine_3_B.SFunctionBuilder2[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[13] = combine_3_P.Constant2_Value_b;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 14] =
              combine_3_B.SFunctionBuilder3[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[19] = combine_3_P.Constant4_Value;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 20] =
              combine_3_B.SFunctionBuilder1_h[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[25] = combine_3_P.Constant1_Value_c;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 26] =
              combine_3_B.SFunctionBuilder2_n[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[31] = combine_3_P.Constant2_Value_o;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 32] =
              combine_3_B.SFunctionBuilder3_a[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[37] = combine_3_P.Constant6_Value;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 38] =
              combine_3_B.SFunctionBuilder1_m[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[43] = combine_3_P.Constant1_Value_e;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 44] =
              combine_3_B.SFunctionBuilder2_b[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[49] = combine_3_P.Constant2_Value_n;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 50] =
              combine_3_B.SFunctionBuilder3_p[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[55] = combine_3_P.Constant3_Value;
    
          /* S-Function Block: <Root>/SCI Transmit (c28xsci_tx) */
          {
            scib_xmit((char*)rtb_TmpSignalConversionAtSCITra, 56);
          }
    
          /* S-Function Block: <Root>/I2C Transmit1 (c280xi2c_tx) */
          {
            //TODO: Was using slave address = 53 and not 0x53. Verify.
            i2c_write_uint8x2(0x53, combine_3_P.Constant1_Value);
          }
    
          /* S-Function Block: <Root>/I2C Transmit2 (c280xi2c_tx) */
          {
            //TODO: Was using slave address = 68 and not 0x68. Verify.
            i2c_write_uint8x2(0x68, combine_3_P.Constant5_Value);
          }
    
          /* S-Function Block: <Root>/I2C Transmit3 (c280xi2c_tx) */
          {
            //TODO: Was using slave address = 1 and not 0x1E. Verify.
            i2c_write_uint8x2(0x1E, combine_3_P.Constant7_Value);
          }
        }
      }
    }
    
    /* Model initialize function */
    void combine_3_initialize(boolean_T firstTime)
    {
      (void)firstTime;
    
      /* Registration code */
    
      /* initialize non-finites */
      rt_InitInfAndNaN(sizeof(real_T));
    
      /* initialize error status */
      rtmSetErrorStatus(combine_3_M, (NULL));
    
      /* block I/O */
      (void) memset(((void *) &combine_3_B),0,
                    sizeof(BlockIO_combine_3));
    
      /* exported global signals */
      Rcv = 0;
    
      /* external inputs */
      (void) memset(fgyro,0,
                    3*sizeof(real_T));
      (void) memset(facc,0,
                    3*sizeof(real_T));
      (void) memset(fmag,0,
                    3*sizeof(real_T));
    
      /* Start for S-Function (c28xsci_rx): '<Root>/SCI Receive' */
    
      /* Initialize Rcv */
      Rcv = 27;
    
      {
        {
          /* user code (Initialize function Header) */
          /* System '<Root>' */
          int i, j, k;
          for (i=0; i<10000; i++)
            for (j=0; j<1000; j++)
              k = i + j;
    
          /* user code (Initialize function Trailer) */
          /* System '<Root>' */
          counter = 0;
    
          gyro_init();
          acc_init();
          mag_init();
        }
      }
    }
    
    /* Model terminate function */
    void combine_3_terminate(void)
    {
      /* (no terminate code required) */
    }
    
    /*
     * File trailer for Real-Time Workshop generated code.
     *
     * [EOF]
     */
    

  •  

    Hi Norman Wong,

    Thank you very much for your reply and show me the way very clearly to solve this problem. I still stuck in this mess for a very long time. I will try more hard and i hope i can do it.

    When i built and received this message:

    <Linking>

     undefined          first referenced                                                           
      symbol                in file                                                                
     ---------          ----------------                                                           
     _acc_init          D:\\CH\\Luan Van CH\\DSP\\combine3\\combine_3_ticcs\\CustomMW\\combine_3.obj
     _i2c_write_uint8x2 D:\\CH\\Luan Van CH\\DSP\\combine3\\combine_3_ticcs\\CustomMW\\combine_3.obj

    error: unresolved symbols remain
    error: errors encountered during linking; "combine_3.out" not built

    I found _acc_init   and fixed this and now :

    <Linking>

     undefined          first referenced                                                           
      symbol                in file                                                                
     ---------          ----------------                                                           
     _i2c_write_uint8x2 D:\\CH\\Luan Van CH\\DSP\\combine3\\combine_3_ticcs\\CustomMW\\combine_3.obj

    error: unresolved symbols remain
    error: errors encountered during linking; "combine_3.out" not built

    How can i define this symbol or fix this?

    Thanks you again.

    PS: Here is address,  register and value to write or read of each device:

    Magneto: Slave address 0x1E

           Write value 0x00 to register 0x02

                     value 0x06 to register 0x00           

           Read value from register 0x03

    Gyro: Slave address 0x68

           Write value 0x19 to register 0x16                    

           Read value from register 0x1D

    Accelerometer: Slave address 0x53

           Write value 0x08 to register 0x2D

                     value 0x08 to register 0x31           

                     value 0x09 to register 0x2C 

           Read value from register 0x32

    2744.combine3.rar


  • The example that I gave was meant as a way to illustrate my ideas. I don't have a C2000,  I don't have a compiler and I have never uses that sensor. I was moving code around and missed a rename. Replace i2c_write_uint8x2 with i2c_write_uint16.

    You should be able to modify the acc_init(), mag_init() and gyro_init() functions to write what you want. In your original code, the "S-Function Block" functions do not specific a register address. You can copy and modify one of the other i2c functions to send a register.

  • Hi Norman Wong,

    Thanks in advance, i can understand how the program work now.It's still not work but i believe it will work.I will tell you when it work.

    Thanks you very much and have a good day.

  • Just looked at your request in more detail.

    - Rename i2c_write_uint8x2 to i2c_write_uint16

    - Added i2c_write_reg_uint.

    - Add calls to i2c_write_reg_uint in the acc_init, mag_init and gyro_init as per your sequence.

    Please review anything I have marked as "TODO". I have made assumptions about what you are trying to do.

    Attached:

    /*
     * File: combine_3.c
     *
     * Real-Time Workshop code generated for Simulink model combine_3.
     *
     * Model version                        : 1.2
     * Real-Time Workshop file version      : 7.4  (R2009b)  29-Jun-2009
     * Real-Time Workshop file generated on : Sun Apr 10 15:07:11 2011
     * TLC version                          : 7.4 (Jul 14 2009)
     * C/C++ source code generated on       : Sun Apr 10 15:07:12 2011
     *
     * Target selection: ccslink_ert.tlc
     * Embedded hardware selection: Texas Instruments->C2000
     * Code generation objectives: Unspecified
     * Validation result: Not run
     */
    
    #include "combine_3.h"
    #include "combine_3_private.h"
    
    /* user code (top of source file) */
    /* System '<Root>' */
    int counter;
    
    #define ACC_I2C_ADDR  0x53
    #define MAG_I2C_ADDR  0x1E
    #define GYRO_I2C_ADDR 0x68
    
    //TODO: Verify this is the correct bit to test for transaction done.
    void i2c_wait_till_idle(void)
    {
      while(I2caRegs.I2CSTR.bit.ARDY==0) continue; // Wait for idle
    }
    
    void i2c_write_uint16(uint8_T addr, uint16_T val)
    {
      int unsigned tx_loop= 0;
      while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
        tx_loop++;
      if (tx_loop!=10000)
      {
        I2caRegs.I2CSAR = addr;      // Set slave address
        I2caRegs.I2CCNT= 2;          // Set data length
    
        /* mode:1 (1:master 0:slave)  Addressing mode:0 (1:10-bit 0:7-bit)
           free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
           bit count:0 (0:8bit) stop condition:0 (1:enabled 0: disabled)*/
        I2caRegs.I2CMDR.all = 0x6E20; //Was 26144 or 0x6620
        tx_loop= 0;
        while (I2caRegs.I2CFFTX.bit.TXFFST>14 && tx_loop<10000)
          tx_loop++;
        if (tx_loop!=10000)
        {
          I2caRegs.I2CDXR = (uint8_T)(val&0xFF);
          I2caRegs.I2CDXR = (uint8_T)(val>>8&0xFF);
        }
      }
    }
    
    void i2c_write_reg_uint8(uint8_T addr, uint8_T reg, uint8_T val)
    {
      int i;
    
      i2c_wait_till_idle();
      I2caRegs.I2CSAR     = addr;  // Set slave address
      I2caRegs.I2CCNT     = 2;     // Set data length
      I2caRegs.I2CDXR     = reg;   // Load FIFO
      I2caRegs.I2CDXR     = val;   // Load FIFO
      I2caRegs.I2CMDR.all = 0x6E20;// Start Tx S,A,D(n),P
    }
    
    void i2c_write_reg_uint8xn(uint8_T addr, uint8_T reg, const uint8_T val[], int n)
    {
      int i;
    
      i2c_wait_till_idle();
      I2caRegs.I2CSAR     = addr;  // Set slave address
      I2caRegs.I2CCNT     = n+1;   // Set data length
      I2caRegs.I2CDXR     = reg;   // Load FIFO
      for(i=0; i<n; i++)
        I2caRegs.I2CDXR   = val[i];// Load FIFO
      I2caRegs.I2CMDR.all = 0x6E20;// Start Tx S,A,D(n),P
    }
    
    void i2c_read_reg_int16x3(uint8_T addr, uint8_T reg, int16 value[3])
    {
      i2c_wait_till_idle();
      I2caRegs.I2CSAR = addr;      // Set slave address
      I2caRegs.I2CCNT = 1;         // Set data length
      I2caRegs.I2CDXR = reg;      // Load FIFO with register address
      I2caRegs.I2CMDR.all = 0x6620;// Start Tx S,A,D(n)
    
      i2c_wait_till_idle();
      I2caRegs.I2CSAR = addr;      // Set slave address
      I2caRegs.I2CCNT = 6;         // Set data length
      I2caRegs.I2CMDR.all = 0x6C20;// Start Rx S,A,D(n),P
    
      i2c_wait_till_idle();
    
      value[0]  = (I2caRegs.I2CDRR <<8) & 0xFF00;
      value[0] |=  I2caRegs.I2CDRR;
      value[1]  = (I2caRegs.I2CDRR <<8) & 0xFF00;
      value[1] |=  I2caRegs.I2CDRR;
      value[2]  = (I2caRegs.I2CDRR <<8) & 0xFF00;
      value[2] |=  I2caRegs.I2CDRR;
    }
    
    void int16_to_real(const int16 ival[], real_T fval[], int n)
    {
      int   i;
    
      for (i=0; i<n; i++)
      {
        if (ival[i] >= 0x2000)
          fval[i] = (float)(ival[i] - 0x3FFF) * 0.07326;
        else
          fval[i] = (float)ival[i] * 0.07326;
      }
    }
    
    void gyro_init(void)
    {
      // Reg = 0x16, DLPF_FS register
      //00011001 LPF bandwith 188Hz, internal Sampling rate 1kHz, full scale 2000 o/s
    //TODO:Check for correctness.
      i2c_write_reg_uint8(GYRO_I2C_ADDR, 0x16, 0x19);
    }
    
    void gyro_read(real_T fgyro[3])
    {
      int16 gyro[3];
    
      i2c_read_reg_int16x3(GYRO_I2C_ADDR, 0x1D, gyro);
      int16_to_real(gyro, fgyro, 3);
    }
    
    void acc_init(void)
    {
      // Reg=0x2c, measurement mode _ Power_ctl
      // [0] = 0x09 data_format with full resolution
      // [1] = 0x08 BW_rate 50Hz
    //TODO:Check for correctness.
    //uint8_T val[6] = {0x09,0x08,0x00,0x00,0x00,0x08};
    //i2c_write_reg_uint8xn(ACC_I2C_ADDR, 0x2C, val, 6);
      i2c_write_reg_uint8(ACC_I2C_ADDR, 0x2D, 0x08);
      i2c_write_reg_uint8(ACC_I2C_ADDR, 0x31, 0x08);
      i2c_write_reg_uint8(ACC_I2C_ADDR, 0x2C, 0x09);
    }
    
    void acc_read(real_T facc[3])
    {
      int16 acc[3];
    
      i2c_read_reg_int16x3(ACC_I2C_ADDR, 0x32, acc); //TODO: Was 0x03.  Check for correctness.
      int16_to_real(acc, facc, 3);
    }
    
    void mag_init(void)
    {
      // Reg = 0x00, ??????
    //TODO:Check for correctness.
    //uint8_T val[3] = {0x06,0x00,0x00};
    //i2c_write_reg_uint8xn(MAG_I2C_ADDR, 0x00, val, 3);
      i2c_write_reg_uint8(MAG_I2C_ADDR, 0x02, 0x00);
      i2c_write_reg_uint8(MAG_I2C_ADDR, 0x00, 0x06);
    }
    
    void mag_read(real_T fmag[3])
    {
      int16 mag[3];
      int   i;
    
      i2c_read_reg_int16x3(MAG_I2C_ADDR, 0x03, mag); //TODO: Was 0x32. Check for correctness.
      int16_to_real(mag, fmag, 3);
    }
    
    /* Exported block signals */
    real_T fgyro[3];                       /* '<Root>/Magnetic sensor' */
    real_T facc[3];                        /* '<Root>/Magnetic sensor1' */
    real_T fmag[3];                        /* '<Root>/Magnetic sensor2' */
    uint8_T Rcv;                           /* '<Root>/SCI Receive' */
    
    /* Block signals (auto storage) */
    BlockIO_combine_3 combine_3_B;
    
    /* Real-time model */
    RT_MODEL_combine_3 combine_3_M_;
    RT_MODEL_combine_3 *combine_3_M = &combine_3_M_;
    
    /* Model step function */
    void combine_3_step(void)
    {
      /* local block i/o variables */
      uint8_T rtb_TmpSignalConversionAtSCITra[56];
    
      {
        int16_T i;
        real_T tmp;
    
        {
          /* user code (Output function Header) */
          /* System '<Root>' */
          int16 i, j, k;
    
          if (counter==0) {
            gyro_read(fgyro);
            acc_read(facc);
            mag_read(fmag);
          }
          else if (counter==3)           // read data via I2C
          {
            //TODO:?????
          }
    
          counter++;
          if (counter==4)
            counter = 0;
    
          /* S-Function Block: <Root>/SCI Receive (c28xsci_rx) */
          {
            int i;
            char recbuff[1];
            int errFlg = NOERROR;
            for (i = 0; i < 1; i++)
              recbuff[i] = 0;
    
            /* Receiving data */
            errFlg = scib_rcv(recbuff, 1, LONGLOOP);
            if (errFlg != NOERROR)
              goto RXERRB;
            memcpy( &Rcv, recbuff, 1);
           RXERRB:
            asm(" NOP");
          }
    
          /* DataTypeConversion: '<S3>/Data Type Conversion' incorporates:
           *  Inport: '<Root>/Magnetic sensor'
           */
          if (rtIsNaN(fgyro[0]) || rtIsInf(fgyro[0])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fgyro[0]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion[0] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
            : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fgyro[1]) || rtIsInf(fgyro[1])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fgyro[1]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion[1] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
            : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fgyro[2]) || rtIsInf(fgyro[2])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fgyro[2]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion[2] = tmp < 0.0 ? -((int16_T)(uint16_T)(-tmp))
            : (int16_T)(uint16_T)tmp;
    
          /* S-Function (IntToStr5): '<S3>/S-Function Builder 1' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[0],
            combine_3_B.SFunctionBuilder1 );
    
          /* S-Function (IntToStr5): '<S3>/S-Function Builder 2' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[1],
            combine_3_B.SFunctionBuilder2 );
    
          /* S-Function (IntToStr5): '<S3>/S-Function Builder 3' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion[2],
            combine_3_B.SFunctionBuilder3 );
    
          /* DataTypeConversion: '<S2>/Data Type Conversion' incorporates:
           *  Inport: '<Root>/Magnetic sensor1'
           */
          if (rtIsNaN(facc[0]) || rtIsInf(facc[0])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(facc[0]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_f[0] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(facc[1]) || rtIsInf(facc[1])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(facc[1]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_f[1] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(facc[2]) || rtIsInf(facc[2])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(facc[2]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_f[2] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
    
          /* S-Function (IntToStr5): '<S2>/S-Function Builder 1' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[0],
            combine_3_B.SFunctionBuilder1_h );
    
          /* S-Function (IntToStr5): '<S2>/S-Function Builder 2' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[1],
            combine_3_B.SFunctionBuilder2_n );
    
          /* S-Function (IntToStr5): '<S2>/S-Function Builder 3' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_f[2],
            combine_3_B.SFunctionBuilder3_a );
    
          /* DataTypeConversion: '<S4>/Data Type Conversion' incorporates:
           *  Inport: '<Root>/Magnetic sensor2'
           */
          if (rtIsNaN(fmag[0]) || rtIsInf(fmag[0])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fmag[0]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_c[0] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fmag[1]) || rtIsInf(fmag[1])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fmag[1]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_c[1] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
          if (rtIsNaN(fmag[2]) || rtIsInf(fmag[2])) {
            tmp = 0.0;
          } else {
            tmp = fmod(floor(fmag[2]), 65536.0);
          }
    
          combine_3_B.DataTypeConversion_c[2] = tmp < 0.0 ? -((int16_T)(uint16_T)
            (-tmp)) : (int16_T)(uint16_T)tmp;
    
          /* S-Function (IntToStr5): '<S4>/S-Function Builder 1' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[0],
            combine_3_B.SFunctionBuilder1_m );
    
          /* S-Function (IntToStr5): '<S4>/S-Function Builder 2' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[1],
            combine_3_B.SFunctionBuilder2_b );
    
          /* S-Function (IntToStr5): '<S4>/S-Function Builder 3' */
          IntToStr5_Outputs_wrapper(&combine_3_B.DataTypeConversion_c[2],
            combine_3_B.SFunctionBuilder3_p );
    
          /* SignalConversion: '<Root>/TmpSignal ConversionAtSCI TransmitInport1' incorporates:
           *  Constant: '<Root>/Constant0'
           *  Constant: '<Root>/Constant2'
           *  Constant: '<Root>/Constant3'
           *  Constant: '<Root>/Constant4'
           *  Constant: '<Root>/Constant6'
           *  Constant: '<S2>/Constant1'
           *  Constant: '<S2>/Constant2'
           *  Constant: '<S3>/Constant1'
           *  Constant: '<S3>/Constant2'
           *  Constant: '<S4>/Constant1'
           *  Constant: '<S4>/Constant2'
           */
          rtb_TmpSignalConversionAtSCITra[0] = combine_3_P.Constant0_Value;
          rtb_TmpSignalConversionAtSCITra[1] = combine_3_P.Constant2_Value;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 2] = combine_3_B.SFunctionBuilder1[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[7] = combine_3_P.Constant1_Value_b;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 8] = combine_3_B.SFunctionBuilder2[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[13] = combine_3_P.Constant2_Value_b;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 14] =
              combine_3_B.SFunctionBuilder3[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[19] = combine_3_P.Constant4_Value;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 20] =
              combine_3_B.SFunctionBuilder1_h[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[25] = combine_3_P.Constant1_Value_c;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 26] =
              combine_3_B.SFunctionBuilder2_n[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[31] = combine_3_P.Constant2_Value_o;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 32] =
              combine_3_B.SFunctionBuilder3_a[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[37] = combine_3_P.Constant6_Value;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 38] =
              combine_3_B.SFunctionBuilder1_m[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[43] = combine_3_P.Constant1_Value_e;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 44] =
              combine_3_B.SFunctionBuilder2_b[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[49] = combine_3_P.Constant2_Value_n;
          for (i = 0; i < 5; i++) {
            rtb_TmpSignalConversionAtSCITra[i + 50] =
              combine_3_B.SFunctionBuilder3_p[i];
          }
    
          rtb_TmpSignalConversionAtSCITra[55] = combine_3_P.Constant3_Value;
    
          /* S-Function Block: <Root>/SCI Transmit (c28xsci_tx) */
          {
            scib_xmit((char*)rtb_TmpSignalConversionAtSCITra, 56);
          }
    
          /* S-Function Block: <Root>/I2C Transmit1 (c280xi2c_tx) */
          {
            //TODO: Was using slave address = 53 and not 0x53. Verify.
            i2c_write_uint16(0x53, combine_3_P.Constant1_Value);
          }
    
          /* S-Function Block: <Root>/I2C Transmit2 (c280xi2c_tx) */
          {
            //TODO: Was using slave address = 68 and not 0x68. Verify.
            i2c_write_uint16(0x68, combine_3_P.Constant5_Value);
          }
    
          /* S-Function Block: <Root>/I2C Transmit3 (c280xi2c_tx) */
          {
            //TODO: Was using slave address = 1 and not 0x1E. Verify.
            i2c_write_uint16(0x1E, combine_3_P.Constant7_Value);
          }
        }
      }
    }
    
    /* Model initialize function */
    void combine_3_initialize(boolean_T firstTime)
    {
      (void)firstTime;
    
      /* Registration code */
    
      /* initialize non-finites */
      rt_InitInfAndNaN(sizeof(real_T));
    
      /* initialize error status */
      rtmSetErrorStatus(combine_3_M, (NULL));
    
      /* block I/O */
      (void) memset(((void *) &combine_3_B),0,
                    sizeof(BlockIO_combine_3));
    
      /* exported global signals */
      Rcv = 0;
    
      /* external inputs */
      (void) memset(fgyro,0,
                    3*sizeof(real_T));
      (void) memset(facc,0,
                    3*sizeof(real_T));
      (void) memset(fmag,0,
                    3*sizeof(real_T));
    
      /* Start for S-Function (c28xsci_rx): '<Root>/SCI Receive' */
    
      /* Initialize Rcv */
      Rcv = 27;
    
      {
        {
          /* user code (Initialize function Header) */
          /* System '<Root>' */
          int i, j, k;
          for (i=0; i<10000; i++)
            for (j=0; j<1000; j++)
              k = i + j;
    
          /* user code (Initialize function Trailer) */
          /* System '<Root>' */
          counter = 0;
    
          gyro_init();
          acc_init();
          mag_init();
        }
      }
    }
    
    /* Model terminate function */
    void combine_3_terminate(void)
    {
      /* (no terminate code required) */
    }
    
    /*
     * File trailer for Real-Time Workshop generated code.
     *
     * [EOF]
     */