AnsweredAssumed Answered

FRDM-xxxx I2C Accelerometer question

Question asked by Tom Burke on Jun 18, 2014
Latest reply on Jun 24, 2014 by Adrian Cano

Hey all,


    I am trying to learn my way through the FRDM-KE02Z board using Kinetis Design Studio.


     For this set of experiments, I am trying to communicate (I2C) with the on-board accelerometer (MMA8451Q).


     Currently, I am trying to debug through consoleIO using printf, and this bit seems to work fine.


     However, it would appear that I am doing something horribly wrong in the way I am trying to communicate with the I2C module...


     Since I'm using the processor expert "beans," I guess I need to supply some background, so here goes:

~~~~~~~  CPU settings  ~~~~~~~~~~~

CPU type: MKE02Z64VLH2 (yes, I know this is incorrect, but KDS won't let me select the VQH2 option)

Interrupts enabled

watchdog disabled

clock: 10MHz external crystal 


Internal peripherals:

NMI disabled

Reset pin enabled

Flash config field disabled

MCM setting not selected

LVD module not selected

Clock Gating not selected


All CPU interrupts/resets disabled

Low power settings not selected

Clock config : ~16.8MHz bus/core clock



I have added also an internal I2C component (named Accelerometer)

This component uses I2C0 in Master mode, with an internal freq of ~4.2MHz

frequency divider bits give an SCL freq of ~95kHz with an SDA hold time of ~2.6us


I have tried using this component both with, and without the Interrupt service event enabled.


The device is set up for 7-bit addressing and high speed mode.



~~~~~~~~~  Code  (Major comments removed)~~~~~~~~~~~~~~


/* MODULE main */



/* Including needed modules to compile this module/procedure */

#include "Cpu.h"

#include "Events.h"

#include "CsIO.h"

#include "IO1.h"

#include "Accelerometer.h"

#include "IntI2cLdd1.h"

/* Including shared modules, which are used for whole project */

#include "PE_Types.h"

#include "PE_Error.h"

#include "PE_Const.h"

#include "IO_Map.h"

/* User includes (#include below this line is not maintained by Processor Expert) */

#include <stdio.h>


/*lint -save  -e970 Disable MISRA rule (6.3) checking. */

int main(void)

/*lint -restore Enable MISRA rule (6.3) checking. */


  /* Write your local variable definition here */

    char            AData[7] = {0,1,2,3,4,5,6};    //    Funny initialization for troubleshooting

    unsigned short    status = 0x55;

    short            xG = 0;

    short            yG = 0;

    short            zG = 0;

    word            bytes = 0;

    int                error = 58;


  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/


  /*** End of Processor Expert internal initialization.                    ***/


  /* Write your code here */

   error = Accelerometer_Enable();            //    enable the accelerometer

  printf("Err:%3d \r\n", error);


  error = Accelerometer_SelectSlave(0x1D);    //    accelerometer address is 0x1D

  printf("Err:%3d \r\n", error);


  error = Accelerometer_SendChar(0x40);        //    reset the accelerometer

  printf("Err:%3d \r\n", error);


      error = Accelerometer_SendChar(0x00);                    //    Send start address

      printf("Err:%3d \r\n", error);


      error = Accelerometer_RecvBlock(AData, 7, &bytes);    //    read back 7 bytes

      printf("Err:%3d \r\n", error);


      error = Accelerometer_RecvChar(&bytes);

      printf("Err:%3d \r\n", error);


      status = AData[0];

//      xG = (AData[1]<<8) + AData[2];

//      yG = (AData[3]<<8) + AData[4];

//      zG = (AData[5]<<8) + AData[6];

      xG = AData[1];

      yG = AData[3];

      zG = AData[5];


      printf("Err:%3d BytesRX:%3d Status:%3d X:%6d Y:%6d Z:%6d\r\n", error, bytes, status, xG, yG, zG);



  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/

  /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/


    PEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */


  /*** End of RTOS startup code.  ***/

  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/


  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/

} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/


~~~~~~~~~~~~~~~~~~~  END CODE  ~~~~~~~~~~~~~~~~~~~~~~


Running this results in the following output:

Err:  0

Err:  7

Err:  7

Err:  7

Err:  7

Err:  7

Err:  7 BytesRX:  0 Status:  0 X:     1 Y:     3 Z:     5


Error 7 seems to be "ERR_DISABLED"  ???


Yesterday evening, I also saw a an error 12 "ERR_BUSOFF" ??


Any clues?  Help, please?  Probably something simple I'm missing, but I'd sure like to get it sorted out.


Thanks in advance,