#define MPU9150_I2C_ADDRESS 0x68 uint32_t g_pui32Colors[3]; tI2CMInstance g_sI2CInst; tMPU9150 g_sMPU9150Inst; tCompDCM g_sCompDCMInst; volatile uint_fast8_t g_vui8I2CDoneFlag; volatile uint_fast8_t g_vui8ErrorFlag; 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 void MPU9150AppCallback(void *pvCallbackData, uint_fast8_t ui8Status) { if(ui8Status == I2CM_STATUS_SUCCESS) { g_vui8I2CDoneFlag = 1; } g_vui8ErrorFlag = ui8Status; } 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); } } void MPU9150I2CIntHandler(void) { 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"); g_pui32Colors[0] = 0xFFFF; g_pui32Colors[1] = 0; g_pui32Colors[2] = 0; RGBColorSet(g_pui32Colors); RGBBlinkRateSet(10.0f); while(1) { } } void MPU9150AppI2CWait(char *pcFilename, uint_fast32_t ui32Line) { 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); 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__); 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; MPU9150DataAccelGetFloat(&g_sMPU9150Inst, pfAccel, pfAccel + 1, pfAccel + 2); if(ui32CompDCMStarted == 0) { ui32CompDCMStarted = 1; CompDCMAccelUpdate(&g_sCompDCMInst, pfAccel[0], pfAccel[1], pfAccel[2]); CompDCMStart(&g_sCompDCMInst); } else { CompDCMAccelUpdate(&g_sCompDCMInst, pfAccel[0], pfAccel[1], pfAccel[2]); CompDCMUpdate(&g_sCompDCMInst); } g_ui32PrintSkipCounter++; if(g_ui32PrintSkipCounter >= PRINT_SKIP_COUNT) { g_ui32PrintSkipCounter = 0; for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) { i32IPart[ui32Idx] = (int32_t) pfData[ui32Idx]; 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]); } } }