工具/软件:Code Composer Studio
大家好、我想读取 mpu6050加速计和陀螺仪数据。 但它显示了所有数据0。
我已经阅读了。 该查询与该问题相关。
但在我的案例中、这不起作用、我不知道原因。
传感器与 Arduino 配合工作正常。
但使用 tm4c1294显示零值。
这是我的代码。
#include
#include
#include
#include
#include
#include
include "sensorlib/i2cm_drv.h"
#include "sensorlib/i2cm_drv.c"
#include "sensorlib/hw_mpu6050.h"
#include "hw/mpu6050.inc"
#include "hw/driverlib"
#包含"hw_rom_driver.h"#include "#driverlib/driver.h"#include"#hw_driverinc/包含"hw_包含"hw_intrintrl.包含"#hw_driver.h"#driverinc/包含"#driverlib.inc/包含"#driver.h"#def"#def"#driverinc/包含"#driverinc/包含"#hw_inc/包含"#hw_inc/包含"#driverlib.intrl.inc/包含"#driver.h"#driverintrinc/包含"#def"#"#def"#"#def"#def"#"#"#"#def"#def"#def"#def"hw_inc/包含"#def"#def"#def"#def"#"#
当 MPU6050命令完成时设置的布尔值。
//
volatile bool g_bMPU6050Done = true;
tI2CMInstance g_sI2CMSSimpleInst;
tMPU6050 sMPU6050;
void DelaySoft (volatile unsigned long ulDelay){
SysCtlDelay ((SysCtlClockGet ()/ 10000)* ulDelay);
}
//
中断处理程序。
//
void I2CMSSimpleIntHandler (void)
{
//
调用 I2C 主驱动程序中断处理程序。
//
I2CMIntHandler (&g_sI2CMSSimpleInst);
}
void MPU6050Callback1 (void * pvCallbackData、uint_fast8_t ui8Status)
{
//
//查看是否发生错误。
//
if (ui8Status!= I2CM_STATUS_SUCCESS)
{
//
//发生错误,所以如果需要,请在此处处理。
//
}
//
////表示 MPU6050传输已完成。
//
G_bMPU6050Done = true;
}
void InitI2C0 (void)
{
//启用 I2C 模块0
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
//启用包含 I2C 0
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB)
的 GPIO 外设;//为端口 B2和 B3上的 I2C0函数配置引脚复用。
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
//为这些引脚选择 I2C 功能。
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
I2CIntRegister (I2C0_BASE、 I2CMSSimpleIntHandler);
IntMasterEnable();
//初始化 I2C 主驱动程序。
I2CMInit (&g_sI2CMSSimpleInst、I2C0_BASE、INT_I2C0、0xff、0xff、 SysCtlClockGet ();
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、TRUE);
}
//此示例在 I2C 事务完成后作为回调提供的函数。
//
// UARTstdio
//*********
void ConfigureUART (void)
{
// UART
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
// UART0外设
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
// GPIO
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_UART1_UART0
);GPIO_PIN_0_PIN_0_PIN_0_0_Pin;GPIO_PUT0_PIN_0_Pin;GPIO_PUT0_PIN_PIN_0_0_0Pin)
// 16MHz
UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC);
// Colsole I/O
UARTStdioConfig (0、115200、16000000);
}
char buf[100];
char * ftoa (float f)
{
int pos=0、ix、DP、num、num、
if (f=0+=0+
)
;(f=0+= 0+= 0+);(f+
= 0+= 0+=);(f+= 0+= 0+= 0+);(f+= 0+= 0+= 0+);(f+= 0+= 0+);(f+= 0+= 0+= 0+= 0+);(f+= 0+)
f=f*10.0;
dp--;
}
返回 buf;
}
void MPU6050Example (void){
fAccel[3]、fGyro[3];
UARTprintf ("MPU6050初始化\n");
//在地址0x3C 向 I2C 器件写入两个字节的数据。
G_bMPU6050Done = false;
uint_fast8_t 结果= MPU6050Init (&sMPU6050、&g_sI2CMSSimpleInst、0x68、MPU6050Callback1、0);
while (!g_bMPU6050Done)
{
}
UARTprintf ("将 MPU6050配置为+/- 4g 加速计范围\n");
//从地址0x3C 的 I2C 器件读取四个字节的数据。
G_bMPU6050Done = false;
MPU6050ReadModifyWrite (&sMPU6050、MPU6050_O_ACCEL_CONFIG、~MPU6050_ACCEL_CONFIG_AFS_SEL_M、
MPU6050_ACCEL_CONFIG_AFS_SEL_4G、 MPU6050Callback1、0);
while (!g_bMPU6050Done){
}
//循环从 MPU6050永久读取数据
while (1){
//从 MPU6050请求另一个读数
G_bMPU6050Done = false;
MPU6050DataRead (&sMPU6050、MPU6050Callback1、0);
while (!g_bMPU6050Done){
}
//获取新的加速计和陀螺仪读数。
MPU6050DataAccelGetFloat (&sMPU6050、&fAccel[0]、&fAccel[1]、&fAccel[2]);
MPU6050DataGyroGetFloat (&sMPU6050、&fGyro[0]、&fGyro[1]、&fGyro[2]);
UARTprintf ("从 MPU6050接收完整数据\n");
UARTprintf ("Accel x =%s"、fta (fAccel[0]));
UARTprintf ("、y =%s"、fta (fAccel[1]));
UARTprintf ("、z =%s\n"、ftoa (fAccel[2]));
UARTprintf ("Gyro x =%s"、ftoa (fGyro[0]));
UARTprintf ("、y =%s"、fta (fGyro[1]));
UARTprintf ("、z =%s\n"、fta (fGyro[2]));
//DelaySoft (1000);
}
}
int main ()
{
//
将系统时钟设置为从具有晶振基准的 PLL 以40MHz 的频率运行
//
printCtlClockSet (sysctl_SYSDIV_5 | sysctL_use_PLL | sysctl_X2C_16MHz | sysctL_oc_main);
//
配置 UART0 (/UART0)
;// UART0 (uurePrint ();// UART0)(/uart ()(/uart)