/***********************
HMC5983读取数据
2014-10-29
Leven
通过模拟IIC实现数据读取,IIC接口看IIC.h文件,要用其他接口对应修改初始化和控制的函数就行
HMC_Get_Data是读取数据的函数,输入一个含有3个short的数组就可以读出数据
我读数据的时候会有时候读出三个轴都是-1的情况,因为我写的时候只用到X\Y轴所以没有处理Z轴,要用的话用同样方法处理一下就好
***********************/
#include"HMC5983.h"
void Init_HMC5983(void)
{
delay_ms(100);
IIC_Init();
Write_HMC5983(0x00, 0x9c);
Write_HMC5983(0x01, 0x20);
Write_HMC5983(0x02, 0x00); //连续测量模式
//Write_HMC5983(0x01, 0xe0);
}
void Write_HMC5983(u8 add, u8 da)
{
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack();
IIC_Send_Byte(add); //内部寄存器地址,请参考中文pdf
IIC_Wait_Ack();
IIC_Send_Byte(da); //内部寄存器数据,请参考中文pdf
IIC_Wait_Ack();
IIC_Stop(); //发送停止信号
}
u8 Read_HMC5983(u8 REG_Address)
{
u8 REG_data;
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack();
IIC_Send_Byte(REG_Address); //发送存储单元地址,从0开始
IIC_Wait_Ack();
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress+1); //发送设备地址+读信号
IIC_Wait_Ack();
REG_data=IIC_Read_Byte(0); //读出寄存器数据
IIC_Stop(); //停止信号
return REG_data;
}
//******************************************************
//
//连续读出HMC5983内部角度数据,地址范围0x3~0x5
//
//******************************************************
void Multiple_read_HMC5983(u8*BUF)
{ u8 i;
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack();
IIC_Send_Byte(0x03); //发送存储单元地址,从0x3开始
IIC_Wait_Ack();
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress+1); //发送设备地址+读信号
IIC_Wait_Ack();
for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF
{
if (i == 5)
{
BUF[i] = IIC_Read_Byte(0); //最后一个数据需要回NOACK
}
else
{
BUF[i] = IIC_Read_Byte(1); //返回ACK
}
}
IIC_Stop(); //停止信号
}
/**************
获取电子罗盘数据,判断并移去错误读数
**************/
void HMC_Get_Data(short*DAT)
{
u8 HMC5983_buf[6];
static u16 last_DAT[3];
Multiple_read_HMC5983(HMC5983_buf); //连续读出数据,存储在BUF中
DAT[0] = (short)HMC5983_buf[0] << 8 | HMC5983_buf[1]; //X轴
DAT[1] = (short)HMC5983_buf[4] << 8 | HMC5983_buf[5]; //Y轴
DAT[2] = (short)HMC5983_buf[2] << 8 | HMC5983_buf[3]; //Z轴
//读数出错
if(DAT[0]>2048||DAT[0]<-2048||DAT[1]>2048||DAT[1]<-2048||(DAT[0]==-1&&DAT[1]==-1))
{
DAT[0]=last_DAT[0];
DAT[1]=last_DAT[1];
}
else//读数正确
{
last_DAT[0]=DAT[0]=DAT[0]-HMC_X_OFFSET;
last_DAT[1]=DAT[1]=DAT[1]-HMC_Y_OFFSET;
}
}
STM32F10x的HMC5983模拟IIC已调通
5星 · 超过95%的资源 需积分: 10 30 浏览量
2014-12-19
00:36:18
上传
评论 5
收藏 3KB ZIP 举报
柳风V
- 粉丝: 7
- 资源: 9
最新资源
- springboot-mavenBaseDemo 内容包含:springboot的maven基础状态,1.8JDK可以直接运行
- otis rsl远程串行接口协议标准.pdf
- buildx构建镜像时所需的镜像文件
- F103-霸道开发板2.8寸电阻触摸屏例程.rar
- Google(高德)地图瓦片python代码下载
- Python实现输出杨辉三角形
- polsarpro官方教程、操作说明 PolSARpro v5.0 Software Training Course
- STM32 TouchGFX的使用二图片显示
- buildx镜像文件,也可以通过网上其他方式获取
- 【中级软件设计师】上午题12-软件工程(2):单元测试、黑盒测试、白盒测试、软件运行与维护
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论5