Thread 中讨论的其他器件:EK-TM4C123GXL
工具/软件:TI-RTOS
您好!
我正在尝试使用 TI-RTOS 从 MPU-6050获取数据。 我尝试了不同的解决方法并进行了调试。 不幸的是、"I2C_transfer (i2c、&i2cTransaction)"始终返回 false。
我使用非 RTOS 找到了代码。 但我想使用 RTOS 实现。
请在这个问题上帮助我。
非常感谢您的参与、
Yashwanth。
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.
工具/软件:TI-RTOS
您好!
我正在尝试使用 TI-RTOS 从 MPU-6050获取数据。 我尝试了不同的解决方法并进行了调试。 不幸的是、"I2C_transfer (i2c、&i2cTransaction)"始终返回 false。
我使用非 RTOS 找到了代码。 但我想使用 RTOS 实现。
请在这个问题上帮助我。
非常感谢您的参与、
Yashwanth。
请找到我的追踪代码。
请改正我的问题。 我出错了
我很抱歉。 从机地址为0x68、但电源管理寄存器的地址为0x6B。 (对我而言、他们看起来是一样的。) 将0x80写入寄存器0x6B。 然后读取寄存器0x6B。 您应该得到几次0x00、然后是0x40。 读取0x40后、将0x01写入该寄存器。 下面是一个非 RTOS 示例、其工作原理如下:
/cfs-file/__key/communityserver-discussions-components-files/908/6646.MPU6050_2D00_2.zip
e2e.ti.com/.../i2cmpu6050.zipHiBob Crosby、
首先、感谢您耐心回答我的问题
寄存器正确。
请找到 我随附的 RTOS 代码并帮助我。
注:大多数情况下 I2C_Transfer()为 false。
谢谢、此致、
Yashwanth
好的、我认为我看到了问题。 MPU-6050寄存器地址和命令为8位、而不是16位。 您的代码编写如下:
它实际上将0x6B 写入寄存器0、将0x80写入寄存器1、将0x00写入寄存器2。 它应如下所示:
现在、您可以看到它从寄存器0x6B 读取0x40。 下面是对 writeRegister 和 readRegister 例程的一些简单修改。
void writeRegister (I2C_Handle handle、uint16_t regAddr、uint16_t value)
{
uint8_t txBuffer[4];
I2C_Transaction i2c 交易;
i2cTransaction.slaveAddress = MPU6050_I2C_address;
/*写入16位状态寄存器*/
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 2;
i2cTransaction.ReadCount = 0;
txBuffer[0]= regAddr & 0xFF;//LB Addr
TxBuffer[1]=值和0xFF;
if (!I2C_transfer (handle、&i2cTransaction)){
GPIO_WRITE (Board_LED2、Board_LED_ON);
system_abort (" I2C 传输错误!");
}
}
空 readRegister (I2C_Handle handle、
uint16_t regAddr、
uint8_t *数据、
size_t length)
{
uint8_t txBuffer[2];
I2C_Transaction i2c 交易;
i2cTransaction.slaveAddress = MPU6050_I2C_address;
/*写入16位状态寄存器*/
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.readBuf =数据;
i2cTransaction.writeCount = 1;
i2cTransaction.ReadCount =长度;
txBuffer[0]= regAddr & 0xFF;//LB Addr
if (!I2C_transfer (handle、&i2cTransaction)){
GPIO_WRITE (Board_LED2、Board_LED_ON);
system_abort (" I2C 传输错误!");
}
}
以下是当 MPU6050将 SDA 保持在低电平时、我添加了要解决的代码(在"Board_initGPIO()"和"Board_initI2C()"之间添加的行)。
int main (void)
{
Task_Params taskParams;
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();
//检查 I2C SDA 是否未被保持在低电平
//如果是,切换 I2C SCL 直到它被释放
GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_1);
GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_0);
while (GPIOPinRead (GPIO_PORTD_base、GPIO_PIN_1)!= GPIO_PIN_1)
{
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、GPIO_PIN_0);
}
Board_initI2C();
SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|
SYSCTL_OSC_MAIN);
/*构造 nfcLoad Task 线程*/
Task_Params_init (&taskParams);
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
taskParams.instance->name ="传感器";
taskParams.priority = 1;
Task_construct(&task0Struct,(Task_Functr) imuTask、&taskParams、NULL);
GPIO_WRITE (Board_LED0、Board_LED_ON);
system_printf ("启动 I2C 示例\n 系统提供程序设置为 SysMin。"
"停止目标以查看 ROV 中的任何 SysMin 内容。\n");
/* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
system_flush();
srand (0xBEA5);
/*启动 BIOS */
BIOS_start();
返回(0);
}
SCL 中的脉冲太短、基本上被触发线隐藏、但您可以看到它会导致 MPU6050让 SDA 变为高电平。