当前位置:   article > 正文

STM32 I2C

STM32 I2C

目录

I2C通信

 软件I2C读写MPU6050

I2C通信外设

硬件I2C读写MPU6050


I2C通信

R/W:0写1读

十轴:3轴加速度,3轴角速度,3轴磁场强度和一个气压强度

 软件I2C读写MPU6050

MyI2C.c

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. /**
  4. * @brief 为I2C的SCL线写入数据
  5. * @param BitValue:要写入的数据
  6. * @retval 无
  7. */
  8. void MyI2C_W_SCL(uint8_t BitValue)
  9. {
  10. GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)BitValue);
  11. Delay_us(10);//防止引脚反转速度过快,外设跟不上
  12. }
  13. /**
  14. * @brief 为I2C的SDA线写入数据
  15. * @param BitValue:要写入的数据
  16. * @retval 无
  17. */
  18. void MyI2C_W_SDA(uint8_t BitValue)
  19. {
  20. GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)BitValue);
  21. Delay_us(10);//防止引脚反转速度过快,外设跟不上
  22. }
  23. /**
  24. * @brief 读取I2C的SDA线中的数据
  25. * @param 无
  26. * @retval SDA中的数据
  27. */
  28. uint8_t MyI2C_R_SDA(void)
  29. {
  30. uint8_t BitValue;
  31. BitValue = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
  32. Delay_us(10);
  33. return BitValue;
  34. }
  35. /**
  36. * @brief 初始化GPIO引脚
  37. * @param 无
  38. * @retval 无
  39. */
  40. void MyI2C_Init(void)
  41. {
  42. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  43. GPIO_InitTypeDef GPIO_InitStructure;
  44. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//配置为开漏输出
  45. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  46. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47. GPIO_Init(GPIOB,&GPIO_InitStructure);
  48. GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
  49. //将SCL与SDA初始置为高电平(空闲)
  50. }
  51. /**
  52. * @brief 开启I2C通信
  53. * @param 无
  54. * @retval 无
  55. */
  56. void MyI2C_Start(void)
  57. {
  58. MyI2C_W_SDA(1);
  59. MyI2C_W_SCL(1);
  60. //将两根线都置为高电平,准备开始时序
  61. MyI2C_W_SDA(0);
  62. MyI2C_W_SCL(0);
  63. //先将SDA拉低,再将SCL拉低形成起始条件
  64. }
  65. /**
  66. * @brief 终止I2C通信
  67. * @param 无
  68. * @retval 无
  69. */
  70. void MyI2C_Stop(void)
  71. {
  72. MyI2C_W_SDA(0);
  73. //确保SDA能产生上升沿,先进行拉低
  74. MyI2C_W_SCL(1);
  75. MyI2C_W_SDA(1);
  76. //在SCL处于高电平时,SDA产生上升沿形成终止条件
  77. }
  78. /**
  79. * @brief 使用I2C发送一个字节
  80. * @param Byte:发送的字节数据
  81. * @retval 无
  82. */
  83. void MyI2C_SendByte(uint8_t Byte)
  84. {
  85. uint8_t i;
  86. for(i = 0;i<8;i++)
  87. {
  88. MyI2C_W_SDA(Byte & (0x80 >> i));//取出最高位
  89. //即使进行运算后结果为0x80,写入的还是只有1
  90. MyI2C_W_SCL(1);//释放SCL进行发送
  91. MyI2C_W_SCL(0);//结束一次发送
  92. }
  93. }
  94. /**
  95. * @brief 使用I2C接收一个字节
  96. * @param 无
  97. * @retval 接收到的字节数据
  98. */
  99. uint8_t MyI2C_ReceiveByte(void)
  100. {
  101. uint8_t i,Byte = 0x00;
  102. MyI2C_W_SDA(1);//接收前需要先释放SDA
  103. for(i = 0;i < 8;i ++)
  104. {
  105. MyI2C_W_SCL(1);//SCL为高电平主机进行读取SDA上的数据
  106. if(MyI2C_R_SDA() == 1)//此时接收为1
  107. {
  108. Byte |= (0x80 >> i);//读到数据存入Byte
  109. }
  110. MyI2C_W_SCL(0);//拉低SCL完成一次读取
  111. }
  112. return Byte;
  113. }
  114. /**
  115. * @brief 主机接收完一个字节后发送应答
  116. * @param AckBit:应答位,0为应答,1为不应答
  117. * @retval 无
  118. */
  119. void MyI2C_SendAck(uint8_t AckBit)
  120. {
  121. //接收完成时SCL为低电平
  122. MyI2C_W_SDA(AckBit);
  123. MyI2C_W_SCL(1);//释放SCL进行发送
  124. MyI2C_W_SCL(0);//结束一次发送
  125. }
  126. /**
  127. * @brief 从机发送完一个字节后接收主机应答
  128. * @param 无
  129. * @retval 从机的应答值
  130. */
  131. uint8_t MyI2C_ReceiveAck(void)
  132. {
  133. //发送完成时SCL为低电平
  134. uint8_t AckBit;
  135. MyI2C_W_SDA(1);//接收前先释放SDA
  136. //这里主机输出1,并不是强制SDA为高电平,而是释放SDA
  137. //进行通信时,主机释放SDA,从机会暂时获得控制权
  138. MyI2C_W_SCL(1);//释放SCL进行接收
  139. AckBit = MyI2C_R_SDA();//进行读取SDA
  140. MyI2C_W_SCL(0);//结束一次接收
  141. return AckBit;
  142. }

MPU6050.c

  1. #include "stm32f10x.h" // Device header
  2. #include "MyI2C.h"
  3. #include "MPU6050_Reg.h"
  4. #define MPU6050_ADDRESS 0xD0
  5. /**
  6. * @brief MPU6050指定地址写数据进寄存器
  7. * @param RegAddress:写入寄存器位置
  8. * @param Data:写入寄存器数据
  9. * @retval 无
  10. */
  11. void MPU6050_WriteReg(uint8_t RegAddress,uint8_t Data)//指定地址写寄存器
  12. {
  13. MyI2C_Start();//开启I2C时序
  14. MyI2C_SendByte(MPU6050_ADDRESS);//从机地址加R(1)/W(0)
  15. MyI2C_ReceiveAck();//接收应答
  16. MyI2C_SendByte(RegAddress);//这个字节会存在MPU6050的当前地址指针中
  17. MyI2C_ReceiveAck();//接收应答
  18. MyI2C_SendByte(Data);//发送数据
  19. MyI2C_ReceiveAck();//接收应答
  20. MyI2C_Stop();//结束I2C时序
  21. }
  22. /**
  23. * @brief MPU6050指定地址读寄存器数据
  24. * @param RegAddress:寄存器位置
  25. * @retval 寄存器中存的数据
  26. */
  27. uint8_t MPU6050_ReadReg(uint8_t RegAddress)
  28. {
  29. uint8_t Data;
  30. //写的时序
  31. MyI2C_Start();//开启I2C时序
  32. MyI2C_SendByte(MPU6050_ADDRESS);//从机地址加R(1)/W(0)
  33. MyI2C_ReceiveAck();//接收应答
  34. MyI2C_SendByte(RegAddress);//这个字节会存在MPU6050的当前地址指针中
  35. MyI2C_ReceiveAck();//接收应答
  36. //读的时序
  37. MyI2C_Start();//再次开启I2C时序
  38. MyI2C_SendByte(MPU6050_ADDRESS | 0x01);//从机地址+读
  39. MyI2C_ReceiveAck();//接收应答
  40. //此时控制权由从机控制(主机接收一个字节数据)
  41. Data = MyI2C_ReceiveByte();//主机接收一个字节数据
  42. MyI2C_SendAck(1);//发送应答(如果需要接收多个字节应答就给0,结束则给1)
  43. //主机收回总线控制权
  44. MyI2C_Stop();
  45. return Data;
  46. }
  47. /**
  48. * @brief 初始化MPU6050
  49. * @param 无
  50. * @retval 无
  51. */
  52. void MPU6050_Init(void)
  53. {
  54. MyI2C_Init();
  55. MPU6050_WriteReg(MPU6050_PWR_MGMT_1,0x01);//配置电源管理寄存器1
  56. //解除睡眠模式,并选择使用X轴陀螺仪时钟
  57. MPU6050_WriteReg(MPU6050_PWR_MGMT_2,0x00);//配置电源管理寄存器2
  58. //六个轴均不待机
  59. MPU6050_WriteReg(MPU6050_SMPLRT_DIV,0x09);//配置分频寄存器(值越小越快)
  60. //十分频
  61. MPU6050_WriteReg(MPU6050_CONFIG,0x06);//配置寄存器,(外部同步+数字低通滤波器)
  62. MPU6050_WriteReg(MPU6050_GYRO_CONFIG,0x18);//陀螺仪配置寄存器(自测使能+满量程选择)
  63. MPU6050_WriteReg(MPU6050_ACCEL_CONFIG,0x18);//加速度计配置寄存器(自测+满量程配置+高通滤波器)
  64. }
  65. /**
  66. * @brief 获得芯片ID号
  67. * @param 无
  68. * @retval 芯片ID
  69. */
  70. uint8_t MPU6050_GetID(void)
  71. {
  72. return MPU6050_ReadReg(MPU6050_WHO_AM_I);//读取芯片ID号
  73. }
  74. /**
  75. * @brief 读取加速度以及角速度数据
  76. * @param AccX:X轴方向加速度
  77. * @param AccY:Y轴方向加速度
  78. * @param AccZ:Z轴方向加速度
  79. * @param GyroX:X轴方向角速度
  80. * @param GyroY:Y轴方向角速度
  81. * @param GyroZ:Z轴方向角速度
  82. * @retval 无
  83. */
  84. void MPU6050_GetData(int16_t *AccX,int16_t *AccY,int16_t *AccZ,
  85. int16_t *GyroX,int16_t *GyroY,int16_t *GyroZ)
  86. {
  87. uint8_t DataH,DataL;
  88. DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);//加速度X轴高八位
  89. DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);//低八位
  90. *AccX = (DataH << 8) | DataL;
  91. DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);//加速度Y轴高八位
  92. DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);//低八位
  93. *AccY = (DataH << 8) | DataL;
  94. DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);//加速度Z轴高八位
  95. DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);//低八位
  96. *AccZ = (DataH << 8) | DataL;
  97. DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);//加速度Z轴高八位
  98. DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);//低八位
  99. *GyroX = (DataH << 8) | DataL;
  100. DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);//加速度Z轴高八位
  101. DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);//低八位
  102. *GyroY = (DataH << 8) | DataL;
  103. DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);//加速度Z轴高八位
  104. DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);//低八位
  105. *GyroZ = (DataH << 8) | DataL;
  106. }

MPU6050_Reg.h(寄存器)

  1. #ifndef __MPU6050_REG_H
  2. #define __MPU6050_REG_H
  3. #define MPU6050_SMPLRT_DIV 0x19
  4. #define MPU6050_CONFIG 0x1A
  5. #define MPU6050_GYRO_CONFIG 0x1B
  6. #define MPU6050_ACCEL_CONFIG 0x1C
  7. #define MPU6050_ACCEL_XOUT_H 0x3B
  8. #define MPU6050_ACCEL_XOUT_L 0x3C
  9. #define MPU6050_ACCEL_YOUT_H 0x3D
  10. #define MPU6050_ACCEL_YOUT_L 0x3E
  11. #define MPU6050_ACCEL_ZOUT_H 0x3F
  12. #define MPU6050_ACCEL_ZOUT_L 0x40
  13. #define MPU6050_TEMP_OUT_H 0x41
  14. #define MPU6050_TEMP_OUT_L 0x42
  15. #define MPU6050_GYRO_XOUT_H 0x43
  16. #define MPU6050_GYRO_XOUT_L 0x44
  17. #define MPU6050_GYRO_YOUT_H 0x45
  18. #define MPU6050_GYRO_YOUT_L 0x46
  19. #define MPU6050_GYRO_ZOUT_H 0x47
  20. #define MPU6050_GYRO_ZOUT_L 0x48
  21. #define MPU6050_PWR_MGMT_1 0x6B
  22. #define MPU6050_PWR_MGMT_2 0x6C
  23. #define MPU6050_WHO_AM_I 0x75
  24. #endif

main.c

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "OLED.h"
  4. #include "MPU6050.h"
  5. uint8_t KeyNum;
  6. int16_t AX,AY,AZ,GX,GY,GZ;
  7. int main(void)
  8. {
  9. OLED_Init();
  10. MPU6050_Init();
  11. OLED_ShowString(1,1,"ID:");
  12. OLED_ShowHexNum(1,4,MPU6050_GetID(),3);
  13. while(1)
  14. {
  15. MPU6050_GetData(&AX,&AY,&AZ,&GX,&GY,&GZ);
  16. OLED_ShowSignedNum(2,1,AX,5);
  17. OLED_ShowSignedNum(3,1,AY,5);
  18. OLED_ShowSignedNum(4,1,AZ,5);
  19. OLED_ShowSignedNum(2,8,GX,5);
  20. OLED_ShowSignedNum(3,8,GY,5);
  21. OLED_ShowSignedNum(4,8,GZ,5);
  22. }
  23. }

I2C通信外设

GPIO口需要配置为复用开漏输出模式。复用:就是GPIO的状态是交由片上外设来控制的,开漏输出,是I2C所规定的。

硬件I2C读写MPU6050

MPU6050.c

  1. #include "stm32f10x.h" // Device header
  2. #include "MPU6050_Reg.h"
  3. #define MPU6050_ADDRESS 0xD0
  4. /**
  5. * @brief 监控事件完成并延时退出
  6. * @param I2Cx:选择的I2C资源
  7. * @param I2C_EVENT:等待I2C完成的事件
  8. * @retval 无
  9. */
  10. void MPU6050_WaitEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
  11. {
  12. uint32_t TimeOut;
  13. TimeOut = 10000;
  14. while(I2C_CheckEvent(I2C2,I2C_EVENT) != SUCCESS)//等待Ev5事件完成
  15. {
  16. TimeOut -- ;
  17. if(TimeOut == 0)
  18. {
  19. break;
  20. }
  21. }
  22. }
  23. /**
  24. * @brief MPU6050指定地址写数据进寄存器
  25. * @param RegAddress:写入寄存器位置
  26. * @param Data:写入寄存器数据
  27. * @retval 无
  28. */
  29. void MPU6050_WriteReg(uint8_t RegAddress,uint8_t Data)//指定地址写寄存器
  30. {
  31. I2C_GenerateSTART(I2C2,ENABLE);//生成起始条件(非阻塞式,需要标志位判断)
  32. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);//等待Ev5事件完成
  33. I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Transmitter);//发送从机地址(自带接收应答)
  34. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待发送Ev6事件完成
  35. I2C_SendData(I2C2,RegAddress);//发送写入地址
  36. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING);//等待Ev8事件完成
  37. I2C_SendData(I2C2,Data);//发送数据(只有一个字节,发完紧接结束)
  38. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);//等待Ev8_2事件完成
  39. I2C_GenerateSTOP(I2C2,ENABLE);
  40. }
  41. /**
  42. * @brief MPU6050指定地址读寄存器数据
  43. * @param RegAddress:寄存器位置
  44. * @retval 寄存器中存的数据
  45. */
  46. uint8_t MPU6050_ReadReg(uint8_t RegAddress)
  47. {
  48. uint8_t Data;
  49. //写的时序
  50. I2C_GenerateSTART(I2C2,ENABLE);//生成起始条件(非阻塞式,需要标志位判断)
  51. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);//等待Ev5事件完成
  52. I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Transmitter);//发送从机地址(自带接收应答)
  53. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待发送Ev6事件完成(发送)
  54. I2C_SendData(I2C2,RegAddress);//发送写入地址
  55. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);//等待Ev8事件完成
  56. //读的时序
  57. I2C_GenerateSTART(I2C2,ENABLE);//生成重复起始条件
  58. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);//等待发送Ev5事件完成
  59. I2C_Send7bitAddress(I2C2,MPU6050_ADDRESS,I2C_Direction_Receiver);//发送从机地址并改为接收方向(自带接收应答)
  60. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);//等待发送Ev6事件完成(接收)
  61. //清除响应和停止条件的产生位(在最后一个数据之前就要将Ack置零以及设置Stop终止条件)
  62. I2C_AcknowledgeConfig(I2C2,DISABLE);//设置Ack = 0,不给应答
  63. I2C_GenerateSTOP(I2C2,ENABLE);//配置停止位
  64. MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED);//等待发送Ev7事件完成
  65. //此时一个字节的数据以及存在DR中
  66. //读取DR即可获得字节
  67. Data = I2C_ReceiveData(I2C2);
  68. I2C_AcknowledgeConfig(I2C2,ENABLE);//方便接收多个字节
  69. return Data;
  70. }
  71. /**
  72. * @brief 初始化MPU6050
  73. * @param 无
  74. * @retval 无
  75. */
  76. void MPU6050_Init(void)
  77. {
  78. //开启对应时钟
  79. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  80. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
  81. //配置GPIO
  82. GPIO_InitTypeDef GPIO_InitStructure;
  83. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//复用开漏
  84. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  85. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  86. GPIO_Init(GPIOB,&GPIO_InitStructure);
  87. //配置I2C
  88. I2C_InitTypeDef I2CInitStructure;
  89. I2CInitStructure.I2C_Mode = I2C_Mode_I2C;//I2C模式
  90. I2CInitStructure.I2C_ClockSpeed = 50000;//时钟速度(标准100 kHz,快速400 kHz)
  91. I2CInitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//时钟占空比(>100kHz才有用)
  92. I2CInitStructure.I2C_Ack = I2C_Ack_Enable;//配置Ack位
  93. I2CInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//Stm32作为从机能响应几位地址
  94. I2CInitStructure.I2C_OwnAddress1 = 0x00;//指定stm32自身地址
  95. I2C_Init(I2C2,&I2CInitStructure);
  96. I2C_Cmd(I2C2,ENABLE);
  97. MPU6050_WriteReg(MPU6050_PWR_MGMT_1,0x01);//配置电源管理寄存器1
  98. //解除睡眠模式,并选择使用X轴陀螺仪时钟
  99. MPU6050_WriteReg(MPU6050_PWR_MGMT_2,0x00);//配置电源管理寄存器2
  100. //六个轴均不待机
  101. MPU6050_WriteReg(MPU6050_SMPLRT_DIV,0x09);//配置分频寄存器(值越小越快)
  102. //十分频
  103. MPU6050_WriteReg(MPU6050_CONFIG,0x06);//配置寄存器,(外部同步+数字低通滤波器)
  104. MPU6050_WriteReg(MPU6050_GYRO_CONFIG,0x18);//陀螺仪配置寄存器(自测使能+满量程选择)
  105. MPU6050_WriteReg(MPU6050_ACCEL_CONFIG,0x18);//加速度计配置寄存器(自测+满量程配置+高通滤波器)
  106. }
  107. /**
  108. * @brief 获得芯片ID号
  109. * @param 无
  110. * @retval 芯片ID
  111. */
  112. uint8_t MPU6050_GetID(void)
  113. {
  114. return MPU6050_ReadReg(MPU6050_WHO_AM_I);//读取芯片ID号
  115. }
  116. /**
  117. * @brief 读取加速度以及角速度数据
  118. * @param AccX:X轴方向加速度
  119. * @param AccY:Y轴方向加速度
  120. * @param AccZ:Z轴方向加速度
  121. * @param GyroX:X轴方向角速度
  122. * @param GyroY:Y轴方向角速度
  123. * @param GyroZ:Z轴方向角速度
  124. * @retval 无
  125. */
  126. void MPU6050_GetData(int16_t *AccX,int16_t *AccY,int16_t *AccZ,
  127. int16_t *GyroX,int16_t *GyroY,int16_t *GyroZ)
  128. {
  129. uint8_t DataH,DataL;
  130. DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);//加速度X轴高八位
  131. DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);//低八位
  132. *AccX = (DataH << 8) | DataL;
  133. DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);//加速度Y轴高八位
  134. DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);//低八位
  135. *AccY = (DataH << 8) | DataL;
  136. DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);//加速度Z轴高八位
  137. DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);//低八位
  138. *AccZ = (DataH << 8) | DataL;
  139. DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);//加速度Z轴高八位
  140. DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);//低八位
  141. *GyroX = (DataH << 8) | DataL;
  142. DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);//加速度Z轴高八位
  143. DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);//低八位
  144. *GyroY = (DataH << 8) | DataL;
  145. DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);//加速度Z轴高八位
  146. DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);//低八位
  147. *GyroZ = (DataH << 8) | DataL;
  148. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/84232
推荐阅读
相关标签
  

闽ICP备14008679号