1、HMC5883L通过IIC总线与主机进行通信,其IIC控制字节地址如下
7-bit地址 | 0x1E | 0001 1110 |
8-bit读取地址 | 0x3D | 0011 1101 |
8-bit写入地址 | 0x3C | 0011 1100 |
HMC5883L IIC接口特性说明:
HMC5883L作为一个IIC兼容装置,该装置包含一个7-bit串行地址,并支持IIC协议。HMC5883L可以支持标准和快速模式,分别为100kHz和400kHz,但不支持高速模式(Hs)。
要求主机的活动(寄存器读取和写入)优先于内部活动,例如测量,这一优先次序的安排是为了不让主机等待,同时IIC总线占用的事件比必须的时间长。
2、HMC5883L一些引脚说明
VCC | 2.16V-3.6V |
GND | |
SCL | 串行时钟——IIC总线主/从时钟 |
SDA | 串行数据——IIC总线主/从数据 |
DRDY | 数据准备,中断引脚,内部被拉高,选项为连接,当数据位于输出寄存器上时会在低电位上停250us |
3、HMC5883L寄存器说明
地址 | 名称 | 访问 | 默认值 |
00 | 配置寄存器A(Configuration Register A) | 读/写 | 1111 0000(CRA) |
01 | 配置寄存器B(Configuration Register B) | 读/写 | 0010 0000 |
02 | 模式寄存器(Mode Register) | 读/写 | 1000 0001(默认为单一测量模式) |
03 | 数据输出X MSB寄存器(Data Output X MSB Register) | 读 | 0000 0000 |
04 | 数据输出X LSB寄存器(Data Output X LSB Register) | 读 | 0000 0000 |
05 | 数据输出Z MSB寄存器(Data Output Z MSB Register) | 读 | 0000 0000 |
06 | 数据输出Z LSB寄存器(Data Output Z LSB Register) | 读 | 0000 0000 |
07 | 数据输出Y MSB寄存器(Data Output Y MSB Register) | 读 | 0000 0000 |
08 | 数据输出Y LSB寄存器(Data Output Y LSB Register) | 读 | 0000 0000 |
09 | 状态寄存器(Status Register) | 读 | 0000 0000 |
10 | 识别寄存器A(Identification Register A) | 读 | 0100 1000(ASCII值为H) |
11 | 识别寄存器B(Identification Register B) | 读 | 0011 0100(ASCII值为4) |
12 | 识别寄存器C(Identification Register C) | 读 | 0011 0011(ASCII值为3) |
4、HMC5883L读写说明
HMC5883L利用地址指针来说明读取或者写入的寄存器位置。这些指针由主机发往从机,并且跟在7-bit地址和1-bit读/写控制位之后。
下面以读数据为例说明HMC5883L IIC读取数据时应该进行的操作时序。
1、发送从器件控制字节0x3C(写入操作)。注意,此操作之后主机再往从机发送的数据就是主机写入从机的数据
2、发送数据3(由器件手册可知,3为数据输出X MSB寄存器的地址)。此操作也就是写想要读取数据的寄存器地址。
3、发送从器件控制字节0x3D(读取操作)。注意,此操作之后从机便向主机发送步骤2所发送的地址处的数据。
4、将从器件发送过来的数据写入相应的数组。
关于HMC5883L读数据需要作如下说明。
HMC5883L为了尽可能减少主机与从机之间的通信,地址指针会在不需要主机干涉的情况下自动更新。这种自动更新的地址更新有两种附加的特性。
1、当访问12或者更高的地址时,指针会自动更新到00。也就是返回首寄存器的地址。
2、当指针达到08时,指针回滚到地址03。也就是说此时指针一直在6个数据寄存器之间滚动,从机一直滚动向主机发送数据。
To move the address pointer to a random register location, first issue a “write” to that register location with no data byte following the commend. For example, to move the address pointer to register 10, send 0x3C 0x0A.
为了将地址指针移动到随机的寄存器地址,首先应该发送写指令,之后再跟一个无数据字节(在这里我自己理解我所要移动到随机的寄存器的地址)。例如,要将地址指针移动到寄存器10 ,就发送0x3C 0x0A。
0x3C为HMC5883L的写控制字节,告诉从机下一个发送的字节为写入到从机的字节。
0x0A为HMC5883L的寄存器10的地址,此时地址指针就指向寄存器10了。如果要进行读操作,则发送HMC5883L的读控制字节0x3D,然后从机将会发送相应的寄存器中的数据返回至主机。如果要进行写操作,则发送HMC5883L的写控制字节0x3C,然后再发送的数据就会写入当前指针指向的寄存器。
读 |