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.