备份新仓库
This commit is contained in:
+5
-2
@@ -12,9 +12,12 @@
|
||||
|
||||
|
||||
//define eeprom addr
|
||||
#define AT24C256_ADDR 0xA0
|
||||
|
||||
#define AT24CXX_ADDR 0xA0
|
||||
|
||||
//defien senser addr
|
||||
#define MPU6500_ADDR 0x68
|
||||
#define QMC5883_ADDR 0x0D
|
||||
#define BMP280_ADDR 0xEC
|
||||
|
||||
|
||||
//define adc channels
|
||||
|
||||
+24
-98
@@ -7,117 +7,43 @@
|
||||
#include "at24cxx.h"
|
||||
|
||||
|
||||
void at24cxx_init()
|
||||
uint16_t at24xcc_read(AT24C_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len)
|
||||
{
|
||||
uint16_t state = 0;
|
||||
|
||||
state = ptr->read_drv(ptr->i2c, ptr->address, reg, data, len);
|
||||
|
||||
return state;
|
||||
}
|
||||
/*
|
||||
|
||||
uint8_t x24Cxx_ReadByte(uint16_t u16Addr)
|
||||
uint16_t at24xcc_write(AT24C_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len)
|
||||
{
|
||||
uint8_t u8Data = 0;
|
||||
IIC_Start();//起始信号
|
||||
IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+读/写选择
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)((u16Addr >> 8) & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)(u16Addr & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_Start();//起始信号
|
||||
IIC_WriteByte(DEV_ADDR | READ_CMD);//器件寻址+读
|
||||
IIC_WaitAck();//等待应答
|
||||
u8Data = IIC_ReadByte();
|
||||
IIC_NoAck();
|
||||
IIC_Stop();//停止信号
|
||||
return u8Data;
|
||||
uint16_t state = 0;
|
||||
|
||||
state = ptr->write_drv(ptr->i2c, ptr->address, reg, data, len);
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
|
||||
void at24cxx_WriteByte(uint16_t u16Addr, uint8_t u8Data)
|
||||
void at24cxx_init(AT24C_ptr ptr,I2C_ptr i2c,uint16_t address)
|
||||
{
|
||||
x24Cxx_WriteEnable();//使能写入
|
||||
IIC_Start();//起始信号
|
||||
IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+读/写选择
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)((u16Addr >> 8) & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)(u16Addr & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte(u8Data);
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_Stop();//停止信号
|
||||
x24Cxx_WriteDisble();//禁止写入
|
||||
}
|
||||
ptr->address = address;
|
||||
|
||||
ptr->i2c = i2c;
|
||||
|
||||
//Çý¶¯°ó¶¨
|
||||
ptr->read_drv = &i2c_read;
|
||||
ptr->write_drv = &i2c_write;
|
||||
|
||||
//¶Áд°ó¶¨
|
||||
ptr->read = &at24xcc_read;
|
||||
ptr->write = &at24xcc_write;
|
||||
|
||||
void x24Cxx_ReadPage(uint16_t u16Addr, uint8_t u8Len, uint8_t *pBuff)
|
||||
{
|
||||
uint8_t i;
|
||||
IIC_Start();//起始信号
|
||||
IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+读/写选择
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)((u16Addr >> 8) & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)(u16Addr & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_Start();//起始信号
|
||||
IIC_WriteByte(DEV_ADDR | READ_CMD);//器件寻址+读
|
||||
IIC_WaitAck();//等待应答
|
||||
if (u8Len > PAGE_SIZE)//长度大于页的长度
|
||||
{
|
||||
u8Len = PAGE_SIZE;
|
||||
}
|
||||
if ((u16Addr + (uint16_t)u8Len) > CAPACITY_SIZE)//超过容量
|
||||
{
|
||||
u8Len = (uint8_t)(CAPACITY_SIZE - u16Addr);
|
||||
}
|
||||
if (((u16Addr % PAGE_SIZE) + (uint16_t)u8Len) > PAGE_SIZE)//判断是否跨页
|
||||
{
|
||||
u8Len -= (uint8_t)((u16Addr + (uint16_t)u8Len) % PAGE_SIZE);//跨页,截掉跨页的部分
|
||||
}
|
||||
for (i = 0; i < (u8Len - 1); i++)
|
||||
{
|
||||
*(pBuff + i) = IIC_ReadByte();
|
||||
IIC_Ack();//主机应答
|
||||
}
|
||||
*(pBuff + u8Len - 1) = IIC_ReadByte();
|
||||
IIC_NoAck();//最后一个不应答
|
||||
IIC_Stop();//停止信号
|
||||
}
|
||||
|
||||
|
||||
void at24cxx_WritePage(uint16_t u16Addr, uint8_t u8Len, uint8_t *pData)
|
||||
{
|
||||
uint8_t i;
|
||||
x24Cxx_WriteEnable();//使能写入
|
||||
IIC_Start();//起始信号
|
||||
IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+读/写选择
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)((u16Addr >> 8) & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
IIC_WriteByte((uint8_t)(u16Addr & 0xFF));
|
||||
IIC_WaitAck();//等待应答
|
||||
if (u8Len > PAGE_SIZE)//长度大于页的长度
|
||||
{
|
||||
u8Len = PAGE_SIZE;
|
||||
}
|
||||
if ((u16Addr + (uint16_t)u8Len) > CAPACITY_SIZE)//超过容量
|
||||
{
|
||||
u8Len = (uint8_t)(CAPACITY_SIZE - u16Addr);
|
||||
}
|
||||
if (((u16Addr % PAGE_SIZE) + (uint16_t)u8Len) > PAGE_SIZE)//判断是否跨页
|
||||
{
|
||||
u8Len -= (uint8_t)((u16Addr + (uint16_t)u8Len) % PAGE_SIZE);//跨页,截掉跨页的部分
|
||||
}
|
||||
|
||||
for (i = 0; i < u8Len; i++)
|
||||
{
|
||||
IIC_WriteByte(*(pData + i));
|
||||
IIC_WaitAck();//等待应答
|
||||
}
|
||||
IIC_Stop();//停止信号
|
||||
x24Cxx_WriteDisble();//禁止写入
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -57,4 +57,29 @@
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct sAT24C {
|
||||
|
||||
I2C_ptr i2c;
|
||||
uint16_t address;
|
||||
//drivers
|
||||
uint16_t (*read_drv)(I2C_ptr ptr, uint16_t address, uint16_t reg, uint8_t *data, uint16_t len);
|
||||
uint16_t (*write_drv)(I2C_ptr ptr, uint16_t address, uint16_t reg, uint8_t *data, uint16_t len);
|
||||
|
||||
//global
|
||||
uint16_t (*read)(uint16_t reg, uint8_t *data, uint16_t len);
|
||||
uint16_t (*write)(uint16_t reg, uint8_t *data, uint16_t len);
|
||||
|
||||
}AT24C_t;
|
||||
|
||||
typedef AT24C_t* AT24C_ptr;
|
||||
|
||||
|
||||
void at24cxx_init(AT24C_ptr ptr,I2C_ptr i2c,uint16_t address);
|
||||
|
||||
uint16_t at24xcc_read(AT24C_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
uint16_t at24xcc_write(AT24C_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
|
||||
|
||||
#endif /* BSP_AT24CXX_H_ */
|
||||
|
||||
+114
@@ -5,4 +5,118 @@
|
||||
* Author: gxms0
|
||||
*/
|
||||
|
||||
#include "bmp280.h"
|
||||
|
||||
|
||||
#define BMP280_TEMP_ADDR 0xfa
|
||||
#define BMP280_PRESS_ADDR 0xf7
|
||||
|
||||
unsigned short dig_T1;
|
||||
short dig_T2;
|
||||
short dig_T3;
|
||||
unsigned short dig_P1;
|
||||
short dig_P2;
|
||||
short dig_P3;
|
||||
short dig_P4;
|
||||
short dig_P5;
|
||||
short dig_P6;
|
||||
short dig_P7;
|
||||
short dig_P8;
|
||||
short dig_P9;
|
||||
|
||||
|
||||
|
||||
void bmpxxx_init(BMP_ptr ptr,I2C_ptr i2c,uint16_t address)
|
||||
{
|
||||
ptr->address = address;
|
||||
|
||||
ptr->i2c = i2c;
|
||||
|
||||
ptr->read = &i2c_read;
|
||||
ptr->write = &i2c_write;
|
||||
|
||||
|
||||
//状态全部清零
|
||||
ptr->write(ptr->i2c, ptr->address, 0xe0, 0xb6, 1);
|
||||
|
||||
//读取ID的时候不知道为啥读不出来了,索性跳过去了
|
||||
// temp = bmp280_ReadByte(0xd0);
|
||||
// if(temp == 0x58)
|
||||
// Uart1SendStr("bmp280 id is right...\r\n");
|
||||
// else
|
||||
// Uart1SendStr("bmp280 id is error...\r\n");
|
||||
|
||||
ptr->write(ptr->i2c, ptr->address, 0xf4, 0xff, 1);
|
||||
ptr->write(ptr->i2c, ptr->address, 0xf5, 0x00, 1);
|
||||
|
||||
ptr->read(ptr->i2c, ptr->address, 0x88, &dig_T1, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x8A, &dig_T2, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x8C, &dig_T3, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x8E, &dig_P1, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x90, &dig_P2, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x92, &dig_P3, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x94, &dig_P4, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x96, &dig_P5, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x98, &dig_P6, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x9A, &dig_P7, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x9C, &dig_P8, 2);
|
||||
ptr->read(ptr->i2c, ptr->address, 0x9E, &dig_P9, 2);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// dig_T1 = 27504;
|
||||
// dig_T2 = 26435;
|
||||
// dig_T3 = -1000;
|
||||
// dig_P1 = 36477;
|
||||
// dig_P2 = -10685;
|
||||
// dig_P3 = 3024;
|
||||
// dig_P4 = 2855;
|
||||
// dig_P5 = 140;
|
||||
// dig_P6 = -7;
|
||||
// dig_P7 = 15500;
|
||||
// dig_P8 = -14600;
|
||||
// dig_P9 = 6000;
|
||||
// adc_T = 519888;
|
||||
// adc_P = 415148;
|
||||
|
||||
long bmp280_GetValue(void)
|
||||
{
|
||||
long adc_T;
|
||||
long adc_P;
|
||||
long var1, var2, t_fine, T, p;
|
||||
|
||||
adc_T = bmp280_MultipleReadThree(BMP280_TEMP_ADDR);
|
||||
adc_P = bmp280_MultipleReadThree(BMP280_PRESS_ADDR);
|
||||
|
||||
if(adc_P == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//Temperature
|
||||
var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2);
|
||||
var2 = ((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T)
|
||||
/131072.0-((double)dig_T1)/8192.0))*((double)dig_T3);
|
||||
|
||||
t_fine = (unsigned long)(var1+var2);
|
||||
|
||||
T = (var1+var2)/5120.0;
|
||||
|
||||
var1 = ((double)t_fine/2.0)-64000.0;
|
||||
var2 = var1*var1*((double)dig_P6)/32768.0;
|
||||
var2 = var2 +var1*((double)dig_P5)*2.0;
|
||||
var2 = (var2/4.0)+(((double)dig_P4)*65536.0);
|
||||
var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0;
|
||||
var1 = (1.0+var1/32768.0)*((double)dig_P1);
|
||||
p = 1048576.0-(double)adc_P;
|
||||
p = (p-(var2/4096.0))*6250.0/var1;
|
||||
var1 = ((double)dig_P9)*p*p/2147483648.0;
|
||||
var2 = p*((double)dig_P8)/32768.0;
|
||||
p = p+(var1+var2+((double)dig_P7))/16.0;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -10,4 +10,37 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include "ch32v20x.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "drv_i2c.h"
|
||||
|
||||
typedef struct sBMP {
|
||||
|
||||
I2C_ptr i2c;
|
||||
uint16_t address;
|
||||
|
||||
uint16_t (*read)(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len);
|
||||
uint16_t (*write)(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
}BMP_t;
|
||||
|
||||
typedef BMP_t* BMP_ptr;
|
||||
|
||||
|
||||
|
||||
void bmpxxx_init(BMP_ptr ptr,I2C_ptr i2c,uint16_t address);
|
||||
|
||||
uint16_t bmpxxx_read(BMP_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
uint16_t bmpxxx_write(BMP_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* BSP_BMP280_H_ */
|
||||
|
||||
@@ -5,4 +5,39 @@
|
||||
* Author: gxms0
|
||||
*/
|
||||
|
||||
#include "mpu6500.h"
|
||||
|
||||
void mpu6xxx_init(MPU_ptr ptr,I2C_ptr i2c,uint16_t address)
|
||||
{
|
||||
ptr->address = address;
|
||||
|
||||
ptr->i2c = i2c;
|
||||
|
||||
ptr->read = &i2c_read;
|
||||
ptr->write = &i2c_write;
|
||||
|
||||
}
|
||||
|
||||
uint16_t mpu6xxx_read(MPU_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len)
|
||||
{
|
||||
uint16_t state = 0;
|
||||
|
||||
state = ptr->read(ptr->i2c, ptr->address, reg, data, len);
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
uint16_t mpu6xxx_write(MPU_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len)
|
||||
{
|
||||
uint16_t state = 0;
|
||||
|
||||
state = ptr->write(ptr->i2c, ptr->address, reg, data, len);
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,29 @@
|
||||
#ifndef BSP_MPU6500_H_
|
||||
#define BSP_MPU6500_H_
|
||||
|
||||
#include "ch32v20x.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "drv_i2c.h"
|
||||
|
||||
typedef struct sMPU {
|
||||
|
||||
I2C_ptr i2c;
|
||||
uint16_t address;
|
||||
|
||||
uint16_t (*read)(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len);
|
||||
uint16_t (*write)(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
}MPU_t;
|
||||
|
||||
typedef MPU_t* MPU_ptr;
|
||||
|
||||
void mpu6xxx_init(MPU_ptr ptr,I2C_ptr i2c,uint16_t address);
|
||||
|
||||
uint16_t mpu6xxx_read(MPU_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
uint16_t mpu6xxx_write(MPU_ptr ptr, uint8_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
|
||||
|
||||
#endif /* BSP_MPU6500_H_ */
|
||||
|
||||
+120
@@ -5,4 +5,124 @@
|
||||
* Author: gxms0
|
||||
*/
|
||||
|
||||
#include "qmc5883l.h"
|
||||
|
||||
void qmcxxx_init(QMC_ptr ptr,I2C_ptr i2c,uint16_t address)
|
||||
{
|
||||
ptr->address = address;
|
||||
|
||||
ptr->i2c = i2c;
|
||||
|
||||
ptr->read = &i2c_read;
|
||||
ptr->write = &i2c_write;
|
||||
|
||||
|
||||
uint8_t cmd = QMC5883_CMD_SOFT_RST_ENABLE;
|
||||
|
||||
//使能软件复位
|
||||
cmd = QMC5883_CMD_SOFT_RST_ENABLE;
|
||||
ptr->write(ptr->i2c, ptr->address, QMC5883_REG_CTRL2, &cmd , 1);
|
||||
|
||||
//连续模式、满量程为8G、过采样率
|
||||
cmd = QMC5883_CMD_MODE_CON|QMC5883_CMD_ODR_10HZ|QMC5883_CMD_RNG_8G|QMC5883_CMD_OSR_512;
|
||||
ptr->write(ptr->i2c, ptr->address, QMC5883_REG_CTRL1, &cmd , 1);
|
||||
|
||||
//不使用中断,数据指针自动移动到下一个地址(在寄存器00H~05H之间)
|
||||
cmd = QMC5883_CMD_INT_DISABLE|QMC5883_CMD_ROL_PNT_ENABLE ;
|
||||
ptr->write(ptr->i2c, ptr->address, QMC5883_REG_CTRL2, &cmd , 1);
|
||||
|
||||
}
|
||||
|
||||
uint8_t qmcxxx_checkchip(QMC_ptr ptr)
|
||||
{
|
||||
uint8_t ChipID=0;
|
||||
|
||||
ptr->read(ptr->i2c, ptr->address, QMC5883_REG_PRODUCTID ,&ChipID, 1);
|
||||
|
||||
if(ChipID==0xFF)
|
||||
{
|
||||
return 0x01;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
void qmcxxx_getdata(QMC_ptr ptr)
|
||||
{
|
||||
int16_t mxyz[10][3] = {0};
|
||||
int32_t avermxyz[3]={0};
|
||||
uint8_t buffer[6]={0};
|
||||
static float magGaussData[3] = {0.0};
|
||||
static uint8_t cnt=0;
|
||||
|
||||
ptr->read(ptr->i2c, ptr->address, QMC5883_REG_DATA ,buffer, 6);
|
||||
|
||||
//printf("Xl=%d,Xh=%d,Yl=%d,Yh=%d,Zl=%d,Zh=%d\r\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);
|
||||
mxyz[cnt][0] = (int16_t)(buffer[1] << 8 | buffer[0]);
|
||||
mxyz[cnt][1] = (int16_t)(buffer[3] << 8 | buffer[2]);
|
||||
mxyz[cnt][2] = (int16_t)(buffer[5] << 8 | buffer[4]);
|
||||
cnt++;
|
||||
if(cnt>=10)
|
||||
{
|
||||
cnt=0;
|
||||
for(uint8_t i=0,j=0;i<3;i++)
|
||||
{
|
||||
for(j=0;j<10;j++)
|
||||
{
|
||||
avermxyz[i]+=mxyz[j][i];
|
||||
}
|
||||
avermxyz[i]=avermxyz[i]/10;
|
||||
}
|
||||
//printf("average original data :x=%d,y=%d,z=%d\r\n",avermxyz[0],avermxyz[1],avermxyz[2]);
|
||||
|
||||
for(uint8_t k=0;k<3;k++)
|
||||
{
|
||||
magGaussData[k]=magGaussData[k]-32768; //32768:Null Field Output
|
||||
magGaussData[k]=avermxyz[k]/3000; //3000:sensitivity, 3000 counts/G
|
||||
}
|
||||
|
||||
//printf("convert the raw data :x=%f,y=%f,z=%f\r\n",magGaussData[0],magGaussData[1],magGaussData[2]);
|
||||
//printf("\r\n");
|
||||
}
|
||||
//DelayMs(3000);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
3、空间校准:把椭球修到正球
|
||||
|
||||
a)、空间旋转芯片,找出xyz的最大最小值xmax、xmin、ymax 、ymin、zmax 、zmin。
|
||||
|
||||
b)、于是,x的偏移: Xoffset= (xmax + xmin) / 2;
|
||||
|
||||
c)、x的比例取:x_gain=1
|
||||
|
||||
d)、y的偏移:Yoffset =(ymax + ymin) / 2;
|
||||
|
||||
e)、y的比例:y_gain=(xmax - xmin) / (y_max -y_min);
|
||||
|
||||
f)、 z的偏移:Zoffset =(zmax + zmin) / 2;
|
||||
|
||||
g)、z的比例:z_gain=(xmax - xmin) / (z_max -z_min);
|
||||
|
||||
|
||||
|
||||
X_QMC = QMC_Xgain *(X_QMC - QMC_Xoffset);
|
||||
|
||||
Y_QMC = QMC_Ygain * (Y_QMC - QMC_Yoffset);
|
||||
|
||||
Z_QMC = QMC_Zgain * (Z_QMC- QMC_Zoffset);
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,73 @@
|
||||
#ifndef BSP_QMC5883L_H_
|
||||
#define BSP_QMC5883L_H_
|
||||
|
||||
#include "ch32v20x.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "drv_i2c.h"
|
||||
|
||||
|
||||
#define QMC5883_REG_DATA 0x00
|
||||
#define QMC5883_REG_OUT_X_L 0x00
|
||||
#define QMC5883_REG_OUT_X_M 0x01
|
||||
#define QMC5883_REG_OUT_Y_L 0x02
|
||||
#define QMC5883_REG_OUT_Y_M 0x03
|
||||
#define QMC5883_REG_OUT_Z_L 0x04
|
||||
#define QMC5883_REG_OUT_Z_M 0x05
|
||||
|
||||
#define QMC5883_REG_STATUS 0x06
|
||||
#define QMC5883_DRDY_BIT0 //0: no new data, 1: new data is ready
|
||||
#define QMC5883_OVL_BIT1 //0: normal, 1: data overflow
|
||||
#define QMC5883_DOR_BIT2 //0: normal, 1: data skipped for reading
|
||||
|
||||
#define QMC5883_REG_TEMP_OUT_L 0x07
|
||||
#define QMC5883_REG_TEMP_OUT_H 0x08
|
||||
|
||||
#define QMC5883_REG_CTRL1 0x09
|
||||
#define QMC5883_CMD_MODE_STANDBY 0x00 //mode
|
||||
#define QMC5883_CMD_MODE_CON 0x01
|
||||
#define QMC5883_CMD_ODR_10HZ 0x00 //Output Data Rate
|
||||
#define QMC5883_CMD_ODR_50HZ 0x04
|
||||
#define QMC5883_CMD_ODR_100HZ 0x08
|
||||
#define QMC5883_CMD_ODR_200HZ 0x0C
|
||||
#define QMC5883_CMD_RNG_2G 0x00 //Full Scale
|
||||
#define QMC5883_CMD_RNG_8G 0x10
|
||||
#define QMC5883_CMD_OSR_512 0x00 //Over Sample Ratio
|
||||
#define QMC5883_CMD_OSR_256 0x40
|
||||
#define QMC5883_CMD_OSR_128 0x80
|
||||
#define QMC5883_CMD_OSR_64 0xC0
|
||||
|
||||
#define QMC5883_REG_CTRL2 0x0A
|
||||
#define QMC5883_CMD_INT_ENABLE 0x00
|
||||
#define QMC5883_CMD_INT_DISABLE 0x01
|
||||
#define QMC5883_CMD_ROL_PNT_ENABLE 0x40 //pointer roll-over function,only 0x00-0x06 address
|
||||
#define QMC5883_CMD_ROL_PNT_DISABLE 0x00
|
||||
#define QMC5883_CMD_SOFT_RST_ENABLE 0x80
|
||||
#define QMC5883_CMD_SOFT_RST_DISABLE 0x00
|
||||
|
||||
#define QMC5883_REG_SET_RESET 0x0B
|
||||
#define QMC5883_CMD_SET_RESET 0x01
|
||||
|
||||
#define QMC5883_REG_PRODUCTID 0x0D //chip id :0xFF
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct sQMC {
|
||||
|
||||
I2C_ptr i2c;
|
||||
uint16_t address;
|
||||
|
||||
uint16_t (*read)(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len);
|
||||
uint16_t (*write)(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
}QMC_t;
|
||||
|
||||
typedef QMC_t* QMC_ptr;
|
||||
|
||||
void qmcxxx_init(QMC_ptr ptr,I2C_ptr i2c,uint16_t address);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* BSP_QMC5883L_H_ */
|
||||
|
||||
@@ -6,3 +6,18 @@
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,16 @@
|
||||
#ifndef BSP_SI24R1_H_
|
||||
#define BSP_SI24R1_H_
|
||||
|
||||
typedef struct sSI24R {
|
||||
|
||||
uint16_t address;
|
||||
|
||||
uint8_t (*read)(I2C_ptr ptr, uint16_t address, uint8_t reg,uint8_t *data, uint16_t len);
|
||||
uint8_t (*write)(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len);
|
||||
|
||||
}SI24R_t;
|
||||
|
||||
typedef SI24R_t* SI24R_ptr;
|
||||
|
||||
|
||||
#endif /* BSP_SI24R1_H_ */
|
||||
|
||||
Reference in New Issue
Block a user