MXC400xXC热式加速度传感器驱动

本文介绍了MXC400xXC单片和WLP三轴加速度计的IIC接口使用,包括初始化IIC、写从机寄存器、读从机寄存器的驱动函数示例,以及如何读取加速度和温度数据,以及中断和低功耗模式的操作方法。
摘要由CSDN通过智能技术生成

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);//清中断
}

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值