[技术问答] MPU6500 MPU9250是不是驱动程序通用的啊

[复制链接]
 楼主| jiekou001 发表于 2023-11-30 10:44 | 显示全部楼层 |阅读模式
看到新唐有个MPU9250的例子
EC_Nano130_Control_MPU9250_Sensor_V1.00 (1).zip (7.12 MB, 下载次数: 3)
 楼主| jiekou001 发表于 2023-11-30 10:45 | 显示全部楼层
  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 2 $
  5. * $Date: 14/05/14 6:35p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    MPU9250 project for Nano100 series MCU
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "Nano100Series.h"
  13. #include "NuEdu-Basic01.h"
  14. #include "CJMCU116.h"
  15. #include "MPU9250.h"

  16. uint8_t BUF[10];
  17. int16_t T_X, T_Y, T_Z, T_T;
  18. /*---------------------------------------------------------------------------------------------------------*/
  19. /* Init System Clock                                                                                       */
  20. /*---------------------------------------------------------------------------------------------------------*/
  21. void SYS_Init(void)
  22. {
  23.     /* Unlock protected registers */
  24.     SYS_UnlockReg();

  25.     /* Enable External XTAL (4~24 MHz) */
  26.     //CLK->PWRCTL |= CLK_PWRCTL_HXT_EN_Msk;
  27.     CLK->PWRCTL |= CLK_PWRCTL_HIRC_EN_Msk;

  28.     /* Waiting for 12MHz clock ready */
  29.     //while((CLK->CLKSTATUS & CLK_CLKSTATUS_HXT_STB_Msk) == 0){};
  30.     while ((CLK->CLKSTATUS & CLK_CLKSTATUS_HIRC_STB_Msk) == 0) {};

  31.     /* Switch PLL clock source to XTAL */
  32.     //CLK->PLLCTL &= CLK_PLLCTL_PLL_SRC_HXT;
  33.     CLK->PLLCTL &= CLK_PLLCTL_PLL_SRC_HIRC;

  34.     /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
  35.     CLK->PLLCTL &= CLK_PLLCTL_PD_Msk;

  36.     /* Set PLL frequency 84 MHz */
  37.     CLK->PLLCTL |= 0x0218;

  38.     /* Waiting for clock ready */
  39.     while ((CLK->CLKSTATUS & CLK_CLKSTATUS_PLL_STB_Msk) == 0) {};

  40.     /* Set HCLK_N = 1 */
  41.     CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_HCLK_N_Msk) | 0x01;

  42.     /* Switch HCLK clock source to PLL */
  43.     CLK->CLKSEL0 = CLK_CLKSEL0_HCLK_S_PLL;

  44.     /* Update System Core Clock */
  45.     /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
  46.     SystemCoreClockUpdate();

  47.     /* Lock protected registers */
  48.     SYS_LockReg();

  49. }


  50. /*---------------------------------------------------------------------------------------------------------*/
  51. /* Init UART1                                                                                              */
  52. /*---------------------------------------------------------------------------------------------------------*/
  53. void UART1_Init(void)
  54. {
  55.     /* Set PC.10 and PC.11 multi-function pins for UART1_RXD, UART1_TXD */
  56.     SYS->PC_H_MFP |= (SYS_PC_H_MFP_PC11_MFP_UART1_TX | SYS_PC_H_MFP_PC10_MFP_UART1_RX);

  57.     /* Enable UART1 IP clock */
  58.     CLK->APBCLK |= CLK_APBCLK_UART1_EN_Msk;

  59.     /* Set UART1 IP clock source */
  60.     CLK->CLKSEL1 |= CLK_CLKSEL1_UART_S_HXT;

  61.     /* Configure UART1 and set UART1 Baudrate */
  62.     UART1->BAUD = UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER(FREQ_12MHZ, 115200);
  63.     UART1->TLCTL = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;

  64. }

  65. // Init MPU9250
  66. void Init_MPU9250(void)
  67. {

  68.     I2C0_Write(GYRO_ADDRESS, PWR_MGMT_1, 0x00);
  69.     I2C0_Write(GYRO_ADDRESS, SMPLRT_DIV, 0x07);
  70.     I2C0_Write(GYRO_ADDRESS, CONFIG, 0x06);
  71.     I2C0_Write(GYRO_ADDRESS, GYRO_CONFIG, 0x18);
  72.     I2C0_Write(GYRO_ADDRESS, ACCEL_CONFIG, 0x01);
  73. }

  74. /**
  75.   * @brief      Obtaining Accelerometer values (RAW Data)        
  76.         * @param                  none
  77.   * [url=home.php?mod=space&uid=266161]@return[/url]     none
  78.   *
  79.   * [url=home.php?mod=space&uid=1543424]@Details[/url]    Obtaining Accelerometer values
  80.   */       
  81. void READ_MPU9250_ACCEL(void)
  82. {
  83.     BUF[0] = I2C0_Read(ACCEL_ADDRESS, ACCEL_XOUT_L);
  84.     BUF[1] = I2C0_Read(ACCEL_ADDRESS, ACCEL_XOUT_H);
  85.     T_X =   (BUF[1] << 8) | BUF[0];
  86.     T_X /= 164;

  87.     BUF[2] = I2C0_Read(ACCEL_ADDRESS, ACCEL_YOUT_L);
  88.     BUF[3] = I2C0_Read(ACCEL_ADDRESS, ACCEL_YOUT_H);
  89.     T_Y =   (BUF[3] << 8) | BUF[2];
  90.     T_Y /= 164;
  91.     BUF[4] = I2C0_Read(ACCEL_ADDRESS, ACCEL_ZOUT_L);
  92.     BUF[5] = I2C0_Read(ACCEL_ADDRESS, ACCEL_ZOUT_H);
  93.     T_Z =   (BUF[5] << 8) | BUF[4];
  94.     T_Z /= 164;

  95. }

  96. /**
  97.   * @brief      Obtaining gyroscope values (RAW Data)        
  98.         * @param                  none
  99.   * @return     none
  100.   *
  101.   * @details    Obtaining gyroscope values
  102.   */       
  103. void READ_MPU9250_GYRO(void)
  104. {

  105.     BUF[0] = I2C0_Read(GYRO_ADDRESS, GYRO_XOUT_L);
  106.     BUF[1] = I2C0_Read(GYRO_ADDRESS, GYRO_XOUT_H);
  107.     T_X =   (BUF[1] << 8) | BUF[0];
  108.     T_X /= 16.4;

  109.     BUF[2] = I2C0_Read(GYRO_ADDRESS, GYRO_YOUT_L);
  110.     BUF[3] = I2C0_Read(GYRO_ADDRESS, GYRO_YOUT_H);
  111.     T_Y =   (BUF[3] << 8) | BUF[2];
  112.     T_Y /= 16.4;

  113.     BUF[4] = I2C0_Read(GYRO_ADDRESS, GYRO_ZOUT_L);
  114.     BUF[5] = I2C0_Read(GYRO_ADDRESS, GYRO_ZOUT_H);
  115.     T_Z =   (BUF[5] << 8) | BUF[4];
  116.     T_Z /= 16.4;

  117. }

  118. /**
  119.   * @brief      Obtaining Magnetomet values (RAW Data)        
  120.         * @param                  none
  121.   * @return     none
  122.   *
  123.   * @details    Obtaining Magnetomet values
  124.   */       
  125. void READ_MPU9250_MAG(void)
  126. {
  127.     I2C0_Write(GYRO_ADDRESS, 0x37, 0x02); //turn on Bypass Mode
  128.     CLK_SysTickDelay(10000);
  129.     I2C0_Write(MAG_ADDRESS, 0x0A, 0x01);
  130.     CLK_SysTickDelay(10000);
  131.     BUF[0] = I2C0_Read(MAG_ADDRESS, MAG_XOUT_L);
  132.     BUF[1] = I2C0_Read(MAG_ADDRESS, MAG_XOUT_H);
  133.     T_X = (BUF[1] << 8) | BUF[0];

  134.     BUF[2] = I2C0_Read(MAG_ADDRESS, MAG_YOUT_L);
  135.     BUF[3] = I2C0_Read(MAG_ADDRESS, MAG_YOUT_H);
  136.     T_Y =   (BUF[3] << 8) | BUF[2];

  137.     BUF[4] = I2C0_Read(MAG_ADDRESS, MAG_ZOUT_L);
  138.     BUF[5] = I2C0_Read(MAG_ADDRESS, MAG_ZOUT_H);
  139.     T_Z =   (BUF[5] << 8) | BUF[4];
  140. }

  141. /*---------------------------------------------------------------------------------------------------------*/
  142. /*  MAIN function                                                                                          */
  143. /*---------------------------------------------------------------------------------------------------------*/
  144. int main()
  145. {
  146.     /* Initial system */
  147.     SYS_Init();

  148.     /* Initial UART1 to 115200-8n1 for print message */
  149.     UART1_Init();

  150.     printf("Hello World.\n");
  151.     printf("PLL Clock = %d Hz\n", CLK_GetPLLClockFreq());
  152.     printf("Core Clock = %d Hz\n\n", CLK_GetHCLKFreq());
  153.     printf("+-------------------------------------------------------+\n");
  154.     printf("|   Nano100 Series I2C Sample Code with MPU9250                            |\n");
  155.     printf("+-------------------------------------------------------+\n");

  156.     /* Initial I2C */
  157.     I2C0_Init(100);
  158.     Init_MPU9250();          //Initialization MPU9250

  159.     while (1)
  160.     {

  161.         READ_MPU9250_ACCEL();  // Gravity acceleration 0.01g
  162.         printf("ACCEL:  X: %4d  Y: %4d  Z: %4d   /0.01 g\n", T_X, T_Y, T_Z);

  163.         READ_MPU9250_GYRO();      //angular velocity 1dps
  164.         printf("GYRO :  X: %4d  Y: %4d  Z: %4d   /1 dps\n", T_X, T_Y, T_Z);

  165.         READ_MPU9250_MAG();       //Magnetometer
  166.         printf("MAG  :  X: %4d  Y: %4d  Z: %4d   /0.6 uT\n\n\n", T_X, T_Y, T_Z);

  167.         CLK_SysTickDelay(300000);
  168.         CLK_SysTickDelay(300000);
  169.         CLK_SysTickDelay(300000);
  170.     }

  171. }

  172. /*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/
小明的同学 发表于 2023-11-30 11:26 | 显示全部楼层
我猜应该差不多。
EmmaTT 发表于 2023-12-6 10:59 来自手机 | 显示全部楼层
嗯,只要把底层改一下就可以了
华芯3284494788 发表于 2023-12-7 16:26 来自手机 | 显示全部楼层
有些区别
您需要登录后才可以回帖 登录 | 注册

本版积分规则

147

主题

1502

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部