I am extracting the mpu 9150 code from qslogger example code in Tivaware. However, I have problem in MPU9150AppI2CWait(__FILE__,__LINE) where it stuck in an infinite loop. Please help, thanks.
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "driverlib/adc.h"
#include "driverlib/fpu.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"
#include "driverlib/uart.h"
#include "driverlib/interrupt.h"
#include "grlib/grlib.h"
#include "utils/uartstdio.h"
#include "driverlib/gpio.h"
#include "inc/tm4c123gh6pge.h"
#include "sensorlib/hw_mpu9150.h"
#include "sensorlib/hw_ak8975.h"
#include "sensorlib/i2cm_drv.h"
#include "sensorlib/ak8975.h"
#include "sensorlib/mpu9150.h"
#include "sensorlib/comp_dcm.h"
#define MPU9150_I2C_ADDRESS 0x69
#define X 0
#define Y 1
#define Z 2
tI2CMInstance g_sI2CInst; //i2c master driver
tMPU9150 g_sMPU9150Inst; //mpu9150
volatile uint_fast8_t g_vui8I2CDoneFlag;
volatile uint_fast8_t g_vui8ErrorFlag;
volatile uint_fast8_t g_vui8DataFlag;
int16_t g_i16Accel[3];
int16_t g_i16Gyro[3];
int16_t g_i16Mag[3];
uint32_t pui32ADC0Value[1];
float g_pfAccel[3];
float g_pfGyro[3];
float g_pfMag[3];
void MPU9150AppCallback(void *pvCallbackData, uint_fast8_t ui8Status)
{
if(ui8Status == I2CM_STATUS_SUCCESS)
{
g_vui8I2CDoneFlag = 1;
}
g_vui8ErrorFlag = ui8Status;
}
void MPU9150AppErrorHandler(char *pcFilename, uint_fast32_t ui32Line)
{
UARTprintf("App Error!");
while(1)
{
}
}
void MPU9150AppI2CWait(char *pcFilename, uint_fast32_t ui32Line)
{
while((g_vui8DataFlag == 0) && (g_vui8ErrorFlag == 0))
{
}
if(g_vui8ErrorFlag)
{
MPU9150AppErrorHandler(pcFilename, ui32Line);
}
g_vui8DataFlag = 0;
}
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 IntMPU9150I2CHandler(void)
{
I2CMIntHandler(&g_sI2CInst);
}
void ConsoleInit()
{
//UART Init
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig(0, 115200, SysCtlClockGet());
UARTEnable(UART0_BASE);
UARTprintf("UART Init \n");
}
int main()
{
ConsoleInit();
//I2C
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PD0_I2C3SCL);
GPIOPinConfigure(GPIO_PD1_I2C3SDA);
GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0);
GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_1);
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_2);
GPIOIntEnable(GPIO_PORTB_BASE, GPIO_PIN_2);
GPIOIntTypeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE);
IntMasterEnable();
I2CMInit(&g_sI2CInst, I2C3_BASE, INT_I2C3, 0xff, 0xff, SysCtlClockGet());
UARTprintf("I2CM Init\n");
SysCtlDelay(SysCtlClockGet()/3);
//MPU9150Init
MPU9150Init(&g_sMPU9150Inst, &g_sI2CInst, MPU9150_I2C_ADDRESS,MPU9150AppCallback, &g_sMPU9150Inst);
UARTprintf("MPU9150 Init");
MPU9150AppI2CWait(__FILE__,__LINE__);
UARTprintf("Transaction!\n");
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__);
UARTprintf("Sensor Configured!\n");
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__);
UARTprintf("hello \n");
while(1)
{
//i2c status
//mpu 9150 reading
MPU9150DataAccelGetFloat(&g_sMPU9150Inst, &g_pfAccel[X], &g_pfAccel[Y],
&g_pfAccel[Z]);
g_i16Accel[0]= ((g_pfAccel[0] /9.81f)*100.f);
g_i16Accel[1]= ((g_pfAccel[1] /9.81f)*100.f);
g_i16Accel[2]= ((g_pfAccel[2] /9.81f)*100.f);
MPU9150DataGyroGetFloat(&g_sMPU9150Inst, &g_pfGyro[X], &g_pfGyro[Y],
&g_pfGyro[Z]);
g_i16Gyro[X]= (g_pfGyro[X] *100.f);
g_i16Gyro[Y]= (g_pfGyro[Y] *100.f);
g_i16Gyro[Z]= (g_pfGyro[Z] *100.f);
MPU9150DataMagnetoGetFloat(&g_sMPU9150Inst, &g_pfMag[X], &g_pfMag[Y],
&g_pfMag[Z]);
g_i16Mag[X]= (int16_t) (g_pfMag[X] *1000000.f);
g_i16Mag[Y]= (int16_t) (g_pfMag[Y] *1000000.f);
g_i16Mag[Z]= (int16_t) (g_pfMag[Z] *1000000.f);
}
}