打印
[技术问答]

MPU6500 MPU9250是不是驱动程序通用的啊

[复制链接]
715|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiekou001|  楼主 | 2023-11-30 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到新唐有个MPU9250的例子
EC_Nano130_Control_MPU9250_Sensor_V1.00 (1).zip (7.12 MB)

使用特权

评论回复
沙发
jiekou001|  楼主 | 2023-11-30 10:45 | 只看该作者
/******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 2 $
* $Date: 14/05/14 6:35p $
* [url=home.php?mod=space&uid=247401]@brief[/url]    MPU9250 project for Nano100 series MCU
*
* @note
* Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "Nano100Series.h"
#include "NuEdu-Basic01.h"
#include "CJMCU116.h"
#include "MPU9250.h"

uint8_t BUF[10];
int16_t T_X, T_Y, T_Z, T_T;
/*---------------------------------------------------------------------------------------------------------*/
/* Init System Clock                                                                                       */
/*---------------------------------------------------------------------------------------------------------*/
void SYS_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

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

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

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

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

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

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

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

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

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

    /* Lock protected registers */
    SYS_LockReg();

}


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

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

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

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

}

// Init MPU9250
void Init_MPU9250(void)
{

    I2C0_Write(GYRO_ADDRESS, PWR_MGMT_1, 0x00);
    I2C0_Write(GYRO_ADDRESS, SMPLRT_DIV, 0x07);
    I2C0_Write(GYRO_ADDRESS, CONFIG, 0x06);
    I2C0_Write(GYRO_ADDRESS, GYRO_CONFIG, 0x18);
    I2C0_Write(GYRO_ADDRESS, ACCEL_CONFIG, 0x01);
}

/**
  * @brief      Obtaining Accelerometer values (RAW Data)        
        * @param                  none
  * [url=home.php?mod=space&uid=266161]@return[/url]     none
  *
  * [url=home.php?mod=space&uid=1543424]@Details[/url]    Obtaining Accelerometer values
  */       
void READ_MPU9250_ACCEL(void)
{
    BUF[0] = I2C0_Read(ACCEL_ADDRESS, ACCEL_XOUT_L);
    BUF[1] = I2C0_Read(ACCEL_ADDRESS, ACCEL_XOUT_H);
    T_X =   (BUF[1] << 8) | BUF[0];
    T_X /= 164;

    BUF[2] = I2C0_Read(ACCEL_ADDRESS, ACCEL_YOUT_L);
    BUF[3] = I2C0_Read(ACCEL_ADDRESS, ACCEL_YOUT_H);
    T_Y =   (BUF[3] << 8) | BUF[2];
    T_Y /= 164;
    BUF[4] = I2C0_Read(ACCEL_ADDRESS, ACCEL_ZOUT_L);
    BUF[5] = I2C0_Read(ACCEL_ADDRESS, ACCEL_ZOUT_H);
    T_Z =   (BUF[5] << 8) | BUF[4];
    T_Z /= 164;

}

/**
  * @brief      Obtaining gyroscope values (RAW Data)        
        * @param                  none
  * @return     none
  *
  * @details    Obtaining gyroscope values
  */       
void READ_MPU9250_GYRO(void)
{

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

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

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

}

/**
  * @brief      Obtaining Magnetomet values (RAW Data)        
        * @param                  none
  * @return     none
  *
  * @details    Obtaining Magnetomet values
  */       
void READ_MPU9250_MAG(void)
{
    I2C0_Write(GYRO_ADDRESS, 0x37, 0x02); //turn on Bypass Mode
    CLK_SysTickDelay(10000);
    I2C0_Write(MAG_ADDRESS, 0x0A, 0x01);
    CLK_SysTickDelay(10000);
    BUF[0] = I2C0_Read(MAG_ADDRESS, MAG_XOUT_L);
    BUF[1] = I2C0_Read(MAG_ADDRESS, MAG_XOUT_H);
    T_X = (BUF[1] << 8) | BUF[0];

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

    BUF[4] = I2C0_Read(MAG_ADDRESS, MAG_ZOUT_L);
    BUF[5] = I2C0_Read(MAG_ADDRESS, MAG_ZOUT_H);
    T_Z =   (BUF[5] << 8) | BUF[4];
}

/*---------------------------------------------------------------------------------------------------------*/
/*  MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int main()
{
    /* Initial system */
    SYS_Init();

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

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

    /* Initial I2C */
    I2C0_Init(100);
    Init_MPU9250();          //Initialization MPU9250

    while (1)
    {

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

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

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

        CLK_SysTickDelay(300000);
        CLK_SysTickDelay(300000);
        CLK_SysTickDelay(300000);
    }

}

/*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/

使用特权

评论回复
板凳
小明的同学| | 2023-11-30 11:26 | 只看该作者
我猜应该差不多。

使用特权

评论回复
地板
EmmaTT| | 2023-12-6 10:59 | 只看该作者
嗯,只要把底层改一下就可以了

使用特权

评论回复
5
华芯3284494788| | 2023-12-7 16:26 | 只看该作者
有些区别

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

1370

帖子

2

粉丝