找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1618|回复: 0
打印 上一主题 下一主题
收起左侧

STM32通过IIC协议使用MPU6050源程序

[复制链接]
跳转到指定楼层
楼主
ID:640768 发表于 2021-8-6 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /********************************************

  2. * 硬件连接:-----------------
  3. *          |                 |
  4. *          |  PB6-I2C1_SCL                |
  5. *          |  PB7-I2C1_SDA   |
  6. *          |                 |
  7. *           -----------------
  8. * 库版本  :ST3.5.0
  9. * 作者    : Orange
  10. **********************************************************************************/
  11. #include "I2C_MPU6050.h"

  12. /*
  13. * 函数名:I2C_GPIO_Config
  14. * 描述  :I2C1 I/O配置
  15. * 输入  :无
  16. * 输出  :无
  17. * 调用  :内部调用
  18. */
  19. static void I2C_GPIO_Config(void)
  20. {
  21.         GPIO_InitTypeDef GPIO_InitStructure;
  22.         
  23.                 /* 使能与 I2C1 有关的时钟 */
  24.         RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOB,ENABLE );
  25.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  

  26.          /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  27.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  28.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  31. }


  32. /*
  33. * 函数名:I2C_Mode_Config
  34. * 描述  :I2C 工作模式配置
  35. * 输入  :无
  36. * 输出  :无
  37. * 调用  :内部调用
  38. */
  39. static void I2C_Mode_Config(void)
  40. {
  41.          /* Initialize the I2C1 according to the I2C_InitStructure members */
  42.         I2C_InitTypeDef I2C_InitStructure;
  43.          
  44.           /* I2C 配置 */
  45.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;
  46.         //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  47.         //I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress;
  48.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  49.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  50.         I2C_InitStructure.I2C_ClockSpeed = 50000;


  51.         /* I2C1 初始化 */
  52.         I2C_Init(I2C1, &I2C_InitStructure);           
  53.         
  54.         /* 使能 I2C1 */
  55.         I2C_Cmd  (I2C1,ENABLE);
  56.         /*允许应答模式*/
  57.         I2C_AcknowledgeConfig(I2C1, ENABLE);   
  58. }
  59. /***************************************************************************************/
  60. /*
  61. * 函数名:I2C_MMA_Init
  62. * 描述  :I2C 外设(MMA7455)初始化
  63. * 输入  :无
  64. * 输出  :无
  65. * 调用  :外部调用
  66. */
  67. void I2C_MPU6050_Init(void)
  68. {           
  69.          I2C_GPIO_Config();
  70.         I2C_Mode_Config();
  71. }  

  72. /*
  73. * 函数名:I2C_ByteWrite
  74. * 描述  :写一个字节到I2C设备寄存器中
  75. * 输入  :REG_Address 接收数据的IIC设备寄存器的地址
  76. *         REG_data 待写入的数据
  77. * 输出  :无
  78. * 返回  :无
  79. * 调用  :内部调用
  80. */        
  81. void I2C_ByteWrite(uint8_t REG_Address,uint8_t REG_data)
  82. {

  83. I2C_GenerateSTART(I2C1,ENABLE);

  84. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

  85. I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);

  86. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  87. I2C_SendData(I2C1,REG_Address);

  88. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  89. I2C_SendData(I2C1,REG_data);

  90. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  91. I2C_GenerateSTOP(I2C1,ENABLE);

  92. }


  93. /*
  94. * 函数名:I2C_ByteRead
  95. * 描述  :从IIC设备寄存器中读取一个字节
  96. * 输入  :REG_Address 读取数据的寄存器的地址
  97. * 输出  :无
  98. * 返回  :无
  99. * 调用  :内部调用
  100. */
  101. uint8_t I2C_ByteRead(uint8_t REG_Address)
  102. {
  103. uint8_t REG_data;

  104. while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

  105. I2C_GenerateSTART(I2C1,ENABLE);//起始信号

  106. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

  107. I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);//发送设备地址+写信号

  108. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//

  109. I2C_Cmd(I2C1,ENABLE);

  110. I2C_SendData(I2C1,REG_Address);//发送存储单元地址,从0开始

  111. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  112. I2C_GenerateSTART(I2C1,ENABLE);//起始信号

  113. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

  114. I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Receiver);//发送设备地址+读信号

  115. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

  116. I2C_AcknowledgeConfig(I2C1,DISABLE);

  117. I2C_GenerateSTOP(I2C1,ENABLE);

  118. while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));

  119. REG_data=I2C_ReceiveData(I2C1);//读出寄存器数据

  120. return REG_data;

  121. }

  122. /*
  123. * 函数名:void InitMPU6050(void)
  124. * 描述  :初始化Mpu6050
  125. * 输入  :无
  126. * 输出  :无
  127. * 调用  :外部调用
  128. */
  129. void InitMPU6050(void)
  130. {
  131.         I2C_ByteWrite(PWR_MGMT_1,0x00);//解除休眠状态
  132.         I2C_ByteWrite(SMPLRT_DIV,0x07);
  133.         I2C_ByteWrite(CONFIG,0x06);
  134.         I2C_ByteWrite(GYRO_CONFIG,0x18);
  135.         I2C_ByteWrite(ACCEL_CONFIG,0x01);

  136. }


  137. /*
  138. * 函数名:GetData
  139. * 描述  :获得16位数据
  140. * 输入  :REG_Address 寄存器地址
  141. * 输出  :返回寄存器数据
  142. * 调用  :外部调用
  143. */

  144. unsigned int GetData(unsigned char REG_Address)
  145. {
  146.         char H,L;
  147.         H=I2C_ByteRead(REG_Address);
  148.         L=I2C_ByteRead(REG_Address+1);
  149.         return (H<<8)+L;   //合成数据
  150. }
复制代码

初学电子,如有错误,请大家多多指导,资料仅供参考: MPU6050(硬件IIC).zip (294.78 KB, 下载次数: 26)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表