MPU6050 I2C master模式调试记录

http://blog.csdn.net/airk000/article/details/22945573

MPU6050这个芯片是可以最多外挂5个其他的sensor的(好强大!),所以在将MPU6050调通后也理应对这一部分进行调试,废话不多说,开始说我的调试过程。本文中对i2cset的使用简写,没有总线号和其他参数,读者请自行查阅,相信很好理解的。

调试过程

  • 使能MPU6050。因为MPU6050上点后为sleep状态,所以要首先对其进行使能,让他开始正常工作。如果不这样,那么其他的寄存器也将无法写入值,也就无法开展之后的工作,所以这里一定是先将mpu6050从sleep状态中拉出来: 
[html] view plain copy
 
  1. i2cset 0x68 0x6B 0  
  • 使能MPU6050 I2C MASTER模式。  
[html] view plain copy
 
  1. i2cset 0x68 0x6A 0x20  
  • 设置MPU6050作为master的I2C速率(400kHz),因为外挂子传感器为HMC5883L,其spec中说明其支持400kHz I2C速率,所以设置成这个。当然MPU6050的master模式还有其他很多速率,请自行查阅spec。 
[html] view plain copy
 
  1. i2cset 0x68 0x24 0x0D  //只设置速率  

or  

[html] view plain copy
 
  1. i2cset 0x68 0x24 0x4D  //设置速率同时,设置子模块数据等待中断  
  • 设置SLV0地址,我将HMC5883L设置为其SLV0设备,当然,连线都是一样的。  
[html] view plain copy
 
  1. i2cset 0x68 0x25 0x1E  //写  

or  

[html] view plain copy
 
  1. i2cset 0x68 0x25 0x9E  //读  

读写是由0x25寄存器的bit7控制的。

  • 设置SLV0设备要操作的寄存器,读写都是设置这里。 
[html] view plain copy
 
  1. i2cset 0x68 0x26 0x02  //HMC5883L的工作模式寄存器  
  • 如果是向子设备写数据,那么要将需要写的数据设置好。  
[html] view plain copy
 
  1. i2cset 0x68 0x63 0x00  //HMC5883L连续测量  
  • 设置数据操作个数 
[html] view plain copy
 
  1. i2cset 0x68 0x27 0x01  //我要写一个数据到HMC5883L  
  • 使能子设备操作  
[html] view plain copy
 
  1. i2cset 0x68 0x27 0x81 //这里8是为了使能,1还是操作个数的意思,为了保险,这样肯定行,亲测有效~  

这里需要注意的是:在使能子设备后,MPU6050会以MASTER的身份去对HMC5883L进行操作,这个时候如果用i2cdump等对MPU6050操作是会显示忙的状态的。我调试中的用法是,在使能子设备后,关闭使能,然后MPU6050的master身份结束,可以对其进行正常操作,而数据的操作也已经完成(400kHz呢,瞬间的事)。

实例列举

这样一次完整的以MPU6050为master,以其外挂设备为slave设备的通讯动作就完成了。之后的每次通讯动作以从地址设置为起点,至时能开与关为一个循环。下边再举两个例子就能理解了,比如我现在要去读取HMC5883L的版本信息“H43",那么我的步骤是:

  • 设置地址,读。  
[html] view plain copy
 
  1. i2cset 0x68 0x25 0x9E  
  • 设置所要读取的寄存器起始位置  
[html] view plain copy
 
  1. i2cset 0x68 0x26 0x0A  
  • 告诉MPU6050从这个起始位置向后读几个  
[html] view plain copy
 
  1. i2cset 0x68 0x28 0x03  
  • 使能 
[html] view plain copy
 
  1. i2cset 0x68 0x28 0x83  
  • 关闭使能
[html] view plain copy
 
  1. i2cset 0x68 0x28 0x03  

操作完成。这个时候,通过i2cdump对mpu6050内部寄存器进行查看,slv0的数据存储起始在0x49。

[html] view plain copy
 
  1. root@arm:/home/debian# i2cdump -y 1 0x68  
  2. No size specified (using byte-data access)  
  3.      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef  
  4. 00: fd 7b 7e 92 52 24 ff 54 03 8d 04 9a 28 50 50 b7    ?{~?R$.T????(PP?  
  5. 10: 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    %...............  
  6. 20: 00 00 00 00 4d 9e 0a 03 00 00 00 00 00 00 00 00    ....M???........  
  7. 30: 00 00 00 00 00 00 00 00 00 00 01 40 d0 00 30 ff    ..........?@?.0.  
  8. 40: 94 f4 f0 ff c9 00 0b 00 66 48 34 33 00 00 00 00    ???.?.?.fH43....  
  9. 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................  

可以看到,0x49起始后连续的3个寄存器值为48 34 33,16进制码,对应ASCII符号就是 H43,说明这个操作没有错,我们读对了。读其传感器数据也是一样的,这里就不再举例了,无非就是起始位置寄存器地址为0x03,数量为6。其他完全一样,读取出来的数据就是从MPU6050内部寄存器的0x49开始占6个寄存器。

注意

个人认为这里唯一需要格外注意的时候就是子设备使能开关的切换问题,在MPU6050的子设备使能的时候MPU6050对于CPU来说是忙状态的。在等待数据读取完成后,关闭其子设备使能开关,CPU才能够对MPU6050进行正常的操作。如果是少量数据的读取,手工等待然后关闭使能应该都是没有问题的。但是如果是大量数据的读取应该就要依靠中断的帮忙了,在MPU6050的中断设置中也可以通过配置达到对子设备数据就绪的中断,这样在CPU依靠外部中断响应来关闭MPU6050子设备使能,这样就能够准确的掌握时机,既不浪费时间,也不会因为提早对其进行操作而出现延时了。

原文地址:https://www.cnblogs.com/lamblabs/p/8489635.html