i2c cálculo de velocidad de datos

1

Quiero estimar el rendimiento de las líneas i2c y este es el cálculo que he hecho:

Arquitectura de hardware:

MCU < --- > i2c mux TCA9548A < --- > 8 sensores IMU basados en i2c MPU6050

¿Qué estoy tratando de hacer?

Los sensores se conectarán a MCU a través de multiplexor. Habrá una longitud máxima de cable de 1 metro entre MCU y cualquier sensor. MCU leerá cíclicamente todos los sensores y transmitirá los datos a una PC o un teléfono móvil a través de Bluetooth / wifi para su posterior procesamiento.

  

Datos totales de un sensor:

     

Acelerómetro: 3 ejes X 16 bits = 48 bits

     

Giroscopio: 3 ejes X 16 bits = 48 bits

Cada lectura tendrá una sobrecarga de dirección del dispositivo = 31 bits (Editado según el comentario de JimmyB)

La lectura única requerirá 48 + 48 + 31 = 127 bits

Suponiendo que mi reloj i2c funciona a 400 kHz, podré transferir 1 bit en cada ciclo de reloj y, por lo tanto, 400,000 bits en un segundo.

Una lectura completa = leer todos los sensores una vez, es decir, 127x8 = 1016 bits

Por lo tanto, no. muchas veces puedo leer todos los valores de los sensores cada segundo (RPS):

RPS = 400,000 / 1016 = 393.7 asumiendo que mis sensores están listos para suministrar datos a esa tasa.

  

Notas de la hoja de datos:

     

Velocidad de datos de salida para Gyro = 4 Hz a 8000 Hz

     

Velocidad de datos de salida para Accelero = 4Hz a 1000 Hz

El peor escenario posible: mis sensores estarán a una distancia de 1 metro (máx.) de la MCU. Teniendo en cuenta el aumento de la capacitancia del bus y otras cosas que podrían ralentizar la transferencia de datos, creo que 100 kHz todavía serán alcanzables (¿tengo razón al pensar que sí?).

Por lo tanto, se reduce el RPS = 98.4

¿Son correctos mis cálculos?

¿Qué precauciones debo tomar para mejorar el rendimiento de mis datos? (¿cable trenzado ?, ¿algo de búfer i2c?)

ACTUALIZACIONES:

Hice una investigación después de publicar esta pregunta. Encontré un búfer de bus i2c P82B96 que me permite tener una frecuencia de reloj de 400 kHz para longitudes de cable que excedan 20 metros.

Lo único que limita es el programa, supongo, siempre que mis cálculos sean precisos.

    
pregunta Whiskeyjack

1 respuesta

2

No soy un gran fanático de las imágenes con texto ... pero esta vez excel fue la forma correcta de ilustrarlo.

Eldata0esunbytededatosdelacelerómetro0,data1esunbytedelosdatosdelacelerómetro1,etc.

Susdatosseenviaránenserie,peroleeráenparalelo.Entonces,elprimerbytequeleaserátodoslosprimerosbitsde8registrosdedatos.Elsegundobytequeleaseráelsegundobitdelos8acelerómetros.

Porloquesé,cadaturnoycada"&" y cada "|" lleva al menos un ciclo de reloj. Por lo tanto, para transponer necesita pasar una cantidad considerable de tiempo. Para cada registro y datos que gasta 8 × Y + 7 × O + 7 × cambio (esta es la solución que encontré en la parte superior de mi cabeza, lo más probable es que se pueda optimizar, especialmente el cambio). Entonces necesitas cargar y leer de la memoria, así que supongo que supongo 10 relojes. Por lo tanto, debe gastar al menos 8 × (8 + 7 + 7 + 10) = 256 relojes solo para transponer la información. Y tienes que hacerlo por cada byte que leas. Entonces (48 + 48) bits / 8 = 12 bytes. 12 × 256 = 3072 relojes. No sé si obtuviste hilos o qué tan rápido será tu CPU, pero 3072 estará al menos dentro del número de ciclos necesarios para convertir las cosas. Será un poco más, ya que tendrá que configurar algunas interrupciones y casos para que sepa en qué bit se encuentra y la función de llamada. Así que diga 4000 relojes para leer todos los 96 bits. Y toda la programación será ... aburrida de implementar.

Una pequeña optimización que me di cuenta, después de cada reloj puedes hacer el cambio fácilmente. Eso ahorrará varios relojes, por lo que 4000 relojes en total - > 3500 relojes en total. Es sólo una aproximación.

Así es como lo haría. Y si no tuviera hilos / núcleos múltiples / suficiente velocidad disponible, dividiría la carga en 2 microcontroladores y usaría un UART entre ellos. Uno decodifica datos a reg y reg a datos. El otro solo lee directamente desde UART a alta velocidad y mantiene el programa que pretende utilizar. O simplemente obtendría un FPGA barato e implementaría 8 canales i2c allí + un uart.

    
respondido por el Harry Svensson

Lea otras preguntas en las etiquetas