This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C123GXL:MPU650-c->i2cm_drv.c 硬件故障

Guru**** 2618835 points

Other Parts Discussed in Thread: EK-TM4C123GXL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/781114/ek-tm4c123gxl-mpu650-c--i2cm_drv-c-hardfault

器件型号: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);}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您引用的上一个论坛帖子是针对 TM4C129器件的。 我无法从您的帖子中得知您是否已对 EK-TM4C123GXL 进行了所有必要的更改。 我附加了一个在 EK-TM4C123GXL 上工作的 CCS8项目。 它使用 I2C3 (这就是我的硬件的配置方式)。

    /cfs-file/__key/communityserver-discussions-components-files/908/MPU6050_2D00_3.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、感谢您提供代码!
    正如预期的那样、它在编译时没有错误并保持在 while (1)-Loop 内、但我只能看到默认值。 无更新。
    我设置了一个与此传感器配合使用的类似 Arduino 项目、但我不知道在何处搜索错误设置。

    此致、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否进行了必要的硬件更改(或软件更改)? 原始线程中的代码使用 I2C0。 我的代码(和硬件)使用 I2C3。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于我没有听到您的反馈、我认为您已经解决了您的问题。 如果不是、您可以对此线程作出响应或启动新的相关线程。