k40上的IIC接口低速加速度传感器实验
0赞手里有个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轴,效果如下:
把板子立起来,数值到X轴上了,如下图: