HMC 5883L中文数据手册_已解锁
- 格式:pdf
- 大小:541.50 KB
- 文档页数:18
CONFIDENTIAL | Navigation Hong Kong Limited. All Rights Reserved1. HMC5843与HMC5883L 主要的区别是什么?HMC5843 HMC5883L 尺寸/封装4 x 4 x 1.3mm 20-Pin LCC 3 x 3 x 0.9mm 16-Pin LCC 分辨率7 mGauss 2 mGauss 磁场范围±6 Guass ±8 Guass 增益设置 1620至2820Counts/Guass1370至230Counts/Gauss 输出数据寄存器顺序Xm, XI, Ym, YI, Zm, ZI Ym, YI, Zm, ZI, Xm, XI 2. 使用HMC5883L 能不能不用加速度传感器就能计算出航向?是的,不用加速度传感器就可以计算出航向。
但是,传感器必须保证是水平的,也就是,俯仰角与滚转角都为零。
这样,在水平面上的的三个轴中只有两个会被用到。
3. 如何通过软件设置来识别板上应用的传感器是为HMC5843还是HMC5883L?我们不能通过其相同的识别寄存次来识别传感器的类型,但是可以通过下述方式进行识别:1)向配置寄存器A 写入“01100000”;然后再进行读取;2)如果其反馈值还是为“01100000”,则该传感器为HMC5883L,反之.4. 为什么需要加速度传感器?如果罗盘不是水平的,就需要加速度传感器来纠正由于倾斜引起的误差。
或者,Honeywell 提供了一体化解决方案HMC6343作为另外一种选择。
HMC6343内置3轴加速度传感器,具备倾斜补偿的航向输出,封装在9×9×1.9mm 的芯片中。
5. HMC5883L Set/Reset 回路所起到的作用是什么?该回路是Honeywell 的专利设计,其在每次数据测量之前能够进行一个自动消磁的作用,以消除设备本身存在的offset ,从而实现传感器在一个“纯净”的磁场进行测试.6. 如何判定传感器的好坏?可以通过设置HMC5883L 的寄存器以启动传感器self-test 的功能从而实现对于传感器好坏的判定.7. 如果未设置self-test 模块的启动,如何判定传感器的好坏?如果未进行自测,那么可以从传感器所采集的数据来进行分析但首先要将各个轴的Gain 值进行调整测试采集,如果传感器一直所采集的数据接近为零,则说明该传感器已经损坏或者焊锡出现虚焊和假焊现象.8. 如何判定HMC5883L 在PCB 板上的位置是否可行的?析,看各轴数据的分布形状是否呈椭圆或者近似圆的分布.9.PCB layout时应该注意的方面有哪些?在传感器周围不应该有比较大的带磁物质或者通过大电流的线路,对于蜂鸣器以及含铁物件尽量保持比较远的距离.10. HMC5883L是否支持手动焊接?HMC5883L并不推荐手工焊接,如必须使用,需注意下述两方面:1)锡膏最高温度不能超过315℃,IC不能加热时间过长;2)如果IC未保持在持续的干燥环境下,那么在封装之前必须进行烘烤,因为IC对湿度比较灵敏(MSL3)建议使用最高温度为260℃的Reflow流程进行焊接。
磁阻传感器HMC5883L在车辆检测及分类中的应用作者:李娣娜来源:《电子技术与软件工程》2017年第04期摘要本文采用三轴各向异性磁阻传感器HMC5883L设计了一种车辆检测与车型分类系统,针对车辆首尾相接与大型车辆的检测矛盾,利用磁阻传感器三轴磁场信息提取车辆特征信号对车辆进行分类。
该系统成本低、传感器节点小、车辆检测分类精度高,可广泛用于军事侦察及智能交通等领域的车辆检测及分类。
【关键词】HMC5883L 车辆检测车型分类1 引言目前,各国学者对磁阻传感器检测车辆的原理及相关算法进行了研究,这些研究都是基于地磁场强度垂直分量展开的,已提出的车辆检测算法均没有考虑大型车辆被判为多辆车与车辆漏检的情况对最终车辆检测数量的相互弥补,而本文要在车辆检测的基础上对车型进行分类。
国内外现有的研究多数是基于单轴或双轴磁场信号实现车辆的检测与分类,没有充分利用空间磁场信息,不能全面体现车辆的扰动,导致车辆检测分类精度不高、车型划分种类少。
针对车辆检测分类的需求,采用新型三轴磁阻传感器HMC5883L以及无线通信模块XL02-232AP1研制了一种车辆检测分类系统。
2 磁阻传感器检测分类车辆原理磁阻传感器的基础器件是恵斯通电桥,组成电桥的电阻由镍铁合金材料制成,该电阻的阻值在一定范围内与磁场矢量变化呈线性关系。
当含铁磁物质的物体(如车辆)经过磁阻传感器时,会对传感器周围的地磁场造成扰动,磁阻传感器可以检测出由于车辆的经过而产生的地磁场变化,不同类型的车辆包含的铁磁性材料大小和形状均不同,从而不同类型的车辆对地磁场产生的扰动也不同,依据这个原理可以对车辆进行分类。
3 传感器节点设计本文选用一种三轴数字式磁阻传感器HMC5883L,该传感器采用霍尼韦尔各向异性磁阻(AMR)技术,封装在3.0×3.0×0.9 mm LCC 表面装配中,具有12 bit 的ADC 模块,能在±8 高斯的磁场中实现5 毫高斯分辨率。
使用HMC5883L -3轴数字罗盘传感器计算航向角——中北大学:马政贵图1 HMC5883L 的电路图HMC5883L -3轴数字罗盘采用IIC 总线接口,内含12位AD 转换器,能在8Ga 的磁场中实现5mGa 的分辨率。
1. HMC5883L 的初始化:HMC5883L 的磁场默认测量范围为 1.3Ga ,由于地磁场强度大约是0.5-0.6Ga ,故使用默认的量程即可,此外还需进行采样平均数、数据输出速率、测量模式的初始化配置即可。
/******************************************************************************* 功能:对HMC5883L 进行初始化参数:无返回值:无*******************************************************************************/ void HMC5883_Init(void){HMC_GPIO_Config(); //GPIO 配置HMC_I2C_Write(0x00,0x78); //(配置寄存器A )采样平均数8;数据输出速率75Hz ;正常测量配置模式 HMC_I2C_Write(0x02,0x00); //(模式寄存器)连续测量模式}备注:void HMC_I2C_Write(u8 address,u8 data)为寄存器写入函数,第一个参数address ±±为要写入的寄存器地址,第二个参数data 为要写入寄存器的值。
2. HMC5883L 自测:HMC5883L -3轴数字罗盘内含自测模式。
HMC_I2C_Write(0x00,0x79); //(配置寄存器A )采样平均数8;数据输出速率75Hz ;正偏压自测模式 HMC_I2C_Write(0x02,0x01); //(模式寄存器)单一测量模式通过将配置寄存器A 的最低位(MS1和MS0)从00更改为01,然后再配置为单一测量模式,即可进入自测模式。
HMC相关操作1 HMC配置ip 地址登入hmc, 在左侧窗口选择管理环境>>>HMC配置选择右侧菜单中的定制网络设置在网络定制窗口中,更改控制台名称为: HMC 选择LAN适配器选择eth2适配器点击详细信息更改eth2端口设置如上图所示,点击确定保存配置,返回主界面选择左上角控制台下拉菜单,选择退出,重新启动HMC使设置生效2 创建逻辑分区右键点击Server图标选择创建>>>逻辑分区输入分区名称,点击下一步确定分区是否在工作负载管理组中,选择否,点击下一步输入分区概要文件名称:lpae3.pro,点击下一步输入为该逻辑分区分配的最小,期望,最大内存量,点击下一步点击下一步输入为该逻辑分区分配的最小,期望,最大处理器数,点击下一步为该分区添加必要和期望的i/o组件,点击下一步由于需要动态移动的i/o设备很少,所以没有必要设置i/o池,直接点击下一步不需要设置虚拟i/o适配器,选择否,点击下一步直接点击下一步选择正常引导方式,点击下一步确认信息无误后,点击完成,开始创建分区3 动态资源移动1)动态移动内存将64M内存从lpar1动态移动到lpar21 右键点击lpar1图标2 依次选择动态逻辑分区>>>内存资源>>>移动3 指定移动64M内存,移动至逻辑分区lpar2,点击确定执行操作2)动态移动处理器将1路处理器由lpar1动态移动到lpar2 1 右键点击lpar1图标2 依次选择动态逻辑分区>>>处理器资源>>>移动3 输入处理器数目:1 移动至逻辑分区lpar2,点击确定执行操作3)动态移动光驱光驱在aix系统中的设备名称为cd0首先在拥有cd0资源的系统中执行以下操作:1 寻找cd0上级设备#lsdev –Cl cd0 –F parent 输出结果:ide0#lsdev –Cl ide0 –F parent 输出结果:pci62 察看ide0,pci6地址信息# lscfg -l ide0ide0 U7879.001.DQD2K3L-P1-T15 A TA/IDE Controller Device # lscfg -l pci6pci6 U7879.001.DQD2K3L-P1 PCI Bus3 删除cd0资源#rmdev –dl pci6 –R,输出结果如下cd0 deletedide0 deletedpci6 deleted4 查找pci6物理位置右键点击lpar2.pro选择特性选择物理I/O5 移动光驱资源右键点击lpar2 ,依次选择动态逻辑分区>>>物理适配器资源>>>移动选择插槽T15,移至lpar1,点击确定执行操作6 在lpar1上执行命令#cfgmgr识别并建立刚加入的cd0资源4)动态移动磁带机磁带机设备名称为:rmt0,其他操作与移动cd0相同磁带机在aix系统中的设备名称为rmt0首先确定磁带机是否在本机# lsdev -Cc tapermt0 A vailable 06-08-00-0,0 Differential SCSI 4mm Tape Drive在拥有rmt0资源的系统中执行以下操作:1 寻找rmt0上级设备#lsdev –Cl rmt0 –F parent 输出结果:scsi1#lsdev –Cl scsi1 –F parent 输出结果:sisscsia1#lsdev –Cl sisscsia1 –F parent 输出结果:pci62 察看scsi1,pci6地址信息# lscfg -l scsi1scsi1 U7879.001.DQD2K3L-P1-C3-T1 PCI-X Dual Channel Ultra320 SCSI Adapter bus# lscfg -l pci6pci6 U7879.001.DQD2K3L-P1 PCI Bus 3 删除rmt0资源#rmdev –dl pci6 –R,输出结果如下rmt0 deletedscsi1 deletedscsi2 deletedsisscsia1 deletedpci6 deleted4 查找pci6物理位置右键点击P570-1.pro选择特性选择物理I/O5 移动磁带资源右键点击570-1 ,依次选择动态逻辑分区>>>物理适配器资源>>>移动选择插槽C3,移至570-2,点击确定执行操作6 在570-2上执行命令#cfgmgr识别并建立刚加入的rmt0资源4 安装HMC远程管理客户端1 启用远程虚拟终端选择启用或禁用远程虚拟终端选中启用远程虚拟终端连接后,点击确定返回上级菜单2 开启远程虚拟终端服务选择定制网络设置选择LAN适配器选择eth2,点击详细信息选择防火墙选中WebSM,点击容许然后重新启动HMC使设置生效3 下载远程终端服务软件在浏览器输入地址http://10.79.9.11/remote_client.html用户名:hscroot口令:abc123分别下载这2个软件,安装时请先安装java web start环境。
hmc5883l三轴电子罗盘传感器连接arduinoHMC5883L器件简介(1)器件介绍名称:HMC5883L电子指南针罗盘模块(三轴磁场传感器)型号:GY-271(2)主要技术参数使用芯片:HMCL5883L供电电源:3-5V通信方式:IIC通信协议测试范围:±1.3-8高斯(3)工作原理传统罗盘用一根被磁化的磁针来感应地球磁场,地球磁场与磁针之间的磁力时磁针转动,直至磁针的两端分别指向地球的磁南极与磁北极。
电子罗盘也一样,只不过把磁针换成了磁阻传感器,然后将感受到的地磁信息转换为数字信号输出给用户使用。
(4)产品应用领域手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统等。
(5)器件尺寸图hmc5883l三轴电子罗盘传感器连接arduino连接方法:只要连接VCC,GND,SDA,SCL四条线。
ArduinoGND-》HMC5883LGNDArduino3.3V-》HMC5883LVCCArduinoA4(SDA)-》HMC5883LSDAArduinoA5(SCL)-》HMC5883LSCL (注意,接线是A4,A5,不是D4,D5)程序编写:1、下载HMC5883L库文件。
下载地址:http://soft2.wmzhe/download/AnsifaArduino/HMC5883L.zip2、解压HMC5883L库文件到arduino文件夹:arduino-0022\libraries下面。
3、编写以下程序,下载下面测试程序到arduino:#include《Wire.h》#include《HMC5883L.h》HMC5883Lcompass;voidsetup(){。
this calibration will correct or compensate for thehard iron effects.hard iron effects are magnetic filed superimpositions on the earth's magnetic field that are fixed in magnitude and which do not depend on the orientation of the compass.the compass calibration shall be initiated by a user command that put the compass into the calibration mode. once in that mode the compass shall be rotated through 360 degrees abouth the forward or left direction followed by a 360 rotation about the up-down direction. that is, there are two full rotations required to complete the physical movement required. at the end of the rotations a command to end the calibration process shall be issued by the user to the compass.it is important to keep the forward (or left ) axis level during the first rotation and to keep the up-down axis vertical during the second calibration and until the flu calibration is complete. Failure to follow these process will result in less than optimal calibration and heading errors are likely.#define calthreshold 0int Xmax,Xmin,Ymax,Ymin,Zmax,Zmin;viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ)void Calibrate(int MagX, int MagY, int MagZ)void Compute_and_Save(void)void Hard_Iron_correction(int Xoff, int Yoff, int Zoff)viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ)//set Max and Min values of the mag output to the current values Xmax = MagX;Xmin = MagX;Ymax = MagY;Ymin = MagY;Zmax = MagZ;Zmin = MagZ;void Calibrate(int MagX, int MagY, int MagZ)//this routine will capture the max and min values of the magX,Y,Z data while the//compass is being rotated 360 degrees through the level plane and the upright plane.//i.e. horizontal and vertical circles.//This function should be invoked while making continuous measurements//on the magnetometersint MagXreading,int MagYreading,int MagZreading;MagXreading = MagX;MagYreading = MagY;MagZreading = MagZ;if(MagXreading > Xmax) Xmax = MagXreading;if(MagXreading < Xmin) Xmin = MagXreading;if(MagYreading > Ymax) Ymax = MagYreading;if(MagXreading < Ymin) Ymin = MagXreading;if(MagZreading > Zmax) Zmax = MagZreading;if(MagXreading < Zmin) Zmin = MagXreading;void Compute_and_Save(void)if(abs(Xmax - Xmin) > CalThreshold)Mag_UserCal_offset_X = (Xmax + Xmin)/2;//save parameters in EEif(abs(Ymax - Ymin) > CalThreshold)Mag_UserCal_offset_Y = (Ymax + Ymin)/2;//save parameters in EEif(abs(Zmax - Zmin) > CalThreshold)Mag_UserCal_offset_Z = (Zmax + Zmin)/2;//save parameters in EEvoid Hard_Iron_correction(int Xoff, int Yoff, int Zoff) //call this function for correctionMagX -= Mag_UserCal_Offset_X;MagY -= Mag_UserCal_Offset_Y;MagZ -= Mag_UserCal_Offset_Z;希望以上资料对你有所帮助,附励志名3条:1、积金遗于子孙,子孙未必能守;积书于子孙,子孙未必能读。
智能小车小范围导航系统李学林严小波摘要:我们的作品是以实现无线下载PC机已有的地图来完成特定的路线为目的,以完成规定地方数据的采集。
我们是以罗盘指南针来解决精确定位角度的问题。
然后测其速度,便能知道小车当前的行驶状况。
在我们的上位机程序中,以虚拟北的方式来完成对地图的描绘。
这样的方式形成了与地球北方形成了对应,绘图1°的精确度形象而现实的反应了地面的360个方向。
而下位机的导航系统与运算系统形成了与上位机的360个方向的对应。
这样形成了对地面基本全部方位的对应。
虽然由于小车机械特性造成了不能实现在1°的范围转动,但是基本上能实现对路线的绘制。
关键字:HMC5883 虚拟北大量数据传输上位机绘图导航系统Xuelinli XiaoboyanAbstract: we work with wireless download PC existing map to accomplish a specific route for the purpose to complete the specified place data collection. We took a compass a compass to solve the precise positioning Angle. Then measured the speed, can know car driving conditions current. In our PC program, the way to virtual north to finish on the map describe. This way and has formed the earth northern formed correspondence, drawing 1 ° precision image and realistic reaction to the ground 360 direction. And the lower level computer navigation system and computing system formed and superordination machine in the direction of the 360 corresponding. This forms a basic on the ground all orientation of the correspondence. Although the car mechanical properties caused cannot achieve the range in 1 ° turns, but basically can realize the rendering of route.一、背景鉴于各个领域对智能化系统的需求在不断的上升,在很多危险的领域更是不用说。
磁⼒计基础(HMC5833L,HMC5983)三轴磁场传感器模块HMC5983⾼精度带温度补偿IIC/SPI 通信兼容HMC5883L最⼤220Hz 输出速率补偿数据将会被⾃动放置到数据输出寄存器中,如果想要补偿功能⼯作,那么必须设置使温度传感器⼯作(设置CRA7=1)Set this bit to enable temperature sensor. Temperature sensor will be measured at each magnetic measurement. Enable Temperature sensor for automatic compensation of Sensitivity over temperature.注意这⾥的MA1 TO MA2 00=1是默认值配置寄存器B:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Below is an example ofa (power-on) initialization process for “continuous-measurement mode” via I2C interface:1. Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement)2. Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)3. Write Mode (02) – send 0x3C 0x02 0x00 (Continuous-measurement mode)4. Wait 6 ms or monitor status register or DRDY hardware interrupt pin5. LoopSend 0x3D 0x06 (Read all 6 bytes. If gain is changed then this data set is using previous gain)Convert three 16-bit 2’s compliment hex values to decimal values and assign to X, Z, Y, respectively.Send 0x3C 0x03 (point to first data register 03)Wait about 67 ms (if 15 Hz rate) or monitor status register or DRDY hardware interrupt pinEnd_loopBelow is an example of a (power-on) initialization process for “single-measurement mode” via I2C interface:1. Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default or any other rate, normal measurement)2. Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)3. For each measurement query:Write Mode (02) – send 0x3C 0x02 0x01 (Single-measurement mode)Wait 6 ms or monitor status register or DRDY hardware interrupt pinSend 0x3D 0x06 (Read all 6 bytes. If gain is changed then this data set is using previous gain)Convert three 16-bit 2’s compliment hex values to decimal values and assign to X, Z, Y, respectively.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HMC 5583L技术规格启动时间I2C 控制准备时间200 µs输出速率:持续测量模式75 Hz 单⼀测量模式160 Hz~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 芯⽚引脚;⾃测为了检测HMC5883L 是否正常运⾏,传感器内部可产⽣标准磁场⽽进⾏的⾃测试,再去测量此标准磁场强度并输出。
1.原理图2.程序[1] 头文件1/****************************************Copyright (c)************************************************** **** ****--------------File Info-------------------------------------------------------------------------------** File name: 24C02.h** Descriptions: 24C02 操作函数库****------------------------------------------------------------------------------------------------------** Created by: A VRman** Created date: 2010-10-29** V ersion: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** V ersion:** Descriptions:********************************************************************************************************/ #ifndef __HMC5883L_H#define __HMC5883L_H/* Includes ------------------------------------------------------------------*/#include "stm32f10x_lib.h"#include "GrobalV ariable.h"/* Private define ------------------------------------------------------------*/#define A T24C01A /* 24C01A,I2C时序和往后的24C02一样*///#define A T24C01 /* 24C01,I2C的时序和普通的有点不同*/#define ADDR_24LC02 0xA0#define I2C_P AGESIZE 4 /* 24C01/01A页缓冲是4个*//* Private function prototypes -----------------------------------------------*/void I2C_Configuration(void);u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);///void HMC5883L_test(void);void Axia3AngInit(void) ;void Detect3AxiaAng(void);#endif/********************************************************************************************************* END FILE*********************************************************************************************************/ [2] 头文件2/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************* File Name : stm32f10x_i2c.h* Author : MCD Application T eam* V ersion : V2.0.1* Date : 06/13/2008* Description : This file contains all the functions prototypes for the* I2C firmware library.********************************************************************************* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME.* AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE* CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.*******************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/#ifndef __STM32F10x_I2C_H#define __STM32F10x_I2C_H/* Includes ------------------------------------------------------------------*/#include "stm32f10x_map.h"/* Exported types ------------------------------------------------------------*//* I2C Init structure definition */typedef struct{u16 I2C_Mode;u16 I2C_DutyCycle;u16 I2C_OwnAddress1;u16 I2C_Ack;u16 I2C_AcknowledgedAddress;u32 I2C_ClockSpeed;}I2C_InitTypeDef;/* Exported constants --------------------------------------------------------*/#define IS_I2C_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == I2C1_BASE) || \((*(u32*)&(PERIPH)) == I2C2_BASE))/* I2C modes */#define I2C_Mode_I2C ((u16)0x0000)#define I2C_Mode_SMBusDevice ((u16)0x0002)#define I2C_Mode_SMBusHost ((u16)0x000A)#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \((MODE) == I2C_Mode_SMBusDevice) || \((MODE) == I2C_Mode_SMBusHost))/* I2C duty cycle in fast mode */#define I2C_DutyCycle_16_9 ((u16)0x4000)#define I2C_DutyCycle_2 ((u16)0xBFFF)#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \((CYCLE) == I2C_DutyCycle_2))/* I2C cknowledgementy */#define I2C_Ack_Enable ((u16)0x0400)#define I2C_Ack_Disable ((u16)0x0000)#define IS_I2C_ACK_ST A TE(ST A TE) (((ST A TE) == I2C_Ack_Enable) || \((ST A TE) == I2C_Ack_Disable))/* I2C transfer direction */#define I2C_Direction_Transmitter ((u8)0x00)#define I2C_Direction_Receiver ((u8)0x01)#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \((DIRECTION) == I2C_Direction_Receiver))/* I2C acknowledged address defines */#define I2C_AcknowledgedAddress_7bit ((u16)0x4000)#define I2C_AcknowledgedAddress_10bit ((u16)0xC000)#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \((ADDRESS) == I2C_AcknowledgedAddress_10bit))/* I2C registers */#define I2C_Register_CR1 ((u8)0x00)#define I2C_Register_CR2 ((u8)0x04)#define I2C_Register_OAR1 ((u8)0x08)#define I2C_Register_OAR2 ((u8)0x0C)#define I2C_Register_DR ((u8)0x10)#define I2C_Register_SR1 ((u8)0x14)#define I2C_Register_SR2 ((u8)0x18)#define I2C_Register_CCR ((u8)0x1C)#define I2C_Register_TRISE ((u8)0x20)#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \((REGISTER) == I2C_Register_CR2) || \((REGISTER) == I2C_Register_OAR1) || \((REGISTER) == I2C_Register_OAR2) || \((REGISTER) == I2C_Register_DR) || \((REGISTER) == I2C_Register_SR1) || \((REGISTER) == I2C_Register_SR2) || \((REGISTER) == I2C_Register_CCR) || \((REGISTER) == I2C_Register_TRISE))/* I2C SMBus alert pin level */#define I2C_SMBusAlert_Low ((u16)0x2000)#define I2C_SMBusAlert_High ((u16)0xDFFF)#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \((ALERT) == I2C_SMBusAlert_High))/* I2C PEC position */#define I2C_PECPosition_Next ((u16)0x0800)#define I2C_PECPosition_Current ((u16)0xF7FF)#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \((POSITION) == I2C_PECPosition_Current))/* I2C interrupts definition */#define I2C_IT_BUF ((u16)0x0400)#define I2C_IT_EVT ((u16)0x0200)#define I2C_IT_ERR ((u16)0x0100)#define IS_I2C_CONFIG_IT(IT) ((((IT) & (u16)0xF8FF) == 0x00) && ((IT) != 0x00))/* I2C interrupts definition */#define I2C_IT_SMBALERT ((u32)0x10008000)#define I2C_IT_TIMEOUT ((u32)0x10004000)#define I2C_IT_PECERR ((u32)0x10001000)#define I2C_IT_OVR ((u32)0x10000800)#define I2C_IT_AF ((u32)0x10000400)#define I2C_IT_ARLO ((u32)0x10000200)#define I2C_IT_BERR ((u32)0x10000100)#define I2C_IT_TXE ((u32)0x00000080)#define I2C_IT_RXNE ((u32)0x00000040)#define I2C_IT_STOPF ((u32)0x60000010)#define I2C_IT_ADD10 ((u32)0x20000008)#define I2C_IT_BTF ((u32)0x60000004)#define I2C_IT_ADDR ((u32)0xA0000002)#define I2C_IT_SB ((u32)0x20000001)#define IS_I2C_CLEAR_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_STOPF) || \((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))/* I2C flags definition */#define I2C_FLAG_DUALF ((u32)0x00800000)#define I2C_FLAG_SMBHOST ((u32)0x00400000)#define I2C_FLAG_SMBDEF AUL T ((u32)0x00200000)#define I2C_FLAG_GENCALL ((u32)0x00100000)#define I2C_FLAG_TRA ((u32)0x00040000)#define I2C_FLAG_BUSY ((u32)0x00020000)#define I2C_FLAG_MSL ((u32)0x00010000)#define I2C_FLAG_SMBALERT ((u32)0x10008000)#define I2C_FLAG_TIMEOUT ((u32)0x10004000)#define I2C_FLAG_PECERR ((u32)0x10001000)#define I2C_FLAG_OVR ((u32)0x10000800)#define I2C_FLAG_AF ((u32)0x10000400)#define I2C_FLAG_ARLO ((u32)0x10000200)#define I2C_FLAG_BERR ((u32)0x10000100)#define I2C_FLAG_TXE ((u32)0x00000080)#define I2C_FLAG_RXNE ((u32)0x00000040)#define I2C_FLAG_STOPF ((u32)0x60000010)#define I2C_FLAG_ADD10 ((u32)0x20000008)#define I2C_FLAG_BTF ((u32)0x60000004)#define I2C_FLAG_ADDR ((u32)0xA0000002)#define I2C_FLAG_SB ((u32)0x20000001)#define IS_I2C_CLEAR_FLAG(FLAG) (((FLAG) == I2C_FLAG_SMBALERT) || ((FLAG) == I2C_FLAG_TIMEOUT) || \((FLAG) == I2C_FLAG_PECERR) || ((FLAG) == I2C_FLAG_OVR) || \((FLAG) == I2C_FLAG_AF) || ((FLAG) == I2C_FLAG_ARLO) || \((FLAG) == I2C_FLAG_BERR) || ((FLAG) == I2C_FLAG_STOPF) || \((FLAG) == I2C_FLAG_ADD10) || ((FLAG) == I2C_FLAG_BTF) || \((FLAG) == I2C_FLAG_ADDR) || ((FLAG) == I2C_FLAG_SB))#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \((FLAG) == I2C_FLAG_SMBDEF AUL T) || ((FLAG) == I2C_FLAG_GENCALL) || \((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \((FLAG) == I2C_FLAG_SB))/* I2C Events *//* EV1 */#define I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED ((u32)0x00060082) /* TRA, BUSY, TXE and ADDR flags */#define I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED ((u32)0x00020002) /* BUSY and ADDR flags */#define I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED ((u32)0x00860080) /* DUALF, TRA, BUSY and TXE flags */#define I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED ((u32)0x00820000) /* DUALF and BUSY flags */#define I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED ((u32)0x00120000) /* GENCALL and BUSY flags *//* EV2 */#define I2C_EVENT_SLA VE_BYTE_RECEIVED ((u32)0x00020040) /* BUSY and RXNE flags *//* EV3 */#define I2C_EVENT_SLA VE_BYTE_TRANSMITTED ((u32)0x00060084) /* TRA, BUSY, TXE and BTF flags *//* EV4 */#define I2C_EVENT_SLA VE_STOP_DETECTED ((u32)0x00000010) /* STOPF flag *//* EV5 */#define I2C_EVENT_MASTER_MODE_SELECT ((u32)0x00030001) /* BUSY, MSL and SB flag *//* EV6 */#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((u32)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((u32)0x00030002) /* BUSY, MSL and ADDR flags *//* EV7 */#define I2C_EVENT_MASTER_BYTE_RECEIVED ((u32)0x00030040) /* BUSY, MSL and RXNE flags *//* EV8 */#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((u32)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags *//* EV9 */#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((u32)0x00030008) /* BUSY, MSL and ADD10 flags *//* EV3_2 */#define I2C_EVENT_SLA VE_ACK_F AILURE ((u32)0x00000400) /* AF flag */#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_BYTE_RECEIVED) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \((EVENT) == I2C_EVENT_SLA VE_BYTE_TRANSMITTED) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \((EVENT) == I2C_EVENT_SLA VE_STOP_DETECTED) || \((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \((EVENT) == I2C_EVENT_SLA VE_ACK_F AILURE))/* I2C own address1 -----------------------------------------------------------*/#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF)/* I2C clock speed ------------------------------------------------------------*/#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000))/* Exported macro ------------------------------------------------------------*//* Exported functions ------------------------------------------------------- */void I2C_DeInit(I2C_TypeDef* I2Cx);void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GenerateST ART(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GenerateSTOP(I2C_T ypeDef* I2Cx, FunctionalState NewState);void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, u8 Address);void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_ITConfig(I2C_TypeDef* I2Cx, u16 I2C_IT, FunctionalState NewState);void I2C_SendData(I2C_TypeDef* I2Cx, u8 Data);u8 I2C_ReceiveData(I2C_TypeDef* I2Cx);void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, u8 Address, u8 I2C_Direction);u16 I2C_ReadRegister(I2C_TypeDef* I2Cx, u8 I2C_Register);void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, u16 I2C_SMBusAlert);void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, u16 I2C_PECPosition);void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState);u8 I2C_GetPEC(I2C_TypeDef* I2Cx);void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle);u32 I2C_GetLastEvent(I2C_TypeDef* I2Cx);ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT);FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, u32 I2C_FLAG);void I2C_ClearFlag(I2C_TypeDef* I2Cx, u32 I2C_FLAG);ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, u32 I2C_IT);void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, u32 I2C_IT);#endif /*__STM32F10x_I2C_H *//******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/[3] 源文件1/****************************************Copyright (c)****************************************************** ****--------------File Info-------------------------------------------------------------------------------** File name: 24C02.c** Descriptions: 24C02 操作函数库****------------------------------------------------------------------------------------------------------** Created by: A VRman** Created date: 2010-10-29** V ersion: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** V ersion:** Descriptions:********************************************************************************************************//* Includes ------------------------------------------------------------------*/#include "HMC5883L.h"#include "Grobalfunction.h"/******************************************************************************** Function Name : I2C_Configuration* Description : EEPROM管脚配置* Input : None* Output : None* Return : None* Attention : None*******************************************************************************/void I2C_Configuration(void){I2C_InitTypeDef I2C_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);/* Configure I2C1 pins: PB6->SCL and PB7->SDA */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;///6,7->8,9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_Init(GPIOB, &GPIO_InitStructure);I2C_DeInit(I2C1);I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x30;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100K速度*/I2C_Cmd(I2C1, ENABLE);I2C_Init(I2C1, &I2C_InitStructure);/*允许1字节1应答模式*/I2C_AcknowledgeConfig(I2C1, ENABLE);}/******************************************************************************* * Function Name : I2C_delay* Description : 延迟时间* Input : None* Output : None* Return : None* Attention : None*******************************************************************************/ static void I2C_delay(u16 cnt){while(cnt--);}/******************************************************************************* * Function Name : I2C_AcknowledgePolling* Description : 等待获取I2C总线控制权判断忙状态* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* Output : None* Return : None* Attention : None*******************************************************************************/ static void I2C_AcknowledgePolling(I2C_TypeDef *I2Cx,u8 I2C_Addr){vu16 SR1_Tmp;do{I2C_GenerateST ART(I2Cx, ENABLE); /*起始位*//*读SR1*/SR1_Tmp = I2C_ReadRegister(I2Cx, I2C_Register_SR1);/*器件地址(写)*/#ifdef A T24C01AI2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);#elseI2C_Send7bitAddress(I2Cx, 0, I2C_Direction_Transmitter);#endif}while(!(I2C_ReadRegister(I2Cx, I2C_Register_SR1) & 0x0002));I2C_ClearFlag(I2Cx, I2C_FLAG_AF);I2C_GenerateSTOP(I2Cx, ENABLE); /*停止位*/}/******************************************************************************** Function Name : I2C_Read* Description : 通过指定I2C接口读取多个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预读取字节存储位置* - *buf:读取数据的存储位置* - num:读取字节数* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num){///u16 angle;if(num==0)return 1;while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));/*允许1字节1应答模式*/I2C_AcknowledgeConfig(I2Cx, ENABLE);/* 发送起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*////#ifdef A T24C01A/*发送器件地址(写)*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/*发送地址*/I2C_SendData(I2Cx, addr);while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/ /*起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));/*器件读*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);/// while(1);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));///#else/*发送器件地址(读)24C01*//// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Receiver);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));///#endifwhile (num){if(num==1){I2C_AcknowledgeConfig(I2Cx, DISABLE); /* 最后一位后要关闭应答的*/ I2C_GenerateSTOP(I2Cx, ENABLE); /* 发送停止位*/return 0;}/*器件读*//// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */*buf = I2C_ReceiveData(I2Cx);buf++;/* Decrement the read bytes counter */num--;/// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));}/* 再次允许应答模式*/I2C_AcknowledgeConfig(I2Cx, ENABLE);return 0;}/******************************************************************************** Function Name : I2C_WriteOneByte* Description : 通过指定I2C接口写入一个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_WriteOneByte(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 value){/* 起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));///#ifdef A T24C01A/* 发送器件地址(写)*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/*发送地址*/I2C_SendData(I2Cx, addr);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));///#else/// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Transmitter);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); ///#endif/* 写一个字节*/I2C_SendData(I2Cx, value);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* 停止位*/I2C_GenerateSTOP(I2Cx, ENABLE);I2C_AcknowledgePolling(I2Cx,I2C_Addr);I2C_delay(1000);return 0;}/******************************************************************************** Function Name : I2C_Write* Description : 通过指定I2C接口写入多个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - *buf:预写入数据存储位置* - num:写入字节数* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num){u8 err=0;while(num--){if(I2C_WriteOneByte(I2Cx, I2C_Addr,addr++,*buf++)){err++;}}if(err)return 1;elsereturn 0;}//初始化HMC5883,根据需要请参考pdf进行修改****void Init_HMC5883(){///Single_Write_HMC5883(0x02,0x00); //I2C_WriteOneByte(I2C1,0x3c,0x02,0);}/************************************************************************************************************/ /******************************************************************************** Function Name : void Axia3AngInit(void).* Description : Read 3 axia angle data from HMC5883 then process the data.* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/void Axia3AngInit(void){I2C_Configuration();Init_HMC5883();}/************************************************************************************************************//************************************************************************************************************/ /******************************************************************************** Function Name : Detect3AxiaAng();* Description : Read 3 axia angle data from HMC5883 then process the data.* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/void Detect3AxiaAng(void){I2C_Read(I2C1,0x3C,0x03,BUF,7);//Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register/*//Get float dataAxia3Ang_xF=Axia3Ang_x*0.0 BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_zF=Axia3Ang_x* BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_yF=Axia3Ang_x* BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register// delay_ms(500);*/}//*********************************************************//主程序********//*********************************************************void HMC5883L_test(void ){ // bit sign_bit;///unsigned int i;///int x,y,z;///double angle;I2C_Configuration();Init_HMC5883();while(1) //循环{///// Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中///loop1:I2C_Read(I2C1,0x3C,0x03,BUF,7);////---------显示X轴delay_ms(10);/// goto loop1;/// while(1);Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output registerdelay_ms(500);/// angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees/// angle*=10;///conversion(angle); //计算数据和显示///for (i=0;i<10000;i++); //延时}}/********************************************************************************************************* END FILE*********************************************************************************************************/[4] 源文件4/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************* File Name : stm32f10x_i2c.c* Author : MCD Application T eam* V ersion : V2.0.1* Date : 06/13/2008* Description : This file provides all the I2C firmware functions.********************************************************************************* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME. * AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.*******************************************************************************//* Includes ------------------------------------------------------------------*/#include "stm32f10x_i2c.h"#include "stm32f10x_rcc.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* I2C SPE mask */#define CR1_PE_Set ((u16)0x0001)#define CR1_PE_Reset ((u16)0xFFFE)/* I2C ST ART mask */#define CR1_ST ART_Set ((u16)0x0100)#define CR1_ST ART_Reset ((u16)0xFEFF)/* I2C STOP mask */#define CR1_STOP_Set ((u16)0x0200)#define CR1_STOP_Reset ((u16)0xFDFF)/* I2C ACK mask */#define CR1_ACK_Set ((u16)0x0400)#define CR1_ACK_Reset ((u16)0xFBFF)/* I2C ENGC mask */#define CR1_ENGC_Set ((u16)0x0040)#define CR1_ENGC_Reset ((u16)0xFFBF)/* I2C SWRST mask */#define CR1_SWRST_Set ((u16)0x8000)#define CR1_SWRST_Reset ((u16)0x7FFF)/* I2C PEC mask */#define CR1_PEC_Set ((u16)0x1000)#define CR1_PEC_Reset ((u16)0xEFFF)/* I2C ENPEC mask */#define CR1_ENPEC_Set ((u16)0x0020)#define CR1_ENPEC_Reset ((u16)0xFFDF)/* I2C ENARP mask */#define CR1_ENARP_Set ((u16)0x0010)#define CR1_ENARP_Reset ((u16)0xFFEF)/* I2C NOSTRETCH mask */#define CR1_NOSTRETCH_Set ((u16)0x0080)。
this calibration will correct or compensate for the hard iron effects.hard iron effects are magnetic filed superimpositions on the earth's magnetic field that are fixed in magnitude and which do not depend on the orientation of the compass.the compass calibration shall be initiated by a user command that put the compass into the calibration mode. once in that mode the compass shall be rotated through 360 degrees abouth the forward or left direction followed by a 360 rotation about the up-down direction. that is, there are two full rotations required to complete the physical movement required. at the end of the rotations a command to end the calibration process shall be issued by the user to the compass.it is important to keep the forward (or left ) axis level during the first rotation and to keep the up-down axis vertical during the second calibration and until the flu calibration is complete. Failure to follow these process will result in less than optimal calibration and heading errors are likely.#define calthreshold 0int Xmax,Xmin,Ymax,Ymin,Zmax,Zmin;viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ)void Calibrate(int MagX, int MagY, int MagZ)void Compute_and_Save(void)void Hard_Iron_correction(int Xoff, int Yoff, int Zoff)viod Intialize_Cal_Variables(int MagX, int MagY, int MagZ){//set Max and Min values of the mag output to the current valuesXmax = MagX;Xmin = MagX;Ymax = MagY;Ymin = MagY;Zmax = MagZ;Zmin = MagZ;}void Calibrate(int MagX, int MagY, int MagZ){//this routine will capture the max and min values of the magX,Y,Z data while the //compass is being rotated 360 degrees through the level plane and the upright plane.//i.e. horizontal and vertical circles.//This function should be invoked while making continuous measurements//on the magnetometersint MagXreading,int MagYreading,int MagZreading;MagXreading = MagX;MagYreading = MagY;MagZreading = MagZ;if(MagXreading > Xmax) Xmax = MagXreading;if(MagXreading < Xmin) Xmin = MagXreading;if(MagYreading > Ymax) Ymax = MagYreading;if(MagXreading < Ymin) Ymin = MagXreading;if(MagZreading > Zmax) Zmax = MagZreading;if(MagXreading < Zmin) Zmin = MagXreading;}void Compute_and_Save(void){if(abs(Xmax - Xmin) > CalThreshold){Mag_UserCal_offset_X = (Xmax + Xmin)/2;//save parameters in EE}if(abs(Ymax - Ymin) > CalThreshold){Mag_UserCal_offset_Y = (Ymax + Ymin)/2;//save parameters in EE}if(abs(Zmax - Zmin) > CalThreshold){Mag_UserCal_offset_Z = (Zmax + Zmin)/2;//save parameters in EE}}void Hard_Iron_correction(int Xoff, int Yoff, int Zoff) {//call this function for correctionMagX -= Mag_UserCal_Offset_X;MagY -= Mag_UserCal_Offset_Y;MagZ -= Mag_UserCal_Offset_Z;}。
HMC5883L3轴数字罗盘IC--采用霍尼韦尔各向异性磁阻(AMR)技术物质在磁场中电阻率发生变化的现象称为磁阻效应,磁阻传感器利用磁阻效应制成。
磁场的测量可利用电磁效应,霍尔效应,磁阻效应等各种效应。
其中磁阻效应法发展最快,测量灵敏度最高。
磁阻传感器可用于直接测量磁场或磁场变化,如弱磁场测量,地磁场测量,各种导航系统中的罗盘,计算机中的磁盘驱动器,各种磁卡机等等。
也可以通过磁场变化测量其他物理量,如利用磁阻效应已制成各种位移、角度、转速传感器,各种接近开关,隔离开关,广泛用于汽车、家电及各类需要自动检测与控制的领域。
磁阻元件的发展经历了半导体磁阻(MR),各向异性磁阻(AMR),巨磁阻(GMR),庞磁阻(CMR)等阶段。
各向异性磁阻传感器AMR(Anisotropic Magneto-Resistive sensors)由沉积在硅片上的坡莫合金薄膜形成电阻,沉积时外加磁场,形成易磁化轴方向。
铁磁材料的电阻与电流方向和磁化方向的夹角有关,电流与磁化方向平行是电阻Rmax最大,电流与磁化方向垂直是电阻Rmin最小,电流与磁化方向成θ角时,电阻可表示为:在磁阻传感器中,为消除温度等外界因素对输出的影响,有4个相同的磁阻元件构成惠斯通电桥。
AMR各向异性磁电阻效应指铁磁金属或合金中,磁场平行电流和垂直电流方向电阻率发生变化的效应。
AMR各向异性传感器的基本单元是用一种长而薄的坡莫(Ni-Fe)合金用半导体工艺沉积在以硅衬底上制成的,沉积的时候薄膜以条带的形式排布,形成一个平面的线阵以增加磁阻的感知磁场的面积。
外加磁场使得磁阻内部的磁畴指向发生变化,进而与电流的夹角θ发生变化,就表现为磁阻电阻各向异性的变化。
(1)服从式(1)中:Rmin为电流方向与磁化方向垂直时的电阻值;Rmax为电流方向与磁化方向平行时的电流值。
从图1可以清楚地看到,当电流方向与磁化方向平行时,传感器最敏感。
而一般磁阻都工作于图中45°线性区附近,这样可以实现输出的线性特性。
3轴电子罗盘ICHMC5883L霍尼韦尔HMC5883L是一种表面贴装,拥有多芯片模块的低场设计的磁感应与数字接口,可应用于低成本的罗盘和磁学。
该HMC5883L包括我们国家的最先进的高精度HMC118X系列磁阻传感器以及一个专用放大集成电路,自动消磁,偏移取消,以及一个12位ADC,使罗盘航向精确度达到1°〜2 °。
Iic串行总线是一种简便接口。
该HMC5883L是3.0x3.0x0.9mm表面贴装16引脚无引线芯片载体(LCC)的。
HMC5883L的应用领域包括移动手机、上网本、消费电子、自动导航系统以及个人导航装置。
该HMC5883L采用霍尼韦尔各向异性磁阻(AMR)技术,带技术在磁传感器领域处于领先地位。
这种各向异性,方向传感器具有高轴向灵敏度和线性度。
这些传感器的固态与极低的交叉轴灵敏度建设,是用来衡量的方向和地球的磁场强度从毫高斯8高斯。
霍尼韦尔的磁传感器是最敏感和可靠的低磁场在工业中的传感器。
特征:1.3轴和磁阻传感器, 3.0x3.0x0.9mm LCC的表面ASIC封装2.12位ADC并且具有低噪声各向异性磁阻传感器实现5毫高斯灵敏度,量程± 8高斯磁场3.内建自测试功能4.低电压(2.16-3.6V)低功耗(100微安)5.内置式皮带驱动电路6.Iic数字接口7.无铅封装8.宽量程(正负8高斯)9.可用的软件和算法支持10.最大160赫兹的数据输出率优点:1.小尺寸高集成度产品。
大批量生产只需添加微控制器接口、两个贴片电容,低成本OEM封装,易于安装,适合高速SMT组装2.达到1 °-2 °度罗盘航向精度3.发布会后允许低功耗功能测试4.适用于电池供电的装置5.设置/复位和偏移消磁,自我测试带驱动程序,偏移补偿6.大众化的两线串行数据接口的消费电子产品7.RoHS认证8.传感器在强磁场的环境下可达到1 °-2 °度罗盘航向精度9.罗盘指向,软硬件和自动校准库10.行人导航和LBS应用规格:表1 :引脚配置箭头指示的方向,产生磁场,在正常的测量配置输出读数。