MPU6050作为从机地址设置的疑问

2020-01-13 18:31发布

我知道I2C通讯的时候最低位地址是决定读写的,但是我看到有两组地址,一组是0x68和0x69,一组是0xd0和0xd1。我看见别人51的设置的是0xD0,但是看到数据手册又是0x68。
1.png (28.59 KB, 下载次数: 0) 下载附件 2014-5-11 11:48 上传
疑问1:究竟这两个地址那个是I2C从机地址?
疑问2:另一个地址究竟是什么?做什么用的?
新手上路,请大神多多指教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
37条回答
jiang887786
2020-01-14 15:23
10xjzheng 发表于 2014-5-14 19:39
我觉得懂I2C的原理就可以了,模拟时序我觉得可以不要亲自去做,或者做一两个就好,直接网上找程序,如果 ...

谢谢,我是飞思卡尔的单片机,你的代码我可能不好用,我发现是红 {MOD}部分的问题,我修改了读字节的部分,写字节的根本没动!现在连ACK都没有返回了。不知道问题在哪了!我擦!
  1. /** ###################################################################
  2. **     Filename  : XD256_MPU6050_TEST.c
  3. **     Project   : XD256_MPU6050_TEST
  4. **     Processor : MC9S12XD256BCPV
  5. **     Version   : Driver 01.14
  6. **     Compiler  : CodeWarrior HCS12X C Compiler
  7. **     Date/Time : 2014-5-12, 17:25
  8. **     Abstract  :
  9. **         Main module.
  10. **         This module contains user's application code.
  11. **     Settings  :
  12. **     Contents  :
  13. **         No public methods
  14. **
  15. ** ###################################################################*/
  16. /* MODULE XD256_MPU6050_TEST */

  17. /* Including needed modules to compile this module/procedure */
  18. #include "Cpu.h"
  19. #include "Events.h"
  20. /* Include shared modules, which are used for whole project */
  21. #include "PE_Types.h"
  22. #include "PE_Error.h"
  23. #include "PE_Const.h"
  24. #include "IO_Map.h"  
  25. #include "MPU6050.h"

  26. /* User includes (#include below this line is not maintained by Processor Expert) */

  27. #define SCL PTJ_PTJ7
  28. #define SDA PTJ_PTJ6
  29. #define SCL_dir DDRJ_DDRJ7
  30. #define SDA_dir DDRJ_DDRJ6

  31. #define somenop(); asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
  32.                    asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
  33.                    asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
  34.                    asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");

  35. /****************************************/
  36. // 定义MPU6050内部地址
  37. //****************************************/
  38. #define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
  39. #define        CONFIG                          0x1A        //低通滤波频率,典型值:0x06(5Hz)
  40. #define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  41. #define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
  42. #define        ACCEL_XOUT_H        0x3B
  43. #define        ACCEL_XOUT_L        0x3C
  44. #define        ACCEL_YOUT_H        0x3D
  45. #define        ACCEL_YOUT_L        0x3E
  46. #define        ACCEL_ZOUT_H        0x3F
  47. #define        ACCEL_ZOUT_L        0x40
  48. #define        TEMP_OUT_H                0x41
  49. #define        TEMP_OUT_L                0x42
  50. #define        GYRO_XOUT_H                0x43
  51. #define        GYRO_XOUT_L                0x44       
  52. #define        GYRO_YOUT_H                0x45
  53. #define        GYRO_YOUT_L                0x46
  54. #define        GYRO_ZOUT_H                0x47
  55. #define        GYRO_ZOUT_L                0x48
  56. #define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)
  57. #define        WHO_AM_I                        0x75        //IIC地址寄存器(默认数值0x68,只读)
  58. #define        SlaveAddress        0xd0        //IIC写入时的地址字节数据,+1为读取

  59. int        Temperature,Temp_h,Temp_l;        //温度及高低位数据
  60. unsigned int ACCEL_XOUT,ACCEL_YOUT,ACCEL_ZOUT,GYRO_XOUT,GYRO_YOUT,GYRO_ZOUT;
  61. //****************************************
  62. //函数声明
  63. //****************************************
  64. //MPU6050操作函数
  65. void  InitMPU6050();                                                                                                        //初始化MPU6050



  66. /*************************************************************/
  67. /*                        初始化IIC                          */
  68. /*************************************************************/
  69. void INIT_IIC(void)
  70. {

  71. SCL_dir = 1;
  72. SCL_dir = 1;
  73. SCL = 1;
  74. SDA = 1;
  75. }

  76. /*************************************************************/
  77. /*                         启动IIC                           */
  78. /*************************************************************/
  79. void I2Cstart(void)
  80. {
  81.   SCL_dir = 1;
  82.   SDA_dir = 1;
  83.   SDA = 1;
  84.   somenop();
  85.   SCL = 1;
  86.   somenop();
  87.   somenop();
  88.   SDA = 0;
  89.   somenop();
  90.   somenop();
  91.   SCL = 0;
  92. }

  93. /*************************************************************/
  94. /*                       IIC发送数据                         */
  95. /*************************************************************/
  96. void I2Csend(byte data)
  97. {
  98. unsigned char i=8;
  99. SCL_dir = 1;
  100. SDA_dir = 1;
  101. while(i)
  102. {
  103.       SCL = 0;  
  104.       somenop();
  105.       SDA=(data&0x80)>>7;
  106.       data<<=1;
  107.       somenop();
  108.       SCL = 1;
  109.       somenop();
  110.       somenop();
  111.       i--;     
  112. }
  113. SCL = 0;
  114. SDA_dir = 0;
  115. }

  116. /*************************************************************/
  117. /*                       IIC接收数据                         */
  118. /*************************************************************/
  119. unsigned char I2Creceive(void)
  120. {
  121. unsigned char i=8;
  122. unsigned char data=0;

  123. SCL_dir = 1;
  124. SDA_dir = 0;
  125. while(i)
  126. {
  127.       SCL = 0;  
  128.       somenop();
  129.       somenop();
  130.       SCL = 1;
  131.       somenop();
  132.       data<<=1;
  133.       data|=SDA;
  134.       somenop();
  135.       i--;     
  136. }
  137. SCL = 0;
  138. return(data);
  139. }

  140. /*************************************************************/
  141. /*                      IIC读取应答位                        */
  142. /*************************************************************/
  143. byte I2Creadack(void)
  144. {
  145.   unsigned int i=0;
  146.   SCL_dir = 1;
  147.   SDA_dir = 0;
  148.   SCL = 0;
  149.   somenop();
  150.   somenop();
  151.   SCL = 1;
  152.   somenop();
  153.   if(SDA == 1)
  154.   {
  155.   for(;;) if(++i>=20000)
  156.   return 0xff;}
  157.   somenop();
  158.   SCL = 0;
  159.   somenop();
  160.   somenop();
  161.   return 0;
  162. }

  163. /*************************************************************/
  164. /*                      IIC发送应答位                        */
  165. /*************************************************************/
  166. void I2Csendack(void)
  167. {
  168.   SCL_dir = 1;
  169.   SDA_dir = 1;
  170.   SCL = 0;
  171.   somenop();
  172.   SDA = 0;
  173.   somenop();
  174.   SCL = 1;
  175.   somenop();
  176.   somenop();
  177.   SCL = 0;
  178.   somenop();
  179.   somenop();
  180. }

  181. /*************************************************************/
  182. /*                         停止IIC                           */
  183. /*************************************************************/
  184. void I2Cstop(void)
  185. {
  186.   SCL = 0;
  187.   SDA = 0;
  188.   SCL_dir = 1;
  189.   SDA_dir = 1;
  190.   SCL = 0;
  191.   SDA = 0;
  192.   somenop();
  193.   somenop();
  194.   SCL = 1;
  195.   somenop();
  196.   SDA = 1;
  197.   somenop();
  198.   somenop();
  199.   SCL_dir = 0;
  200.   SDA_dir = 0;
  201. }
  202. //**************************************
  203. //向I2C设备写入一个字节数据
  204. //**************************************
  205. byte Single_WriteI2C(byte address,byte REG,byte value){
  206.   I2Cstart();//启动总线开始发送数据
  207.   I2Csend(address) ;//发送要接受数据的器件地址
  208.     if (I2Creadack())
  209.   return 0xff;    //读取应答码
  210.   I2Csend(REG) ;//发送要写入寄存器的地址
  211.     if (I2Creadack())
  212.   return 0xff;    //读取应答码
  213.   I2Csend(value) ; //发送要写入寄存器的参数值
  214.     if (I2Creadack())
  215.   return 0xff;    //读取应答码
  216.   I2Cstop();
  217.   return 0;

  218. }
  219. //**************************************
  220. //向I2C设备读取一个字节数据
  221. //**************************************
  222. byte Single_ReadI2C(byte address,byte REG){
  223. byte value;
  224.   I2Cstart();//启动总线开始发送数据
  225.   I2Csend(address) ;//发送要接受数据的器件地址
  226.     if (I2Creadack())
  227.   return 0xff;    //读取应答码
  228.   I2Csend(REG) ;//发送要写入寄存器的地址
  229.     if (I2Creadack())
  230.   I2Cstart();//启动总线开始发送数据
  231.   I2Csend(address+1) ;//发送要接受数据的器件地址
  232.     if (I2Creadack())     
  233.   return 0xff;    //读取应答码
  234. value=I2Creceive() ; //发送要写入寄存器的参数值
  235.   I2Cstop();
  236.   return value;

  237. }

  238. //初始化MPU6050
  239. //**************************************
  240. void InitMPU6050()
  241. {
  242.         Single_WriteI2C(SlaveAddress,PWR_MGMT_1, 0x00);        //解除休眠状态
  243.         Single_WriteI2C(SlaveAddress,SMPLRT_DIV, 0x07);
  244.         Single_WriteI2C(SlaveAddress,CONFIG, 0x06);
  245.         Single_WriteI2C(SlaveAddress,GYRO_CONFIG, 0x18);
  246.         Single_WriteI2C(SlaveAddress,ACCEL_CONFIG, 0x01);
  247. }


  248. //**************************************
  249. //合成数据
  250. //**************************************
  251. int GetData(unsigned char REG_Address)
  252. {
  253. volatile unsigned        int H,L;
  254.         H=Single_ReadI2C(SlaveAddress,REG_Address);
  255.         L=Single_ReadI2C(SlaveAddress,REG_Address+1);
  256.         return H=(H<<8)|L;   //合成数据
  257. }


  258. void main(void)
  259. {
  260.   /* Write your local variable definition here */

  261.   /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  262.   PE_low_level_init();
  263.   /*** End of Processor Expert internal initialization.                    ***/

  264.   /* Write your code here */
  265.   INIT_IIC()  ;
  266.    InitMPU6050();
  267.    
  268.    for(;;){
  269.     ACCEL_XOUT=GetData(ACCEL_XOUT_H);        //显示X轴加速度
  270.                 ACCEL_YOUT=GetData(ACCEL_YOUT_H);        //显示Y轴加速度
  271.                 ACCEL_ZOUT=GetData(ACCEL_ZOUT_H);        //显示Z轴加速度
  272.                 GYRO_XOUT=GetData(GYRO_XOUT_H);        //显示X轴角速度
  273.                 GYRO_YOUT=GetData(GYRO_YOUT_H);        //显示Y轴角速度
  274.                 GYRO_ZOUT=GetData(GYRO_ZOUT_H);        //显示Z轴角速度
  275.    
  276.    }
  277.   /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  278.   for(;;){}
  279.   /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
  280. } /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

  281. /* END XD256_MPU6050_TEST */
  282. /*
  283. ** ###################################################################
  284. **
  285. **     This file was created by Processor Expert 3.02 [04.44]
  286. **     for the Freescale HCS12X series of microcontrollers.
  287. **
  288. ** ###################################################################
  289. */
复制代码

一周热门 更多>