Aquí está el código:
...
I2C1->CR2 &= ~I2C_CR2_RD_WRN; // Write. Set 0 in RD_WRN bit for transfer direction in master mode.
I2C1->CR2 |= 0x19 << 1; // Accelerometer address (without r/w bit).
I2C1->CR2 |= I2C_CR2_START; // Set START bit. Master sends start condition, slave address and R/W bit.
...
La hoja de datos LSM303DLHC dice que la dirección de esclavo de 7 bits del axelerómetro es 0011001b. STM32F3 tiene un bit separado RD_W_RN en el registro I2C_CR2 para almacenar el bit R / W. Es 0 al reiniciar. La dirección se deja desplazada en la segunda línea debido a que el bit 0 de la dirección del esclavo (SADD0) no se preocupa de acuerdo con el manual de referencia STM32F3VCT6.
El problema es que sigo obteniendo el indicador Arbitraion Lost (ARLO) en el registro ISR justo después de configurar el bit de INICIO en la línea 3. Mi programa espera que los datos se desplacen del registro TXDR y la ejecución se detiene aquí.
¿Esta configuración es correcta? ¿Es posible que se pierda el arbitraje debido a una dirección incorrecta del dispositivo esclavo?