MPU9255 sin lib en STM32

0

Tengo un código en Arduino para leer los datos de MPU9255 sin bibliotecas, usándolo directamente a través de I2C. Estoy tratando de hacer lo mismo en Keil uVision con Bluepill, solo para aprender a usar I2C con los controladores HAL.

No sé qué estoy haciendo mal, aquí está el código:

uint8_t adressMPU = 0x68;
uint8_t i2cData;
uint8_t* receive_buffer = 0;

i2cData = 0x6B;

HAL_I2C_Master_Transmit(&hi2c1, adressMPU, &i2cData, 1, 100 );  //Starts MPU
HAL_I2C_Master_Transmit(&hi2c1, adressMPU, 0, 1, 100 );
while (1)
{       
    i2cData = 0x43; //adress of the register to read Accelerometer x axis
    HAL_I2C_Master_Transmit(&hi2c1, adressMPU, &i2cData, 1, 100 ); //set the register address

    HAL_I2C_Master_Receive(&hi2c1, adressMPU, receive_buffer, 2, 100); request 2 bytes from the register
    HAL_UART_Transmit(&huart1,receive_buffer,sizeof(receive_buffer),100); // send it to serial port

    HAL_Delay(500); 
}

Mi código en Arduino que está funcionando:

Wire.begin();                 //inicia I2C
Wire.beginTransmission(MPU);  //Inicia transmissão para o endereço do MPU
Wire.write(0x6B);             

Wire.write(0); 
Wire.endTransmission(true);

Wire.beginTransmission(MPU);      //transmite
Wire.write(0x43);                 // Endereço registrador do Gyro
Wire.endTransmission(false);     //Finaliza transmissão
Wire.requestFrom(MPU,6,true);   //requisita 6 bytes  
mediaGyroX += Wire.read()<<8|Wire.read();  //GYRO EIXO X  

Seguramente estoy haciendo algo mal, pero no puedo ver el error. ¿Puede alguien ayudarme?

    

1 respuesta

2

Para STM32, HAL define la dirección del esclavo como uint8_t adressMPU = (0x68<<1); , porque si verifica la descripción del registro:

en el modo de direccionamiento de 7 bits en realidad [7: 1] los bits del registro I2C CR2 se utilizan pero HAL establece el campo de dirección de la siguiente manera:

tmpreg |= (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | (((uint32_t)Size << 16 ) & I2C_CR2_NBYTES) | \
            (uint32_t)Mode | (uint32_t)Request);

/* update CR2 register */
hi2c->Instance->CR2 = tmpreg;

( I2C_CR2_SADD es 0x3FF que en realidad solo enmascara los primeros 10 bits). Entonces, el punto es que HAL establecerá la dirección de 7 bits por error en los bits del registro [6: 0] si no cambia a dejado por uno manualmente.

    
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas