一、描述
二、AK09918是通过标准的I2C协议读写数据的,速率支持100KHz(标准)-400KHz快速模式的。
三、寄存器
enum {
COMPANY_ID = 0x48,
DEVICE_ID = 0x0C,
};
#define AK09918_SLAVE_ADDR 0x0C
//
//公司名称Company ID->AKM
#define WIA1_CO_ID_REG 0x00
//
//设备ID Device ID->AK09918
#define WIA2_DEVICE_ID_REG 0x01
//
//数据状态寄存器1。bit0就绪位DRDY->0:Normal。1:Data is ready。bit1超时位DOR->0:Normal。1:Data OVerrun
//ST2或测量寄存器(HXL to TMPS)被读的时候都是返回0。溢出是连续测量模式下寄存器数据未被及时读走
#define ST1_REG 0x10
//
//X轴低八位数据,default:0。range of axis is -32752 to 32752
#define HXL_REG 0x11
//
//X轴高八位数据,default:0。range of axis is -32752 to 32752
#define HXH_REG 0x12
//
//Y轴低八位数据,default:0。range of axis is -32752 to 32752
#define HYL_REG 0x13
//
//Y轴高八位数据,default:0。range of axis is -32752 to 32752
#define HYH_REG 0x14
//
//Z轴低八位数据,default:0。range of axis is -32752 to 32752
#define HZL_REG 0x15
//
//Z轴高八位数据,default:0。range of axis is -32752 to 32752
#define HZH_REG 0x16
//
//哑读操作寄存器
#define TMPS_DUMMY_REG 0x17
//
//状态寄存器2。bit4-HOFL:溢出标志->0:Normal。1:Magnetic sensor overflow occurred
//溢出数据无效,数据有效与否的标志,读取(HXL to TMPS)数据之后需要读溢出ST2寄存器
#define ST2_REG 0x18
//
//哑读/写操作寄存器
#define CNTL1_DUMMY_REG 0x30
//
//操作模式寄存器
#define CNTL2_MODE_REG 0x31
//
//复位寄存器->1:Reset。0:Normal
#define CNTL3_RST_REG 0x32
四、地址需要注意,右移一位:
五、读取三轴数据的时候,判断数据就绪的标志。
但是,按照手册设置模式后直接判断DRDY读取三轴数据,DRDY会一直是0。
.
.
.
在寄存器ST1看到
DRDY就绪后需要读ST2或者HXL-TMPS寄存器才会置零。
所以需要在读标志之前进行一次读ST2或者TMPS寄存器。
以上就是我读写AK09918时遇到的问题和解决方法,水平有限,如有不妥,请见谅,请指出。谢谢。
需要源代码的朋友去:ak09918Linux平台和STM32平台驱动程序,实测,亲自调试-Linux文档类资源-CSDN下载
下载去。