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

El acelerómetro BMA180 puede ser esclavo SPI o esclavo I 2 C. Los pines para ambos buses 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

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

Aquí hay un modo de falla , que me preocupa. Supongamos que BMA180 está en el bus SPI. También hay otro dispositivo en el mismo bus con su propia selección de chip. Supongamos que el maestro del bus SPI se está comunicando con ese otro dispositivo. CSB para BMA180 es alto, por lo que su I 2 C debería estar habilitado. BMA180 ve bordes de reloj en SCL (SCLK de SPI) y bits en SDA (MOSI de SPI) volando. ¿Qué pasa si algunos de estos bits ven a BMA180 como el comienzo de una transacción de lectura I 2 C válida, y BMA180 comienza a generar datos y golpea 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, idea o referencia es realmente apreciada!

Actualizar. Encontré algo en la hoja de datos (ver 7.7.11) . Se recomienda deshabilitar I 2 C configurando el dis_i2cbit, si se comunica con BMA180 a través de SPI.

Cuando se utiliza la interfaz SPI, se recomienda encarecidamente establecer dis_i2c en 1 para evitar un mal funcionamiento.

BMA180 tiene una EEPROM incorporada. El contenido del registro puede almacenarse en la EEPROM y cargarse automáticamente en la secuencia de encendido. Por lo tanto, es posible hacer que BMA180 ignore I 2 C por completo y siempre.

Actualizar. El giroscopio L3GD20 es otro IC, que comparte pines entre I 2 C y SPI de manera similar. No parece tener una configuración de bit para deshabilitar el modo I 2 C. Por lo tanto, requeriría una puerta OR como ADXL345, que mencionó @markrages.

¡Aviso! Bosch dejó de enviar BMA180 ( carta oficial aquí ).

Respuestas (1)

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

Cuidadosamente reescribí 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.

Aparentemente no soy el único en encontrar esto. Este párrafo apareció en una revisión posterior de la hoja de datos ADXL345:

ingrese la descripción de la imagen aquí

+1 y gracias! Acabo de encontrar en la hoja de datos que BMA180 tiene un bit de desactivación I2C (ver 7.7.11). Es concebible que el BMA180 también tenga una puerta OR incorporada, y simplemente no se menciona explícitamente en la hoja de datos.
La puerta OR desactiva efectivamente el modo I2C, por lo que no está integrado en el chip. (Si el diseñador del chip pudiera prescindir del pin adicional, la situación podría evitarse por completo).
No debí haber escrito "demasiado" en el post anterior. Por "también" significa "además del bit de desactivación de I2C". También me equivoqué al decir que, en este esquema, la puerta OR puede incorporarse permanentemente en el acelerómetro IC. Eso deshabilitaría el I2C para siempre. Voy a reescribir ese comentario anterior.
BMA180 tiene 3 pines DNC/reservados. Puede ser, ya se utilizan para fines de fábrica.
He notado que los acelerómetros digitales tienden a ser compatibles entre sí. Eso podría explicar los pines no utilizados. O prueba de fábrica como dijiste.