AnsweredAssumed Answered

K60 I2C Multiread

Question asked by Dao Yan Lim on Jun 27, 2016
Latest reply on Jun 28, 2016 by Dao Yan Lim

I'm using the TWR-K60N512, with PK60DN512Z VMD10 chip to read an IMU: Pololu - MinIMU-9 Gyro, Accelerometer, and Compass (L3G4200D and LSM303DLM Carrier)  via I2C.

 

I am able to perform single read operation with the example I2C driver for kinetis. I'm trying to take the advantage of the address auto-incrementing feature of the sensor, but I can't seem do a multiread operation. I based my code from these two sources: https://community.nxp.com/thread/337809#465606 , and this very useful application note http://cache.nxp.com/files/sensors/doc/app_note/AN4481.pdf,  though I think it has errors too.

 

Here's my modification of the example code:

 

void LSM303DLM_A_MultiReadRegister(unsigned char u8RegisterAddress, int buffer, unsigned char *result)

{

  int i = buffer, j;

 

  /* Send Slave Address */ //SAD + W

  IIC_StartTransmission(SlaveID_A,MWSR);

  i2c_Wait(); // SAK

 

  /* Write Register Address */ //SUB

  I2C0_D = u8RegisterAddress;

  i2c_Wait(); // SAK

 

  /* Do a repeated start */ // SR

  I2C0_C1 |= I2C_C1_RSTA_MASK;

 

  /* Send Slave Address */ //SAD + R

  I2C0_D = (ACCEL_ADDRESS << 1) | 0x01; //read address

  i2c_Wait(); // SAK

 

  /* Put in Rx Mode */

  I2C0_C1 &= (~I2C_C1_TX_MASK);

  //I2C0_C1 |= I2C_C1_TXAK_MASK; // Commented this out

// dummy read

  *result = I2C0_D ;

  for (j=0; j<5000; j++){};

  i2c_Wait();

 

/************ MODIFICATION BEGINS HERE, EVERYTHING ELSE IS SAME AS EXAMPLE CODE *********/

  while(buffer > 2)

  {

   *result = I2C0_D ;

   i2c_Wait();

      result++;

   buffer--;

   Pause();

  }

 

  I2C0_C1 |= I2C_C1_TXAK_MASK;

  *result = I2C0_D ;

  i2c_Wait();

  result++;

  i2c_Stop();

  *(result) = I2C0_D ;

  Pause();

}

 

It returns random values for the first accelerometer measurement and constants for the remaining measurements. Did I get the sequence wrong somewhere?

 

Thanks.

Outcomes