初级会员

- 积分
- 134
- 金钱
- 134
- 注册时间
- 2018-7-23
- 在线时间
- 30 小时
|
10金钱
参考原子哥的mini-fly源程序,MCU用的stm32f103zet6
// AK8963初始化函数
// 地址: 0x0C << 1 -> 0x18
// 返回值: true;初始化完成 否则初始化失败
bool AK8936_Init(void)
{
if(Get_AK8963_ID()==0X48)
{
IIC_WriteByte(AK8963_ADDR,AK8963_CNTL2,0x01); // 复位
delay_ms(50);
AK8963_SetMode(AK8963_MDOE_BIT16|AK8936_MODE_CONT2); // 设置磁力计相关工作模式
if(AK8963_SelfCheck()) // 如果自检通过
{
return true;
}
else return false;
}else
return false;
}
// 磁力计自检函数
// 返回值: true为自检成功 false为自检失败
bool AK8963_SelfCheck(void)
{
bool checkStatus = true; // 定义自检状态变量
s16 mx,my,mz; // 正磁力计测量参数
u8 confSave; // 配置保存变量
u8 timeout = 20; // 溢出时间
confSave = IIC_ReadByte(AK8963_ADDR,AK8963_CNTL); // 保存控制寄存器1中的相关配置
AK8963_SetMode(AK8963_MODE_NOPOWER); // 设置磁力计模式为掉电模式
AK8963_SelfTest(true); // 使能自检
AK8963_SetMode(AK8963_MDOE_BIT16|AK8963_MODE_SELFTEXT); // 16bit模式和自检模式
AK8963_Get_OverflowStatus(); // 清除状态寄存器一通过读取状态寄存器二
while(!AK8963_Get_DataReady() && timeout--)
{
delay_ms(1);
}
AK8963_GetHeading(&mx,&my,&mz); // 得到磁力计测量参数
AK8963_SetMode(AK8963_MODE_NOPOWER); // 设置磁力计为掉电模式
/*检测测量参数*/
if(AK8963_EvaluateSelfTest(AK8963_X_MIN,AK8963_X_MAX,mx,"X") &&
AK8963_EvaluateSelfTest(AK8963_Y_MIN,AK8963_Y_MAX,my,"Y") &&
AK8963_EvaluateSelfTest(AK8963_Z_MIN,AK8963_Z_MAX,mz,"Z")
)
{
printf("AK8963 value Self test OK.\n"); // 数据检验正常
}
else
{
printf("AK8963 value Self test NO.\n");
checkStatus = false; // 数据超出量程
}
AK8963_SetMode(confSave); // 重新设置为最初配置
return checkStatus; // 返回自检状态值
}
|
-
|