1
0
forked from me/IronOS
Files
IronOS/S100App/Src/MMA8652FC.c
2016-04-30 20:56:50 +05:00

269 lines
8.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
File Name : MMA8652FC.c
Version : S100 APP Ver 2.11
Description:
Author : Celery
Data: 2015/07/07
History:
2015/07/07 统一命名;
*******************************************************************************/
#include <stdio.h>
#include <string.h>
#include "APP_Version.h"
#include "Bios.h"
#include "Oled.h"
#include "MMA8652FC.h"
#include "I2C.h"
#include "CTRL.h"
#include "UI.h"
//------------------------------------------------------------------//
static int IIC_RegWrite(u8 reg,u8 data);
static int IIC_RegRead(u8 reg);
static int Read_ZYXDr(void);
u16 gactive = 0,gShift = 0;
u8 gMmatxdata;
typedef struct {
u8 hi;
u8 lo;
} DRByte;
typedef struct {
DRByte Byte;
} DR_Value;
DR_Value gX_value,gY_value,gZ_value;
/*******************************************************************************
函数名: Get_MmaActive
函数作用:获取加速度传感器静动状态
输入参数:NULL
返回参数:加速度传感器状态
*******************************************************************************/
u16 Get_MmaActive(void)
{
return gactive;
}
/*******************************************************************************
函数名: Get_MmaActive
函数作用:XXXXXXXXXXXXXXXXXXXXXX
输入参数:XXXXXXXXXXXXXXXXXXXXXX
返回参数:XXXXXXXXXXXXXXXXXXXXXX
*******************************************************************************/
u16 Get_MmaShift(void)
{
return gShift;
}
/*******************************************************************************
函数名: Get_MmaActive
函数作用:XXXXXXXXXXXXXXXXXXXXXX
输入参数:XXXXXXXXXXXXXXXXXXXXXX
返回参数:XXXXXXXXXXXXXXXXXXXXXX
*******************************************************************************/
void Set_MmaShift(u16 shift)
{
gShift = shift;
}
/*******************************************************************************
函数名: IIC_RegWrite
函数作用:向Reg地址写入Data
输入参数:Reg 设置中的地址Data数据
返回参数: 成功;
*******************************************************************************/
int IIC_RegWrite(u8 reg,u8 data)
{
u8 tx_data[20];
tx_data[0]=reg;
tx_data[1]=data;
I2C_PageWrite(tx_data,2,DEVICE_ADDR);
return 1;
}
/*******************************************************************************
函数名: IIC_RegRead
函数作用:从设置Reg处读出数据
输入参数:Reg 设置中的地址存入gMmatxdata中
返回参数: 成功;
*******************************************************************************/
int IIC_RegRead(u8 reg)
{
u8 tx_data[20];
tx_data[0] = reg;
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
gMmatxdata = tx_data[0];
return 1;
}
/*******************************************************************************
函数名: MMA865x_Standby
函数作用:进入待机状态
输入参数:NULL
返回参数:NULL
*******************************************************************************/
void MMA865x_Standby(void)
{
//Put the sensor into Standby Mode by clearing
// the Active bit of the System Control 1 Register
IIC_RegWrite(CTRL_REG1, 0); //(IIC_RegRead(CTRL_REG1) & ~ ACTIVE_MASK)
}
/*******************************************************************************
函数名: MMA865x_Active
函数作用:启动测量模式
输入参数:NULL
返回参数:NULL
*******************************************************************************/
void MMA865x_Active(void)
{
// Put the sensor into Active Mode by setting the
// Active bit of the System Control 1 Register
IIC_RegWrite(CTRL_REG1,ACTIVE_MASK );//(IIC_RegRead(CTRL_REG1) | ACTIVE_MASK)
}
/*******************************************************************************
函数名: IIC_RegRead
函数作用:从设置Reg处读出数据
输入参数:NULL
返回参数:NULL
*******************************************************************************/
void StartUp_Accelerated(void)
{
//------进入待机状态-----------------------//
MMA865x_Standby();
//---- 设置测量范围4g----------------------//
IIC_RegWrite(XYZ_DATA_CFG_REG,FULL_SCALE_8G );//(IIC_RegRead(XYZ_DATA_CFG_REG) & ~FS_MASK)
//--- 设置正常操作时数据速率100HZ------------------------------------//
IIC_RegWrite(CTRL_REG1, DataRateValue); //IIC_RegRead(CTRL_REG1)|
//----设置采样工作模式------------------------------------------------------//
IIC_RegWrite(CTRL_REG2, 0);//(IIC_RegRead(CTRL_REG2) & ~MODS_MASK)
//---------启动测量模式------------------------------------//
MMA865x_Active();
}
/*******************************************************************************
函数名: Read_ZYXDr
函数作用:读取XYZ方向
输入参数:NULL
返回参数:x,y,z的方向
*******************************************************************************/
int Read_ZYXDr(void)
{
u8 reg_flag;
u8 ptr,i;
u8 value[6];
memset((u8*)&gX_value,0,6);
//Poll the ZYXDR status bit and wait for it to set
if(IIC_RegRead(STATUS_REG)) {
reg_flag = gMmatxdata ;
if((reg_flag & ZYXDR_BIT) !=0) {
//Read 12/10-bit XYZ results using a 6 byte IIC access
ptr=X_MSB_REG;
for(i=0; i<6; i++) {
if(IIC_RegRead(ptr++)==0)break;
value[i]=gMmatxdata ;
//Copy and save each result as a 16-bit left-justified value
gX_value.Byte.hi = value[0];
gX_value.Byte.lo = value[1];
gY_value.Byte.hi = value[2];
gY_value.Byte.lo = value[3];
gZ_value.Byte.hi = value[4];
gZ_value.Byte.lo = value[5];
return 1;
}
} else
return 0;
}
return 0;
}
/*******************************************************************************
函数名: Cheak_XYData
函数作用:检查xy的方向变化
输入参数:前一xy跟现在xy坐标对比
返回参数:是否移动
*******************************************************************************/
u16 Cheak_XYData(u16 x0,u16 y0,u16 x1,u16 y1)
{
u16 active = 0;
gShift = 0;
if((x1 > (x0 + 16)) || (x1 < (x0 - 16))) active = 1;
if((y1 > (y0 + 16)) || (y1 < (y0 - 16))) active = 1;
if((x1 > (x0 + 32)) || (x1 < (x0 - 32))) gShift = 1;
if((y1 > (y0 + 32)) || (y1 < (y0 - 32))) gShift = 1;
return active;
}
/*******************************************************************************
函数名: Update_X
函数作用:更新数据
输入参数:返回x
返回参数:NULL
*******************************************************************************/
u16 Update_X(void)
{
u16 value,x;
value = ((gX_value.Byte.hi<<8) | (gX_value.Byte.lo & 0xf0 ))>>4;
if(gX_value.Byte.hi>0x7f) x = (~value+1) & 0xfff;
else x = value & 0xfff;
return x;
}
/*******************************************************************************
函数名: Update_Y
函数作用:更新数据
输入参数:NULL
返回参数:返回y
*******************************************************************************/
u16 Update_Y(void)
{
u16 value,y;
value = ((gY_value.Byte.hi<<8) | (gY_value.Byte.lo & 0xf0 ))>>4;
if(gY_value.Byte.hi>0x7f) y = (~value+1) & 0xfff;
else y = value & 0xfff;
return y;
}
/*******************************************************************************
函数名: Update_z
函数作用:更新数据
输入参数:NULL
返回参数:返回z
*******************************************************************************/
u16 Update_Z(void)
{
u16 value,z;
value = ((gZ_value.Byte.hi<<8) | (gZ_value.Byte.lo & 0xf0 ))>>4;
if(gZ_value.Byte.hi>0x7f) z = (~value+1) & 0xfff;
else z = value & 0xfff;
return z;
}
/*******************************************************************************
函数名: Check_Accelerated
函数作用:检查加速度传感器是否移动
输入参数:NULL
返回参数:NULL
*******************************************************************************/
void Check_Accelerated(void)
{
static u16 x0 = 0,y0 = 0;
u16 x1,y1;
if(Read_ZYXDr()) { /*读数据,更新数据*/
x1 = Update_X();
y1 = Update_Y();
} else x1 = x0;
y1 = y0;
gactive = Cheak_XYData(x0,y0,x1,y1);/*检查是否移动*/
x0 = x1;
y0 = y1;
}
/******************************** END OF FILE *********************************/