Acelerómetro BMA180. ¿Cómo logra compartir pines entre I2C y SPI?

11

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

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 de bus SPI se está comunicando con ese otro dispositivo. CSB para BMA180 es alto, por lo que es I 2 C debería habilitarse. BMA180 ve bordes de reloj en SCL (SCLK 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 activa la transacción SPI existente? ¿Cómo evitaría eso el diseño de BMA180?

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

¡Cualquier sugerencia, visión o referencia es realmente apreciada!

Actualizar. Encontré algo en la hoja de datos (ver 7.7.11) . 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 configurar dis_i2c en 1 para evitar un mal funcionamiento.

BMA180 tiene 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 bits para deshabilitar el modo I 2 C. Por lo tanto, requeriría una puerta OR como ADXL345, que trajo @markrages.

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

Nick Alexeev
fuente

Respuestas:

14

He visto exactamente el comportamiento que temes 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ó emular un código de inicio I2C, el ADXL345 trató de 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 comenzara desde cero, trataría de usar el bus I2C o un puerto SPI dedicado para el ADXL345.

Aparentemente no quiero que el único se encuentre con esto. Este párrafo apareció en una revisión posterior de la hoja de datos ADXL345:

ingrese la descripción de la imagen aquí

markrages
fuente
+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 compuerta OR incorporada, y simplemente no se menciona explícitamente en la hoja de datos.
Nick Alexeev
1
La puerta OR efectivamente desactiva el modo I2C, por lo que no está integrado en el chip. (Si el diseñador de chips podía prescindir de la clavija adicional, la situación podría evitarse por completo.)
markrages
No debería haber escrito "demasiado" en la publicación anterior. Por "demasiado" significa "además del bit de desactivación I2C". También me equivoqué al decir que en este esquema, la compuerta OR se puede construir permanentemente en el IC del acelerómetro. Eso deshabilitaría el I2C para todos para siempre. Reescribiré ese comentario anterior.
Nick Alexeev
BMA180 tiene 3x pines DNC / reservados. Puede ser, ya se utilizan para fines de fábrica.
Nick Alexeev
1
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.
markrages