Problèmes liés à la série TIva C avec l’interface I2C

J’essaie actuellement d’interfacer ma série Tiva C avec une carte Sparkfun Breakout Board, une carte combo numérique IMU – 6 degrés de liberté ITG3200 / ADXL345 et je rencontre des problèmes avec l’interface I2C.

actuellement c’est mon code:

#include  #include  #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/i2c.h" uint8_t SLAVE_ADDRESS = 0x68; uint32_t first_byte, second_byte, temperature, result; void i2c_setup(void) { //Enable the I2C Module SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); //Wait at least 5 clock cycles SysCtlDelay(2); //Configure SDA and SCL GPIOPinConfigure(GPIO_PE4_I2C2SCL); GPIOPinConfigure(GPIO_PE5_I2C2SDA); //Wait at least 5 clock cycles SysCtlDelay(2); //Set PE4 as SCL GPIOPinTypeI2CSCL(GPIO_PORTE_BASE, GPIO_PIN_4); //Set PE5 as SDA GPIOPinTypeI2C(GPIO_PORTE_BASE, GPIO_PIN_5); //Configure Master, I2CMasterInitExpClk(I2C2_BASE, SysCtlClockGet(), false); } uint32_t i2c_read() { I2CMasterSlaveAddrSet(I2C2_BASE, SLAVE_ADDRESS, false); I2CMasterDataPut(I2C2_BASE, 0x1A); I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_SEND); while(I2CMasterBusBusy(I2C2_BASE)); //Loop until the bus is no longer busy I2CMasterSlaveAddrSet(I2C2_BASE, SLAVE_ADDRESS, true ); I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE); while(I2CMasterBusBusy(I2C2_BASE)); //Loop until the bus is no longer busy first_byte = I2CMasterDataGet(I2C2_BASE); return first_byte; } void setup() { Serial.begin(9600); i2c_setup(); } void loop() { int test = i2c_read(); Serial.println(test); delay(1000); } 

J’utilise Energia pour tester mon programme et lorsque j’essaie de lire dans le registre spécifié, j’obtiens le même résultat, quel que soit le registre choisi, le résultat est toujours décimal 229 (il s’agit de l’adresse du périphérique de l’accéléromètre).

Quelqu’un peut-il me diriger dans la bonne direction, je regarde mon code depuis un certain temps et je ne sais toujours pas ce qui ne va pas …

Merci!

J’ai parcouru votre code et tout semble bien. Clairement, quelque chose fonctionne bien si vous obtenez une réponse. Mais comme l’a dit Martin, il est un peu difficile de résoudre le problème sans y être. Au lieu d’écrire 0x1A, pouvez-vous essayer d’utiliser l’une des autres commandes I2C pour l’accéléromètre? De plus, si le cavalier est connecté à VDD, votre adresse doit être 0x69 (105 décimal). Etes-vous sûr que c’est 0x68?

J’ai consulté la documentation sur le site Web sparkfuns et ils ont fourni la liste de commandes suivante.

  char WHO_AM_I = 0x00; char SMPLRT_DIV= 0x15; char DLPF_FS = 0x16; char GYRO_XOUT_H = 0x1D; char GYRO_XOUT_L = 0x1E; char GYRO_YOUT_H = 0x1F; char GYRO_YOUT_L = 0x20; char GYRO_ZOUT_H = 0x21; char GYRO_ZOUT_L = 0x22; 

GL espère que tout va bien. J’avais l’intention d’acheter le mien, alors tenez-moi au courant!