基于GR551x芯片的硬件IIC驱动QMA7981
基于GR551x芯片的硬件IIC驱动QMA7981
- 实现的函数
- qma7981_init();
- int16_t get_accel_x()
- int16_t get_accel_y()
- int16_t get_accel_z()
- sensor_interrupt_enter();
- QMA7981.H文件
- QMA7981.C文件
移植完成最基本的初始化配置和中断唤醒配置,以及原始数据读取。其他配置需要根据数据手册实现。
参考驱动的源码是基于Arduino来源是: [1]: 参考工程。
硬件连接如下:
实现的函数
qma7981_init();
void qma7981_init()
{sys_delay_ms(10);soft_reset(); //soft reset all of the registerssys_delay_ms(10); set_mode(MODE_ACTIVE); //bring out of sleep modeset_clock_freq(CLK_200_KHZ); //set digital clock freqset_bandwidth(MCLK_DIV_BY_975); //set bandwitch (samples per sec)set_full_scale_range(RANGE_16G); //set full scale acceleration range
}
int16_t get_accel_x()
int16_t get_accel_x(void)
{return read_accel_axis(0x01);
}
int16_t get_accel_y()
int16_t get_accel_y(void)
{return read_accel_axis(0x03);
}
int16_t get_accel_z()
int16_t get_accel_z(void)
{return read_accel_axis(0x05);
}
sensor_interrupt_enter();
void sensor_interrupt_enter (void) //传感器的中断唤醒配置
{// set bandwidth (samples per sec)// = CLK / DIV_BY = 50k / 975 = 50 samples / secset_clock_freq(CLK_5_KHZ); //set digital clock freqset_bandwidth(MCLK_DIV_BY_975); // set bandwitch (samples per sec)set_interrupt_pin_1_type(false, false); // set interrupt pin type and logic levelwrite_byte (0x18, 0x07); //选择中断轴write_byte (0x1a, 0x01); //设置中断脚输出;write_byte (0x2c, 0xF0); //设置中断采样计算个数write_byte (0x2e, 0x40); //设置中断阀值}
QMA7981.H文件
基本的宏定义参数
#define ADO 0 // I2C Address pin, 0 for low and 1 for high
#define QMA7981_ADDRESS_LEN 1
#if ADO == 1
#define I2C_ADDRESS 0x13 //0b0010011 Device address when ADO = 1
#else
#define I2C_ADDRESS 0x12 //0b0010010 Device address when ADO = 0
#endif/*qma7981 full scale range*/
#define RANGE_2G 0x01
#define RANGE_4G 0x02
#define RANGE_8G 0x04
#define RANGE_16G 0x08
#define RANGE_32G 0x0F
/*qma7981 bandwidth*/
#define MCLK_DIV_BY_7695 0x00
#define MCLK_DIV_BY_3855 0x01
#define MCLK_DIV_BY_1935 0x02
#define MCLK_DIV_BY_975 0x03
#define MCLK_DIV_BY_15375 0x05
#define MCLK_DIV_BY_30735 0x06
#define MCLK_DIV_BY_61455 0x07
/*qma7981 clock freq*/
#define CLK_500_KHZ 0x01
#define CLK_333_KHZ 0x00
#define CLK_200_KHZ 0x02
#define CLK_100_KHZ 0x03
#define CLK_50_KHZ 0x04
#define CLK_25_KHZ 0x05
#define CLK_12_KHZ_5 0x06
#define CLK_5_KHZ 0x07
/*qma7981 no motion duration*/
#define NO_MOTION_1_SEC 0x00
#define NO_MOTION_2_SEC 0x01
#define NO_MOTION_3_SEC 0x02
#define NO_MOTION_5_SEC 0x04
#define NO_MOTION_10_SEC 0x09
#define NO_MOTION_15_SEC 0x0E
#define NO_MOTION_30_SEC 0x12
#define NO_MOTION_1_MIN 0x18
#define NO_MOTION_2_MIN 0x22
#define NO_MOTION_3_MIN 0x28
#define NO_MOTION_4_MIN 0x2E /*qma7981 any motion samples*/
#define NUM_SAMPLES_1 0x00
#define NUM_SAMPLES_2 0x01
#define NUM_SAMPLES_3 0x02
#define NUM_SAMPLES_4 0x03
/*qma7981 mode*/
#define MODE_STANDBY 0x00
#define MODE_ACTIVE 0x01
/*qma7981 motion_detect*/
#define MOTION_DETECT_NOTHING 0x00
#define MOTION_DETECT_ANY_MOTION 0x01
#define MOTION_DETECT_NO_MOTION 0x02
QMA7981.C文件
基本的必须函数
static void register_read(uint8_t addr,uint8_t register_address, uint8_t number_of_bytes, uint8_t * destination)
{uint8_t wdata[1] = {0};wdata[0] = register_address;hal_i2c_master_transmit(&g_i2c_handle, addr, wdata, 1, 5000);hal_i2c_master_receive(&g_i2c_handle, addr, destination, number_of_bytes, 5000);
}int16_t read_accel_axis(uint8_t address_msb)
{uint8_t accel_axis_buf[2]; // Initialize the Return Valueregister_read(I2C_ADDRESS,address_msb,2,accel_axis_buf);int16_t data=(accel_axis_buf[0]&0xFC) | (accel_axis_buf[1]<< 8);data = data / 4; // divide the result by 4 to maintain the sign, since the data is 14 bitsreturn data;}static void write_byte(uint8_t address, uint8_t data)
{uint8_t wdata[QMA7981_ADDRESS_LEN+1] = {0}; // Initialize the Tx bufferwdata[0] = address; // Put slave register address in Tx bufferwdata[1] = data; // Put data in Tx bufferhal_i2c_master_transmit(&g_i2c_handle, I2C_ADDRESS, wdata, QMA7981_ADDRESS_LEN+1, 5000); // Send the Tx buffer
}static uint8_t read_byte(uint8_t address)
{uint8_t data =0; // Initialize the Return Valueuint8_t wdata[1] = {0}; // Initialize the Tx bufferwdata[0] = address; // Put slave register address in Tx bufferhal_i2c_master_transmit(&g_i2c_handle, I2C_ADDRESS, wdata, QMA7981_ADDRESS_LEN, 5000); // Send the Tx bufferhal_i2c_master_receive(&g_i2c_handle, I2C_ADDRESS, &data, QMA7981_ADDRESS_LEN, 5000); // Read one byte from slave register addressreturn data; // Return data read from slave register
}void set_bit(uint8_t *byte, uint8_t n, bool value)
{*byte = (*byte & ~(1UL << n)) | (value << n);
}void soft_reset()
{write_byte(0x36, 0xB6); //0xB6, soft reset all of the registers.write_byte(0x36, 0x00); //After soft-reset, user should write 0x00 back
}void set_mode(uint8_t mode)
{uint8_t data = read_byte(0x11);//1, set device into active mode 0, set device into standby modeset_bit(&data, 7, mode); write_byte(0x11, data);
}void set_clock_freq(uint8_t freq)
{uint8_t data = read_byte(0x11);data &= 0XF0; data |= (freq & 0x0F); write_byte(0x11, data);
}void set_bandwidth(uint8_t bandwidth)
{uint8_t data = 0xE0;data |= (bandwidth & 0x07);write_byte(0x10, data);
}void set_interrupt_pin_1_type(bool open_drain, bool active_high)
{uint8_t data = read_byte(0x20);set_bit(&data, 0, active_high);set_bit(&data, 1, open_drain);write_byte(0x20, data);
}void set_interrupt_pin_1_type(bool open_drain, bool active_high)
{uint8_t data = read_byte(0x20);set_bit(&data, 0, active_high);set_bit(&data, 1, open_drain);write_byte(0x20, data);
}
基于GR551x芯片的硬件IIC驱动QMA7981相关推荐
- 基于STM32F103RC硬件IIC驱动18位AD MCP3421驱动开发
基于STM32 HAL库硬件IIC 驱动18位AD MCP3421 最近用到小信号采集,发现关于该芯片的STM32 HAL 库驱动比较少.就写了一个基于STM32F103RCT6测试Demo .在此分 ...
- 基于Stm32f103硬件iic驱动LM75A温度传感器
这是LM75A温度传感器的概述,本文主要介绍基于Stm32f103的硬件iic驱动LM75A温度传感器. 这是我所使用的硬件电路,很简单. 对于该传感器的使用,主要是读取温度值,查看数据手册我们知道需 ...
- STM32 驱动 GY-302 光照传感器 BH1750 模块(软件IIC与硬件IIC驱动)
1.特别说明 要是不想看原理和过程,直接下拉找代码吧,都是测试过的,很稳定,有硬件I2C驱动的,也有软件模拟I2C驱动的,基于STM32F103系列和STM32F4系列实现,基于标准库实现,条理清 ...
- MSP430杂谈--AD7745硬件IIC驱动与模拟IIC驱动
和上一篇AD7793类似,项目中也涉及到利用AD7745读取电容值,来测环境湿度.编写了基于MSP430的AD7745的硬件IIC驱动和模拟IIC驱动,分享给大家. AD7745硬件IIC驱动完整版下 ...
- 【STM32】 硬件IIC 驱动SSD1302(0.96 OLED模块) -- 3/4 OLED的命令表 学习
书接上回 文章1:[STM32] 硬件IIC 驱动SSD1306(0.96 OLED模块) – 1/4 库函数 学习 文章2:[STM32] 硬件IIC 驱动SSD1302(0.96 OLED模块) ...
- 基于DRV8701芯片的全桥驱动电路
基于DRV8701芯片的全桥驱动电路 1. 驱动芯片和MOS选择 制作这个全桥驱动电路的最初目的是完成智能车声音信标组的比赛赛题.我和队友在十四届比赛中也参加了信标组,H车的重量和布局都对电路的设计提 ...
- 12. STM32——硬件IIC驱动OLED屏幕显示
STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...
- HC32F460开发之硬件IIC驱动AT24C64
文章目录 前言 一.AT24C64 二.驱动步骤 1.宏定义 2.代码实现 总结 前言 在嵌入式设计中,E2PROM存储芯片常被应用于需要掉电存储,且容量不大的场合.对比flash存储芯片,E2PRO ...
- STM32F103使用硬件IIC驱动SHT30温湿度传感器
文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...
最新文章
- 在visual studio 2010中调用ffmpeg
- ExpressQuantumGrid.Suite.v6.30 在Delphi 7中的安装 收藏
- Vue之通过代理设置跨域访问
- python时间差转换成天数_Python实现计算两个时间之间相差天数的方法
- flip java_java的flip(). 这里用flip()有什么作用?这是反转缓冲区的方法,好像用不上。...
- 关于jsp页面显示的时间格式和Oracle数据库中的格式不一样的问题
- Mybatis从入门到精通下篇
- 写日历的程序员,你必须弄懂的中国农历算法。
- framework2.0和1.1一样,怎么办
- java捕获子程序异常,防止异常与捕获Java中的异常
- 子网规划与组网实验_交换机四种组网方式,你都清楚吗
- 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(七)
- 关于蓝桥杯竞赛考试的一些信息~
- Kafka设计解析(一)- Kafka背景及架构介绍
- java 集合工具类_Java集合中Collections工具类总结
- Django中select_related的作用和用法
- 单电机板机模型,f22
- Linux centOS系统备份还原(dd+rsync方式)
- python表达爱意_程序员有哪些对女友表达爱意的奇招?
- 各版本Qt下载传送门