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.

problem with I2C multiple device

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.