freetech

k40上的IIC接口低速加速度传感器实验

0
阅读(2197)

手里有个k40的板子放的都落土了,今天拿出来跑俩程序吧,别闲着它。

三轴加速度传感器可以识别三个坐标轴上加速度的大小,很多时候我们用于识别重力加速度,所以有时称之为重力传感器。通过重力加速度方向来判断物体的方向,通过各轴加速度的变化判断物体的振动……可以您的设计感知物体运动状态。

下面看下程序:

void main (void)
{
  signed char resultx, resulty, resultz;

  printf("Kinetis I2C Demo\n");

  //Initialize I2C
  init_I2C();

  //Configure MMA7660 sensor
  MMA7660WriteRegister(0x09,0xE0); //Disable tap detection
  MMA7660WriteRegister(0x07,0x19); //Enable auto-sleep, auto-wake, and put in active mode

  printf("  X     Y     Z\n");

  while(1)
  {
    //Read x-axis register
    resultx = u8MMA7660ReadRegister(0x00);
    printf("%3d", convert(resultx));

    //Read y-axis register
    resulty = u8MMA7660ReadRegister(0x01);
    printf("   %3d", convert(resulty));

    //Read z-axis register
    resultz = u8MMA7660ReadRegister(0x02);
    printf("   %3d\n", convert(resultz));

    //Delay for 250ms
    time_delay_ms(250);
  }

}

//下面是I2C.c的代码:

/*
* File:        k40_i2c.c
* Purpose:     Code for initializing and using I2C
*
* Notes:
*
*/

//#include "common.h"
#include <MK10N512VMD100.h>
#include "k40_i2c.h"

unsigned char MasterTransmission;
unsigned char SlaveID;

/*******************************************************************/
/*!
* I2C Initialization
* Set Baud Rate and turn on I2C
*/
void init_I2C(void)
{
    SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK; //Turn on clock to I2C1 module

    /* Configure GPIO for I2C1 function */
    PORTC_PCR11 = PORT_PCR_MUX(2);
    PORTC_PCR10 = PORT_PCR_MUX(2);

    I2C1_F  = 0x14;       /* set MULT and ICR */

    I2C1_C1 = I2C_C1_IICEN_MASK;       /* enable IIC */
}

/*******************************************************************/
/*!
* Pause Routine
*/
void Pause(void){
    int n;
    for(n=1;n<50;n++) {
      asm("nop");
    }
}

/*******************************************************************/
/*!
* Start I2C Transmision
* @param SlaveID is the 7 bit Slave Address
* @param Mode sets Read or Write Mode
*/
void IIC_StartTransmission (unsigned char SlaveID, unsigned char Mode)
{
  if(Mode == MWSR)
  {
    /* set transmission mode */
    MasterTransmission = MWSR;
  }
  else
  {
    /* set transmission mode */
    MasterTransmission = MRSW;
  }

  /* shift ID in right possition */
  SlaveID = (unsigned char) MMA7660_I2C_ADDRESS << 1;

  /* Set R/W bit at end of Slave Address */
  SlaveID |= (unsigned char)MasterTransmission;

  /* send start signal */
  i2c_Start();

  /* send ID with W/R bit */
  i2c_write_byte(SlaveID);
}

/*******************************************************************/
/*!
* Read a register from the MMA7660
* @param u8RegisterAddress is Register Address
* @return Data stored in Register
*/
unsigned char u8MMA7660ReadRegister(unsigned char u8RegisterAddress)
{
  unsigned char result;

  /* Send Slave Address */
  IIC_StartTransmission(SlaveID,MWSR);
  i2c_Wait();

  /* Write Register Address */
  I2C1_D = u8RegisterAddress;
  i2c_Wait();

  /* Do a repeated start */
  I2C1_C1 |= I2C_C1_RSTA_MASK;

  /* Send Slave Address */
  I2C1_D = (MMA7660_I2C_ADDRESS << 1) | 0x01; //read address
  i2c_Wait();

  /* Put in Rx Mode */
  I2C1_C1 &= (~I2C_C1_TX_MASK);

  /* Turn off ACK */
  I2C1_C1 |= I2C_C1_TXAK_MASK;

  /* Dummy read */
  result = I2C1_D ;
  i2c_Wait();

  /* Send stop */
  i2c_Stop();
  result = I2C1_D ;
  return result;
}

/*******************************************************************/
/*!
* Read first three registers from the MMA7660
* @param u8RegisterAddress is Register Address
* @return Data stored in Register
*/
unsigned char u8MMA7660ReadThreeRegisters(unsigned char u8RegisterAddress)
{
  unsigned char result1, result2, result3;

  /* Send Slave Address */
  IIC_StartTransmission(SlaveID,MWSR);
  i2c_Wait();

  /* Write Register Address */
  I2C1_D = u8RegisterAddress;
  i2c_Wait();

  /* Do a repeated start */
  I2C1_C1 |= I2C_C1_RSTA_MASK;

  /* Send Slave Address */
  I2C1_D = (MMA7660_I2C_ADDRESS << 1) | 0x01; //read address
  i2c_Wait();

  /* Put in Rx Mode */
  I2C1_C1 &= (~I2C_C1_TX_MASK);

  /* Ensure TXAK bit is 0 */
  I2C1_C1 &= ~I2C_C1_TXAK_MASK;

  /* Dummy read */
  result1 = I2C1_D ;
  i2c_Wait();

  /* Read first byte */
  result1 = I2C1_D;
  i2c_Wait();

  /* Turn off ACK since this is second to last read*/
  I2C1_C1 |= I2C_C1_TXAK_MASK;

  /* Read second byte */
  result2 = I2C1_D;
  i2c_Wait();

  /* Send stop */
  i2c_Stop();

  /* Read third byte */
  result3 = I2C1_D;

  printf("%3d    %3d     %3d\n",result1,result2,result3);
  return result1;
}

/*******************************************************************/
/*!
* Write a byte of Data to the MMA7660
* @param u8RegisterAddress is Register Address
* @param u8Data is Data to write
*/
void MMA7660WriteRegister(unsigned char u8RegisterAddress, unsigned char u8Data)
{
  /* send data to slave */
  IIC_StartTransmission(SlaveID,MWSR);
  i2c_Wait();

  /* Send I2C address */
  I2C1_D = u8RegisterAddress;
  i2c_Wait();

  /* Send data */
  I2C1_D = u8Data;
  i2c_Wait();

  i2c_Stop();

  Pause();
}

板子平放时重力在Z轴,效果如下:

image

把板子立起来,数值到X轴上了,如下图:

image