从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的部分都要变得。