2017-09-20 4 views
0

Sans succès, le MPU6050 passe en mode SLEEP. Je comprends que le bit SLEEP (bit 6) doit être effacé, mais en lisant le registre de gestion de l'alimentation après avoir effacé le retour, 0x40. Le bit 6 n'a pas été effacé.MPU6050 Gestion de l'alimentation utilisant le mode de registre direct Tiva C

Oui, ceci est pour une affectation, et en tant que telle, nous ne sommes pas autorisés à utiliser des bibliothèques, etc. Mon tuteur n'a pas pu aider et m'a suggéré de demander ici.

Ma configuration I2C est la suivante

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 
} 

Pour tester la valeur du registre de gestion de l'alimentation est utiliser

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; 

La valeur de retour pour c'est 0x40. Lorsque j'effectue les mêmes étapes pour vérifier le registre WHO_AM_I (0x75), il est confirmé que l'adresse de l'esclave est 0x68.

Je sais que le MPU fonctionne généralement comme nous avons pu obtenir des lectures sur un arduino à l'aide du simple croquis fourni ici (https://playground.arduino.cc/Main/MPU-6050)

J'utilise le TM4C123GH6PM et Keil uvision5.

Je ne sais vraiment pas ce qui ne va pas ici.

Toute aide est appréciée.

Répondre

0

semble que j'ai utilisé le mauvais mode de fonctionnement en essayant d'envoyer/rec. les données. au lieu d'utiliser stop start run (0x7), nécessaire pour ne pas renvoyer la commande start et juste envoyer stop run (0x5).

au lieu de

I2C1_MCS = 0x7;      // stop start run mode 

utilisation

I2C1_MCS = 0x5;      // stop run mode