MXC400xXC 概要
MXC400xXC是世界上唯一的单片和WLP三轴加速度计。
-
12位信号输出为X、Y和Z轴加速度范围±2g,±4g和±8g
-
8-位温度输出(-50°C到+100°C)
-
基于热对流原理的加速度传感器
MXC400xXC 采用IIC快速(≤400KHz)模式接口
时序
#从机地址
MXC400xXC 的从机地址有具体型号决定,本身没有可配置的引脚。
IIC基本驱动函数
根据不同平台实现一下三个基础的驱动函数后即可对传感器进行操作。
- 初始化主机IIC
Void mi2c_init(void);
- IIC写从机寄存器
int32_t mi2c_writereg(uint8_t slave_addr,uint8_t RegAddr,uint8_t* data,uint8_t len)
- IIC读从机寄存器
int32_t mi2c_readreg(uint8_t slave_addr,uint8_t regAddr,uint8_t* data,uint8 len)
测试代码
drv_mxc400xxx.c
#include "drv_mxc400xxx.h"
#include "hardware_i2c.h"
/*
初始化iic驱动
*/
void mxc400xxx_iic_init(void)
{
if( mi2c_initialized() ==false)
{
mi2c_init();
}
}
/*
函数功能:
往传感器指定寄存器写入一个字节
参数:
@reg_add 传感器寄存器地址
@reg_dat 待写入值
返回值:
写入是否成功 0成功
*/
int32_t mxc400xxx_writereg(uint8_t reg_add, uint8_t reg_dat)
{
uint8_t wdata= reg_dat;
return mi2c_writereg(0x15,reg_add,&wdata,1);
}
/*
函数功能:
读传感器指定寄存器值
参数:
@reg_add 传感器寄存器地址
@buf 读出数据缓存地址
@num 需要读出数据的长度
返回值:
写入是否成功 0成功
*/
int32_t mxc400xxx_readreg(uint8_t reg_add, uint8_t *buf, uint16_t num)
{
return mi2c_readreg(0x15, reg_add, buf, num);
}
/*
函数功能:
读传感器X Y Z三轴加速度原始值
参数:
@x,y,z 读回数据缓存空间的指针
返回值:
写入是否成功 0成功
*/
int32_t read_mxc400_rawacc(int16_t *x,int16_t *y,int16_t *z)
{
uint8_t rawdata8[6]={0};
int ret=0;
uint8_t sensty=0;
ret=mxc400xxx_readreg(0x0d, &sensty, 1);
if(ret!=0)
return -1;
for(uint8_t i=0;i<6;i++)
{
ret=mxc400xxx_readreg(0x03+i, &rawdata8[i], 1);
if(ret!=0)
return -1;
LOG("[0x03+%d]=%02X ",i,rawdata8[i]);
}
*x=(int16_t)(rawdata8[0]<<8|rawdata8[1]) >>4;
*y=(int16_t)(rawdata8[2]<<8|rawdata8[3]) >>4;
*z=(int16_t)(rawdata8[4]<<8|rawdata8[5]) >>4;
//转换为加速度
//添加代码
return 0;
}
/*
函数功能:
读传感温度单位值0.1摄氏度
参数:
@t 读回数据缓存空间的指针
返回值:
写入是否成功 0成功
*/
int32_t read_mxc400_temp(int16_t *t)
{
uint8_t raw_data=0;
int ret=mxc400xxx_readreg(0x09, &raw_data, 1);
if(ret!=0)
return -1;
int32_t tem=0;
tem= (int8_t)raw_data;
tem= tem*586+25000;
*t= (int16_t)(tem/100);//保留一位小数即可
return 0;
}
drv_mxc400xxx.h
#ifndef __MXC00XXX_H
#define __MXC00XXX_H
\#include "types.h"
void mxc400xxx_iic_init(void);
int32_t mxc400xxx_writereg(uint8_t reg_add, uint8_t reg_dat);
int32_t mxc400xxx_readreg(uint8_t reg_add, uint8_t *buf, uint16_t num);
int32_t read_mxc400_rawacc(int16_t *x,int16_t *y,int16_t *z);
int32_t read_mxc400_temp(int16_t *t);
#endif
低功耗
ret=mxc400xxx_readreg(0x0d, &data,1);
ret=mxc400xxx_writereg(0x0d, data|0x01);
使用INT输出震动
传感器有一个INT脚中断输出。该引脚上的逻辑级别反映了状态寄存器中的INT位的状态。当方向与处理器读取的最后一个方向不同或检测到X/Y抖动事件时,设置INT。INT需要被拉到VIO。INT输出活动低,在I2 C主服务器写入寄存器INT_CLRx 1时清除。请参阅“MXC400xXC用户寄存器”一节中对用户寄存器0x01的描述。
设置中断掩码
ret=mxc400xxx_writereg(0x0a, 0x0F);
ret=mxc400xxx_writereg(0x0b, 0x00);
状态寄存器
或者通过读取状态寄存器也能判断是否产生了抖动等事件
ret=mxc400xxx_readreg(0x00, &src_temp,1);
if(ret==0 && src_temp!=0)
{
RGBLedCtrl(RGB_BLUE);//点亮蓝指示事件
WaitMs(50);
RGBLedCtrl(RGB_CLOSE);//
ret=mxc400xxx_writereg(0x00, src_temp);//清中断
}