• 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. }

  • 相关阅读:
    组合系列--有排列就有组合
    微信支付服务商,可视化进件特约商户
    4款让人骄傲的国产软件,功能过于强大,却被误认为是外国佬研发
    期货价值计算方法(期货的价值怎么计算)
    Java学习笔记4.3.1 数学计算 - Math类
    Debian 初始化命令备忘
    高并发下的分布式缓存 | Read-Through缓存模式
    thinkphp中区块block和模板继承extend用法举例,和公共头部
    gazebo各种插件
    TiDB 7.4 发版:正式兼容 MySQL 8.0
  • 原文地址:https://blog.csdn.net/qq_45981247/article/details/136106865