El protocolo I²C permite, en teoría y con un direccionamiento de 7 bits, conectar hasta 127 dispositivos al maestro. Se trata de un número elevado, así que ¿por qué cualquier microcontrolador de bajo coste (p. ej. este PIC24 ), ¿tiene más de un puerto I²C? ¿Por qué es necesario?
Respuestas
¿Demasiados anuncios?Disposición del cubo del sensor
En este escenario, hay dos buses I²C. Llamémoslos autobús local y autobús principal . El propósito del bus local es conectar un grupo de sensores a un microcontrolador (C). El propósito del C es sondear los sensores, agregar información de ellos y detectar ciertos eventos. Un C que desempeña esta función se denomina centro de sensores . El concentrador de sensores no se encarga de las funciones de orden superior; para eso existe un potente procesador principal. El bus principal conecta el concentrador de sensores con el procesador principal. Así pues, el concentrador de sensores C es un maestro en el bus I²C local y un esclavo en el bus I²C principal.
SPI e I²C
El PIC enlazado en el post original no comparte los pines entre SPI e I²C. Sin embargo, hay otros PICs que usan los mismos pines para hardware SPI e I²C, porque ambos están implementados con el mismo periférico MSSP. Si un PIC tiene dos periféricos MSSP separados, entonces uno se puede utilizar para SPI hardware, mientras que el otro se utiliza para I²C hardware.
Una razón muy común para necesitar más de un bus es tener dispositivos que funcionan a diferentes velocidades. Originalmente, I²C funcionaba a un máximo de 100 kHz. Más tarde, la velocidad se incrementó a un máximo de 400 kHz, y aún más tarde, a 1 MHz y superiores.
El problema es que, dado que la dirección de cada dispositivo está integrada en el protocolo I²C, si tienes dispositivos con diferentes velocidades en el mismo bus, por ejemplo 100 kHz y 400 kHz, siempre tendrás que hacer funcionar el bus a la velocidad más baja común a todos los dispositivos del mismo bus (100 kHz en este caso).
Si ejecutaras el bus a la velocidad más alta (400 kHz), obviamente el dispositivo de menor velocidad no funcionaría correctamente, e incluso podría interpretar la dirección del dispositivo de alta velocidad como propia, haciendo que el dispositivo de 400 kHz también fallara. Pero incluso si inicialmente el bus funcionara a 100 kHz, y luego se intentara acelerar el bus a 400 kHz después de direccionar un chip de mayor velocidad, sería posible (aunque probablemente poco probable) que el chip de menor velocidad interpretara uno de los paquetes de datos de alta velocidad incorrectamente como su dirección, y por lo tanto estropeara la comunicación en el bus. En cualquier caso, al final del intercambio con el dispositivo de 400 kHz, el dispositivo de 100 kHz estaría probablemente en un estado desconocido.
Así que es más eficiente, si usted tiene dispositivos que funcionan a diferentes velocidades y tiene varios puertos I²C y tienes los pines de sobra para permitirte tal lujo, para tener un I²C digamos para dispositivos de 100 kHz, otro para dispositivos de 400 kHz, y otro para dispositivos de 1 MHz, según dicten tus necesidades.
Esto no es un problema con SPI porque cada dispositivo está habilitado (direccionado) en hardware por una línea separada de selección de chip. Por tanto, la velocidad de reloj puede ajustarse a la velocidad del chip seleccionado (10 MHz, 20 MHz, lo que sea) sin afectar a otros chips del mismo bus, ya que no están habilitados.
También podría permitirle admitir dos dispositivos con la misma dirección. Sí, la mayoría de los dispositivos le permiten seleccionar tal vez los dos bits inferiores de su dirección con correas. Recientemente he tenido que soportar 4 dispositivos que cada uno sólo le permitió establecer el LSB de su dirección con una resistencia. Tener dos puertos no me supone ningún coste adicional.
Tal vez quiero que uno sea el maestro para un montón de dispositivos y presentar el otro como el puerto esclavo, por lo que mi maestro no tiene que esperar para agarrar el bus para darme un comando mientras sondeo un sensor de temperatura para la 10.000 ª vez.
Parece que hay un montón de otras buenas respuestas en este hilo, sólo añadir mis 2 centavos.
En segundo lugar, I²C puede utilizarse para obtener más ancho de banda (puedes recibir o enviar dos bytes al mismo tiempo).
Si tienes algún ADC que funcione continuamente, un I²C estará ocupado todo el tiempo.
Cambiar de dirección también lleva algo de tiempo, así que en algunos casos - puedes usar dos puertos para dos dispositivos y evitar los cambios de dirección para ahorrar tiempo.