TI中文支持网
TI专业的中文技术问题搜集分享网站

mpu9150的i2c接口

从tivaware里下载的mpu9150程序,现在想更换一个i2c接口,请问我需要改哪里?

#define MPU9150_I2C_ADDRESS  0x68
// 初始化完成并且示例应用程序正在运行后,RGB LED以1Hz开始闪烁。
//用于保存RGB颜色值的全局数组。
uint32_t g_pui32Colors[3];
//I2C主驱动程序的全局实例结构。
tI2CMInstance g_sI2CInst;
//ISL29023传感器驱动程序的全局实例结构。
tMPU9150 g_sMPU9150Inst;
//全局实例结构来管理DCM状态。
tCompDCM g_sCompDCMInst;
//全局标志提醒主MPU9150 I2C事务已完成
volatile uint_fast8_t g_vui8I2CDoneFlag;
//全局标志提醒主要MPU9150 I2C事务发生错误。
volatile uint_fast8_t g_vui8ErrorFlag;
//全局标志提醒主MPU9150数据已准备好被检索。
volatile uint_fast8_t g_vui8DataFlag;
//全局计数器控制并减慢到终端的数据速率。
#define PRINT_SKIP_COUNT        10
uint32_t g_ui32PrintSkipCounter;
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif
//MPU9150传感器回调功能。 在MPU9150传感器驱动程序事务结束时调用。 这是从I2C中断上下文中调用的。 因此,我们只是设置一个标志,让主要做大量的计算和显示。
void
MPU9150AppCallback(void *pvCallbackData, uint_fast8_t ui8Status)
{
    //如果事务成功,则设置数据标志以向应用程序指示此事务已完成,并且数据可能已准备就绪
    if(ui8Status == I2CM_STATUS_SUCCESS)
    {
        g_vui8I2CDoneFlag = 1;
    }
    //存储最新状态以防出现错误情况
    g_vui8ErrorFlag = ui8Status;
}
//由GPIO端口B中断事件引起的NVIC调用。 对于此应用,GPIO端口B引脚2是MPU9150的中断线
void
IntGPIOb(void)
{
    unsigned long ulStatus;
    ulStatus = GPIOIntStatus(GPIO_PORTB_BASE, true);
    GPIOIntClear(GPIO_PORTB_BASE, ulStatus);
    if(ulStatus & GPIO_PIN_2)
    {
        MPU9150DataRead(&g_sMPU9150Inst, MPU9150AppCallback, &g_sMPU9150Inst);
    }
}
//由于I2C3中断而被NVIC调用。 I2C3是到MPU9150的I2C连接。
void
MPU9150I2CIntHandler(void)
{
    //传递到由传感器库提供的I2CM中断处理程序。 这需要处于应用程序级别,以便I2CMIntHandler可以接收实例结构指针作为参数。
    I2CMIntHandler(&g_sI2CInst);
}
void
MPU9150AppErrorHandler(char *pcFilename, uint_fast32_t ui32Line)
{
    //将终端颜色设置为红色并打印错误状态和位置
    UARTprintf("\033[31;1m");
    UARTprintf("Error: %d, File: %s, Line: %d\n"
               "See I2C status definitions in sensorlib\\i2cm_drv.h\n",
               g_vui8ErrorFlag, pcFilename, ui32Line);
    //终端颜色恢复正常
    UARTprintf("\033[0m");
    //将RGB颜色设置为红色
    g_pui32Colors[0] = 0xFFFF;
    g_pui32Colors[1] = 0;
    g_pui32Colors[2] = 0;
    RGBColorSet(g_pui32Colors);
    //增加闪烁率以获得关注
    RGBBlinkRateSet(10.0f);
    while(1)
    {
    }
}
//等待MPU9150事务完成的功能。 使用它来旋转I2C总线上的等待。
void
MPU9150AppI2CWait(char *pcFilename, uint_fast32_t ui32Line)
{
    //在等待I2C驱动程序指示交易完成时,让处理器进入睡眠状态。
    while((g_vui8I2CDoneFlag == 0) && (g_vui8ErrorFlag == 0))
    {
    }
    if(g_vui8ErrorFlag)
    {
        MPU9150AppErrorHandler(pcFilename, ui32Line);
    }
    g_vui8I2CDoneFlag = 0;
}
void
ConfigureUART(void)
{
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
    UARTStdioConfig(0, 115200, 16000000);
}
int
main(void)
{
    int_fast32_t i32IPart[16], i32FPart[16];
    uint_fast32_t ui32Idx, ui32CompDCMStarted;
    float pfData[16];
    float *pfAccel;
    //将所有数据放在一个连续的阵列中,以便稍后可以使打印变得更容易。
    pfAccel = pfData;
    ROM_SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                       SYSCTL_OSC_MAIN);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//中断
    ConfigureUART();
    UARTprintf("\033[2JMPU9150 Raw Example\n");
    g_pui32Colors[RED] = 0x8000;
    g_pui32Colors[BLUE] = 0x8000;
    g_pui32Colors[GREEN] = 0x0000;
    RGBInit(0);
    RGBColorSet(g_pui32Colors);
    RGBIntensitySet(0.5f);
    RGBEnable();
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    ROM_GPIOPinConfigure(GPIO_PA6_I2C1SCL);
    ROM_GPIOPinConfigure(GPIO_PA7_I2C1SDA);
    GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_6);
    ROM_GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_7);
    ROM_GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_2);
    GPIOIntEnable(GPIO_PORTB_BASE, GPIO_PIN_2);  //使能GPIO中断源
    ROM_GPIOIntTypeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE);  //引脚中断类型
    ROM_IntEnable(INT_GPIOB); //开中断
    ROM_SysCtlPeripheralClockGating(true);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_GPIOB);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER0);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER1);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_I2C1);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_WTIMER5);
    ROM_IntMasterEnable();    //开全局中断
    I2CMInit(&g_sI2CInst, I2C1_BASE, INT_I2C1, 0xff, 0xff,
             ROM_SysCtlClockGet());
    MPU9150Init(&g_sMPU9150Inst, &g_sI2CInst, MPU9150_I2C_ADDRESS,
                MPU9150AppCallback, &g_sMPU9150Inst);
    MPU9150AppI2CWait(__FILE__, __LINE__);
    g_sMPU9150Inst.pui8Data[0] = MPU9150_CONFIG_DLPF_CFG_94_98;
    g_sMPU9150Inst.pui8Data[1] = MPU9150_GYRO_CONFIG_FS_SEL_250;
    g_sMPU9150Inst.pui8Data[2] = (MPU9150_ACCEL_CONFIG_ACCEL_HPF_5HZ |
                                  MPU9150_ACCEL_CONFIG_AFS_SEL_2G);
    MPU9150Write(&g_sMPU9150Inst, MPU9150_O_CONFIG, g_sMPU9150Inst.pui8Data, 3,
                 MPU9150AppCallback, &g_sMPU9150Inst);
    MPU9150AppI2CWait(__FILE__, __LINE__);
    g_sMPU9150Inst.pui8Data[0] = MPU9150_INT_PIN_CFG_INT_LEVEL |
                                    MPU9150_INT_PIN_CFG_INT_RD_CLEAR |
                                    MPU9150_INT_PIN_CFG_LATCH_INT_EN;
    g_sMPU9150Inst.pui8Data[1] = MPU9150_INT_ENABLE_DATA_RDY_EN;
    MPU9150Write(&g_sMPU9150Inst, MPU9150_O_INT_PIN_CFG,
                 g_sMPU9150Inst.pui8Data, 2, MPU9150AppCallback,
                 &g_sMPU9150Inst);
    MPU9150AppI2CWait(__FILE__, __LINE__);
    //初始化DCM系统。 50赫兹采样率。 加速度重量= 0.2,陀螺重量= 0.8,重量= 0.2
    CompDCMInit(&g_sCompDCMInst, 1.0f / 50.0f, 0.2f, 0.6f, 0.2f);
    UARTprintf("MPU9150 9-Axis Simple Data Application Example\n\n");
    UARTprintf("Accel\033[8G|\033[31G|\033[54G|\n\n");//加速
    //启用闪烁表示配置成功完成
    RGBBlinkRateSet(1.0f);
    ui32CompDCMStarted = 0;
    while(1)
    {
        while(!g_vui8I2CDoneFlag)
        {
            ROM_SysCtlSleep();
        }
        g_vui8I2CDoneFlag = 0;
        //以m / s ^ 2获得浮点数据的Accel数据。
        MPU9150DataAccelGetFloat(&g_sMPU9150Inst, pfAccel, pfAccel + 1,
                                 pfAccel + 2);
        //检查这是否是我们的第一个数据
        if(ui32CompDCMStarted == 0)
        {
            //设置标志,指示DCM已启动。 用第一个数据集进行DCM播种。
            ui32CompDCMStarted = 1;
            CompDCMAccelUpdate(&g_sCompDCMInst, pfAccel[0], pfAccel[1],
                               pfAccel[2]);
            CompDCMStart(&g_sCompDCMInst);
        }
        else
        {
            //DCM已启动。 执行增量更新。
            CompDCMAccelUpdate(&g_sCompDCMInst, pfAccel[0], pfAccel[1],
                               pfAccel[2]);
            CompDCMUpdate(&g_sCompDCMInst);
        }
        //增加跳过计数器。 使用跳过计数器,因此我们不会使用数据溢出UART
        g_ui32PrintSkipCounter++;
        if(g_ui32PrintSkipCounter >= PRINT_SKIP_COUNT)
        {
            //重置跳过计数器。
            g_ui32PrintSkipCounter = 0;
            //现在回到使用数据作为单个数组来分解float成整数部分和分数(十进制)部分的目的。
            for(ui32Idx = 0; ui32Idx < 16; ui32Idx++)
            {
                //将float值转换为一个截断小数部分的整数。
                i32IPart[ui32Idx] = (int32_t) pfData[ui32Idx];
                //乘以1000以保留前三个十进制值。 截断小数点后第三位。
                i32FPart[ui32Idx] = (int32_t) (pfData[ui32Idx] * 1000.0f);
                //从这个新形成的小数部分减去整数部分。
                i32FPart[ui32Idx] = i32FPart[ui32Idx] –
                                    (i32IPart[ui32Idx] * 1000);
                //使小数部分成为显示的正数。
                if(i32FPart[ui32Idx] < 0)
                {
                    i32FPart[ui32Idx] *= -1;
                }
            }
            //打印加速度数字
            UARTprintf("\033 x:%3d.%03d", i32IPart[0], i32FPart[0]);
            UARTprintf("\033 y:%3d.%03d", i32IPart[1], i32FPart[1]);
            UARTprintf("\033 z:%3d.%03d", i32IPart[2], i32FPart[2]);
        }
    }
}

xyz549040622:

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);ROM_GPIOPinConfigure(GPIO_PA6_I2C1SCL);ROM_GPIOPinConfigure(GPIO_PA7_I2C1SDA);GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_6);ROM_GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_7);ROM_GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_2);GPIOIntEnable(GPIO_PORTB_BASE, GPIO_PIN_2);//使能GPIO中断源ROM_GPIOIntTypeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE);//引脚中断类型ROM_IntEnable(INT_GPIOB); //开中断ROM_SysCtlPeripheralClockGating(true);ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_GPIOB);ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0);ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER0);ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER1);ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_I2C1);ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_WTIMER5);ROM_IntMasterEnable();//开全局中断I2CMInit(&g_sI2CInst, I2C1_BASE, INT_I2C1, 0xff, 0xff,ROM_SysCtlClockGet());

应该换这部分就好了,I2C1的部分都要变得。

赞(0)
未经允许不得转载:TI中文支持网 » mpu9150的i2c接口
分享到: 更多 (0)