2017-09-20 10 views
0

MPU6050이 절전 모드에서 빠져 나오지 못했습니다. 나는 SLEEP 비트 (비트 6)를 지울 필요가 있음을 이해하지만, Clear를 수행 한 후 전원 관리 레지스터를 읽는 것은 0x40을 반환합니다. 즉 비트 6은 클리어되지 않는다.MPU6050 Tiva C 다이렉트 레지스터 모드를 사용한 전원 관리

예 이것은 과제를위한 것이며, 따라서 우리는 도서관 등을 사용할 수 없습니다. 교사는 도움을 줄 수 없어서 여기에서 질문하십시오.

내 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 
} 

을 다음과이 × 40 인에 대한

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; 

반환 값을 사용합니다. 동일한 단계를 수행하여 WHO_AM_I 레지스터 (0x75)를 확인하면 슬레이브 주소가 0x68임을 확인합니다.

나는 우리가 여기 (https://playground.arduino.cc/Main/MPU-6050)에서 제공하는 간단한 스케치

나는 TM4C123GH6PM와 카일 uvision5을 사용하고 있습니다를 사용하여 아두 이노에 측정 값을 얻을 수 있었다으로 MPU는 일반적으로 작동 알고있다.

실제로 무엇이 잘못되고 있는지 확실하지 않습니다.

도움을 주시면 감사하겠습니다.

답변

0

/rec를 보내려고 할 때 잘못된 실행 모드가 사용 된 것처럼 보입니다. 자료. stop start run (0x7)을 사용하는 대신 start 명령을 다시 보내지 말고 stop run (0x5)을 보내야합니다.

대신

I2C1_MCS = 0x7;      // stop start run mode 

사용

I2C1_MCS = 0x5;      // stop run mode