acelerómetro BMA180. ¿Cómo se las arregla para compartir pines entre I2C y SPI?

11

El acelerómetro BMA180 puede ser esclavo SPI o I 2 C slave. Los pines de ambos autobuses son compartidos.

SPI mode                    I2C mode
---------------------------------------------------
SDI  input                  SDA  bidirectional (!)
SDO  output                 ADDR address bit, input
SCLK input                  SCL  input
CSB  chip select, input     I2C  mode select, input

Según la hoja de datos (ver capítulo 8) , la selección entre buses se realiza a través del pin CSB. Cuando CSB está bajo, el dispositivo es un esclavo SPI. Cuando CSB es alto, el dispositivo es un esclavo I 2 C

.

Aquí hay un modo de error , que me preocupa. Supongamos que BMA180 está en el bus SPI. También hay otro dispositivo en el mismo bus con su propio chip select. Supongamos que el bus maestro SPI se está comunicando con ese otro dispositivo. CSB para BMA180 es alto, por lo que es I 2 C debería estar habilitado. BMA180 ve bordes de reloj en SCL (SCIK de SPI) y bits en SDA (MOSI de SPI) volando. ¿Qué sucede si algunos de estos bits se parecen a BMA180 como el inicio de una transacción de lectura I 2 C válida, y BMA180 comienza a generar datos y afecta la transacción SPI existente? ¿Cómo evitaría eso el diseño de BMA180?

Esto es una cuestión de curiosidad. Todavía no he experimentado con estos problemas. Usaré BMA180 en SPI.

¡Cualquier sugerencia, conocimiento o referencia es realmente apreciada!

Actualización. Encontré algo en el hoja de datos (ver 7.7.11) . Se recomienda desactivar I 2 C configurando el bit dis_i2c , si se comunica con BMA180 a través de SPI.

  

Cuando se utiliza la interfaz SPI, se recomienda configurar dis_i2c en   1 para evitar el mal funcionamiento.

BMA180 tiene EEPROM incorporada. El contenido del registro se puede almacenar en la EEPROM y cargar automáticamente en la secuencia de encendido. Por lo tanto, es posible hacer que BMA180 ignore I 2 C completamente y siempre.

Actualizar. L3GD20 gyro es otra IC, que comparte pines entre I 2 C y SPI de una manera similar. Parece que no tiene un poco de configuración para deshabilitar el modo I 2 C. Por lo tanto, requeriría una puerta OR como ADXL345, que @markrages trajo.

¡A la cabeza! Bosch dejó de enviar BMA180 ( carta oficial aquí ).

    
pregunta Nick Alexeev

1 respuesta

14

He visto exactamente el comportamiento que teme en un ADXL345, que utiliza el mismo esquema de selección I2C / SPI. Tenía otro dispositivo SPI que usaba una polaridad de reloj diferente y resultó que emulaba un código de inicio I2C, el ADXL345 intentó hablar fuera de turno como I2C. Malas noticias.

Reescribí cuidadosamente el SPI como bit bang en lugar de usar el periférico, asegurándome de no cambiar la línea MOSI mientras el reloj estaba alto. (Esta es la condición de inicio de I2C). Eso pareció resolver las cosas.

Si estuviera comenzando desde cero, intentaría usar el bus I2C en su lugar o un puerto SPI dedicado para el ADXL345.

Al parecer, yo no sería el único en encontrar esto. Este párrafo apareció en una revisión posterior de la hoja de datos ADXL345:

    
respondido por el markrages

Lea otras preguntas en las etiquetas