Other Parts Discussed in Thread: EK-TM4C123GXL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:EK-TM4C123GXL 我尝试使用之前在该论坛中讨论过的"标准代码"来读取 MPU6050 I2C。 如下所示。
我的问题是我在子函数内遇到硬故障(MPU6050Init->I2CMCommand (i2cm_drv.c)->MAP_IntEnable
在函数内部、参数 uint8_t ui8int= 0x16 (此处为 ui32Interrupt)满足 if-else 要求
否则 if (ui32Interrupt >= 16) { // //检查通用中断。 // ui32Ret = HWREG (g_pui32EnRegs[(ui32Interrupt - 16)/32])& (1 <<(ui32Interrupt - 16)& 31)); } return (ui32Ret);
编译器显然不喜欢它。 我想知道在这里如何发生错误、因为 u8int_t 是由定义的"与 I2C 模块关联的中断编号"
#define INT_I2C0 INT_CONCAT (INT_I2C0_、INT_DEVICE_CLASS)。
之前调用的 map_IntDisable 函数具有相同的参数
否则 if (ui32Interrupt >= 16) { // //禁用通用中断。 // HWREG (g_pui32Dii16Regs[(ui32Interrupt - 16)/32])= 1 <<(ui32Interrupt - 16)& 31); }
不会导致任何故障。 有人能不能弄清楚这个问题的原因是什么。
#include #include #include #include #include include "sensorlib/i2cm_drv.h"#include "sensorlib/hw_mpu6050.h"#include "sensorlib/mpu6050.h"#include "inc/hw_ins.h"#include "driverlib/msp.h"#include "driverlib/msp.h"#include "#driverlib/包含"#driverh/driverh"#include "#driverlib/#driver.h"#include "#include "#driverlib/driver.h"#include "#driver.h"#include "#driverlib/driver.h"#include "#driver.h"#include "#driverlib.intrintr.包含"#driver.h"#drive"#drive"#drive"#driverlib/#driver.h"#include "#include "#driver.h"#include "#def"#drive"#include "#def"#drive"#include "#def"#driverlib.lib.lib.in.intr.intr.包含"#driver.h"#driver.h 已完成。 // volatile bool g_bMPU6050Done;// I2C 主实例// tI2CMInstance g_sI2CMSimpleInst;//设备频率// int clockFreq;void InitI2C0 (void){//启用 I2C 模块0 SysCtl_Periph_b 外设使能(SysCtl_Periph_B2);//在 GPIC2C0_0_0上启用外设复位);//配置外设中断0_SYSCB3/SYSCB3/SYSRB2外设功能。 GPIOPinConfigure (GPIO_PB2_I2C0SCL);GPIOPinConfigure (GPIO_PB3_I2C0SDA);//为这些引脚选择 I2C 功能。 GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);//启用并初始化 I2C0主模块。 使用 I2C0模块的系统时钟。 // I2C 数据传输速率设置为400kbps。 I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、TRUE);//->也尝试了:I2CMasterInitExpClk (I2C0_BASE、8000Freq、TRUE);//清除 I2C FIFO HWREG (I2C0_BASE + I2C_O_FIFOCTL)= 8000主驱动程序/初始化 I2C 驱动程序。 I2CMInit (&g_sI2CMSSimpleInst、I2C0_BASE、INT_I2C0、0xff、0xff、160000000); ;//->还尝试了:I2CMInit (&g_sI2CMSSimpleInst、I2C0_BASE、INT_I2C0、0xff、0xff、clockFreq)}//此示例在 MPU6050事务完成后作为回调提供的函数//。 // void MPU6050Callback (void *pvCallbackData、uint_fast8_t ui8Status){//查看是否发生错误。 // if (ui8Status!= I2CM_STATUS_SUCCESS){//发生错误,所以如果需要,在此处处理。 //}//////表明 MPU6050传输已完成。 // g_bMPU6050Done = true;}// I2C 模块的中断处理程序。 // void I2CMSSimpleIntHandler (void){//调用 I2C 主驱动程序中断处理程序。 // I2CMIntHandler (&g_sI2CMSSimpleInst);}// MPU6050示例。 // void MPU6050Example (void){fAccel[3]、fGyro[3];tMPU6050 sMPU6050;//初始化 MPU6050。 此代码假定 I2C 主设备实例//已初始化。 // g_bMPU6050Done = false;MPU6050Init (&sMPU6050、&g_sI2CMSSimpleInst、0x68、MPU6050Callback、 sMPU6050);while (!g_bMPU6050Done){}//////将 MPU6050配置为+/- 4 g 加速度计范围。 // g_bMPU6050Done = false;MPU6050ReadModifyWrite (&sMPU6050、MPU6050_O_ACCEL_CONFIG、~MPU6050_ACCEL_CONFIG_AFS_SEL_M、MPU6050_ACCEL_CONFIG_AFS_SEL_4G、 MPU6050Callback、&sMPU6050);while (!g_bMPU6050Done){}////循环永久读取 MPU6050中的数据。 通常、此过程//将在后台完成、但出于本示例的目的、//它显示在无限循环中。 // while (1){////请求从 MPU6050读取另一个数据。 // g_bMPU6050Done = false;MPU6050DataRead (&sMPU6050、MPU6050Callback、&sMPU6050);while (!g_bMPU6050Done){}//获取新的加速计和陀螺仪读数。 // MPU6050DataAccelGetFloat (&sMPU6050、&fAccel[0]、&fAccel[1]、&fAccel[2]);MPU6050DataGyroGetFloat (&sMPU6050、 &fGyro[0]、&fGyro[1]、&fGyro[2]);////使用新的加速计和陀螺仪读数执行一些操作。 //}}int main (){clockFreq = SysCtlClockFreqSet (SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、160000000);InitI2C0 ();MPU6050Examples();return (0);}