使用Tiva C直接寄存器模式的MPU6050电源管理

时间:2017-09-20 10:09:36

标签: mpu6050

没有成功让MPU6050退出休眠模式。我知道需要清零SLEEP位(第6位),但执行清零后读取电源管理寄存器会返回0x40。即第6位尚未清除。

是的,这是一项作业,因此我们不允许使用任何图书馆等。我的导师无法提供帮助,建议我在这里询问。

我的I2C设置如下

void I2C1_Setup(void)
{
//Setup I2C 1 on PORT A Pins 6, 7

// GPIO A 

SYSCTL_RCGCGPIO |= (1<<0); while ((SYSCTL_PRGPIO & (1<<0)) != (1<<0)) {}

GPIOA_AFSEL |= (1<<6)|(1<<7);
GPIOA_PCTL &= ~(0xFF<<24);
GPIOA_PCTL |= (3<<28)|(3<<24);
GPIOA_DEN |= (1<<6)|(1<<7);
GPIOA_ODR |= (1<<7);

// I2C 1

SYSCTL_RCGCI2C |= (1<<1); while ((SYSCTL_PRI2C & (1<<1)) != (1<<1)) {}
/*      
TPR = (System Clock/(2*(SCL_LP + SCL_HP)*SCL_CLK))-1;
TPR = (16MHz/(2*(6+4)*100000))-1;
TPR = 7
*/

I2C1_MCR = (1<<4);                  //master mode
I2C1_MTPR = (7<<0);                 //100Kbps   

//Disable SLEEP mode    
I2C1_MSA = 0xD0;                    // Set slave address and write mode
I2C1_MDR = 0x6B;                    // Power management register        
I2C1_MCS = 0x3;                     // start run mode
while ( !((I2C1_MCS & 1) != 0) ) {}
while ( (I2C1_MCS & 1) == 0 ) {}    // poll busy
I2C1_MDR = 0;
I2C1_MCS = 0x7;                     // stop start run mode
while ( !((I2C1_MCS & 1) != 0) ) {}
while ( (I2C1_MCS & 1) == 0 ) {}    // poll busy
}

要测试电源管理寄存器的值,请使用

    I2C1_MSA = 0xD0;                                // transmit mode
    I2C1_MDR = 0x6B;                                // register address
    I2C1_MCS = 3;                                   // start run mode
    while ( !((I2C1_MCS & 1) != 0) ) {}
    while ( (I2C1_MCS & 1) != 0 ) {}                // poll busy

    I2C1_MSA = 0xD1;                                // receive mode
    I2C1_MCS = 7;                                   // stop start run mode
    while ( !((I2C1_MCS & 1) != 0) ) {}
    while ( (I2C1_MCS & 1) != 0 ) {}                // poll busy
    int data;
    data = I2C1_MDR;

返回值为0x40。当我执行相同的步骤来检查WHO_AM_I寄存器(0x75)时,确认从属地址是0x68。

我知道MPU的功能正常,因为我们可以使用此处提供的简单草图获取arduino的读数(https://playground.arduino.cc/Main/MPU-6050

我正在使用TM4C123GH6PM和keil uvision5。

真的不确定这里出了什么问题。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我尝试发送/ rec时似乎使用了错误的运行模式。数据。 而不是使用停止开始运行(0x7),不需要重新发送启动命令,只需发送停止运行(0x5)。

而不是

I2C1_MCS = 0x7;                     // stop start run mode

使用

I2C1_MCS = 0x5;                     // stop run mode