cancel
Showing results for 
Search instead for 
Did you mean: 

Getting wrong axies from my accelormeter

galcohen92
Associate II
Posted on February 25, 2016 at 10:36

Hello everyone,

I have trying to reading axies from my accelerometer and I keep getting 0 from my X Y Z axies at movement.

Have someone encounter this problem?

My code:

void writeTo(u8 addressToWrite,uint8_t value, u8 address)

{

  I2C_start(I2C3, address, I2C_Direction_Transmitter);

  I2C_write(I2C3,addressToWrite);

  I2C_write(I2C3,value);

  I2C_stop(I2C3);

}

 

void setup()

{

writeTo(DATA_FORMAT, 0x0B, WRITE_ADDRESS_1);

writeTo(POWER_CTL, 0x08, WRITE_ADDRESS_1);

writeTo(INT_ENABLE, 0x80, WRITE_ADDRESS_1);

}

 

void ReadOperation(uint8_t address)

{

  I2C_start(I2C3, WRITE_ADDRESS_1 , I2C_Direction_Transmitter);

  I2C_write(I2C3,address);

  I2C_stop(I2C3);

}

void ReadFromAccel()

{

ReadOperation(DATAX);

I2C_start(I2C3,READ_ADDRESS_1 , I2C_Direction_Receiver);  //Normal Reading and then offset

Accel_Param.X_1 = I2C_read_nack(I2C3);

Delay(0xFFFFa);

ReadOperation(DATAY);

I2C_start(I2C3,READ_ADDRESS_1 , I2C_Direction_Receiver);  //Normal Reading and then offset

Accel_Param.Y_1 = I2C_read_nack(I2C3);

Delay(0xFFFFa);

ReadOperation(DATAZ);

I2C_start(I2C3,READ_ADDRESS_1 , I2C_Direction_Receiver);  //Normal Reading and then offset

Accel_Param.Z_1 = I2C_read_nack(I2C3);

Delay(0xFFFFa);

}

//void ReadFromAccel() //Try to read all the axies together

//{

// ReadOperation(DATAX);

// I2C_start(I2C3,READ_ADDRESS_1 , I2C_Direction_Receiver);  //Normal Reading and then offset

// Accel_Param.X_1 = I2C_read_ack(I2C3);

// Accel_Param.Y_1 = I2C_read_ack(I2C3);

// Accel_Param.Z_1 = I2C_read_nack(I2C3);

// Delay(0xFFFFa);

//}

void ResetAccel()

{

int i;

  inti_RCC();

  init_I2C3();

GLB_DelayUs(1100); //need delay of 1.1 ms

  setup(); 

      

GLB_DelayUs(11000); //need delay of 11.1 ms

for(i =0; i< 100; i++) //For noise

{

ReadFromAccel();

}

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

{

ReadFromAccel();

}

}

 

void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction)

{

 // wait until I2C3 is not busy anymore

while(I2C_GetFlagStatus(I2C3, I2C_FLAG_BUSY));

   

   // Send I2C3 START condition

    I2C_GenerateSTART(I2C3, ENABLE);     

     

    // wait for I2C3 EV5 --> Slave has acknowledged start condition

    while(!I2C_CheckEvent(I2C3, I2C_EVENT_MASTER_MODE_SELECT));

 

    // Send slave Address for write

    I2C_Send7bitAddress(I2C3, address, direction);

        if(direction == I2C_Direction_Transmitter){

        while(!I2C_CheckEvent(I2C3, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); 

    }

    else if(direction == I2C_Direction_Receiver){

       while(!I2C_CheckEvent(I2C3, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

    }

}

 

 

void I2C_write(I2C_TypeDef* I2Cx, uint8_t data)

{

    I2C_SendData(I2C3, data);

         

    // wait for I2C3 EV8_2 --> byte has been transmitted

    while(!I2C_CheckEvent(I2C3, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

}

 

void I2C_stop(I2C_TypeDef* I2Cx)

{

    // Send I2C3 STOP Condition

    I2C_GenerateSTOP(I2C3, ENABLE);

        while(!I2C_CheckEvent(I2C3, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); 

}

// read one byte and don't request another byte, stop transmission

uint8_t I2C_read_nack(I2C_TypeDef* I2Cx){

uint8_t data;

    // disable acknowledge of received data

    // nack also generates stop condition after last byte received

    I2C_AcknowledgeConfig(I2Cx, DISABLE);

    I2C_GenerateSTOP(I2C3, ENABLE); 

    // wait until one byte has been received

    while( !I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED) );

    // read data from I2C data register and return data byte

    data = I2C_ReceiveData(I2Cx);

    return data;

}
1 REPLY 1
galcohen92
Associate II
Posted on February 25, 2016 at 14:11

Its work now.

I have called the registers of the ofset instead of the DATA.