Paso 4: unas palabras sobre el bus I²C
Breve descripción del bus
El bus I²C es un 8 o 10 bits, protocolo de comunicación serial bidireccional, con tasas de transferencia de 100 KHz, 400 KHz o recientemente 1 MHz (modo rápido plus). El bus consta de dos señales bidireccional (generalmente llamado SCL - reloj serial, SDA - datos en serie). Estas señales se conectan a cada dispositivo I²C en nuestro circuito con que nos quiere comunicar.
Thhe SDA línea se utiliza para la transferencia de datos en serie, la línea SCL asegura que la comunicación es en sincronía, en ambas direcciones. Además de estos dos, también tenemos maestro I²C y los esclavos I²C para compartir una tierra común.
Las clavijas de los aparatos conectados a un bus I²C son de colector abierto o drenaje abierto. Esto significa, que pueden traer la línea de comunicación flotante en el suelo, y se puede liberar para elevarse al nivel al que está levantados.
Es muy importante entender, que el término 'liberación' no significa un '1', sólo significa, que el maestro o esclavo no es conducir la línea de comunicación. Dicho esto, tenemos que asegúrese, que la línea no está bajando, cuando se supone que no es que. Esto puede hacerse mediante la instalación de un pull-up en el riel de alimentación del circuito. No debe (o no) poner un pull-up a cada esclavo en el circuito, lo que significaría una conexión paralela, que - si se instalaron muchas resistencias - no permitir que el perno a la línea.
El valor de la resistencia usado no necesita ser un valor dado, generalmente unos resistencia k funciona bien.
El protocolo I²C es maestro-esclavo basado. Un maestro decide cuándo comunican los dispositivos esclavos, a través de algunos datos enviados en el bus I²C. En nuestro caso, el PIC debe configurarse como un esclavo, ya que Arduino será el amo del circuito. Un esclavo es normalmente un sensor, un chip de memoria o cualquier cosa que sea capaz de ampliar las características de un microcontrolador.
Toda la transmisión se desencadenan por el maestro, los esclavos no comunican nada, a menos que el maestro está pidiendo que lo hagan. Correcto funcionamiento de bus I²C asume, que una dirección de esclavo solo es reconocida solamente por un solo esclavo. Cuando se selecciona un esclavo, deben callar todos los otros esclavos.
El maestro es responsable de todo tipo de tiempos - en la mayoría de los sistemas (single-master) la línea de reloj es manipulada sólo por el maestro. Es decir, la velocidad de la transmisión es dictada por el maestro I²C del circuito.
• Cuando un maestro desea iniciar una transmisión, se ejecuta una secuencia de inicio en el bus I²C. Se produce una situación de inicio, cuando la línea SDA a nivel bajo mientras la línea SCL es alta.
• Cuando el maestro quiere señalar, que la transmisión ha terminado, envía a una condición de parada, que es un flanco ascendente en el SDA, mientras que el SCL es alto.
• Datos es transmitido en el marco de tiempo entre estos dos acontecimientos. Un poco de datos sea válida, la SDA no debe cambiar valor, mientras que el SCL es alto. Si es así, la secuencia de bits se malinterpreta como una parada de inicio condición y conduce a la falta de comunicación.
En mi caso, la transmisión de datos se realiza en grupos de 8 bits. Los datos - siguiendo el patrón de endian grande - es registrados hacia fuera con el pedacito más significativo va primero. Después de cada pedacito 8-th obtiene registrado hacia fuera, el esclavo debe señal para que la transferencia a considerar un intercambio de datos exitosa. Esta señal se llama un 'reconocer', y asume, que el esclavo trae la línea SDA en la señal de reloj 9 th sobre la línea SCL.
Como mencioné antes, cada esclavo debe tener una dirección de esclavo único. Esta dirección de esclavo es largos, lo que significa, que un total de 128 dispositivos se puede conectar al bus I²C, sin ningún tipo de manipulación con el circuito de 7 bits.
Cuando se trata de abordar, el maestro envía 8 bits, 7 de los cuales son el esclavo dirección bits, la última de ellas determinar si el maestro desea leer o escribir en los registros internos de dispositivos esclavo. Este último bit se conoce como el bit de R/W, un '0' en este campo de bits significa una escritura, un '1' en este campo de bits significa una lectura.
Por ejemplo, si desea escribir a un dispositivo esclavo con una dirección de esclavo de 0b1010000, él debe enviar 0b1010000 después de la primera condición. Si un maestro desea leer desde el mismo dispositivo, el primer byte después de la condición de inicio debe ser 0b10100001. Estos, convertido en hexadecimal dan 0xA0 y 0xA1. Hojas de datos normalmente dan la dirección de esclavo en formato hexadecimal.
En algunos de los casos, el fabricante le permite agregar más de chip de la misma al bus I²C: esto se logra permitiendo al usuario controlar un número de bits de dirección de esclavo. Por ejemplo, un I²C EEPROM generalmente ha los 3 bits más bajos de su dirección de esclavo traído hacia fuera en las patillas. Tirar estos medios alto un '1' en la correspondiente en el byte de la dirección de esclavo, tirando a tierra significa un '0' en ese lugar.
Hay situaciones, en donde el maestro es demasiado rápido para el esclavo, quiere leer más rápidamente, que el esclavo podía manejar. Para evitar este tipo de situaciones, los fabricantes de dispositivos I²C esclavo pueden construir en una característica, que permite al esclavo tirar la línea SCL baja, mientras que están ocupados ejecutando las órdenes del maestro. Cuando el esclavo se realiza con la medición, lectura, percepción, etc. - lanza la línea SCL, permitiendo que las dominadas tomar la línea de alta. El maestro no iniciará a otra transferencia, a menos que ve la línea SCL alta. Esto se refiere a menudo como 'reloj estiramiento'.
Ejemplo de una condición de inicio seguida de un comando de lectura de esclavo 0xA3. La operación de lectura es válida, nosotros ahora esto, de la confirmación (reconozca) la señal enviada por el esclavo.
Zoom un poco en el extremo de la misma transferencia de datos a captar dos señales más, la parada y el NACK. Este patrón de bit ocurre al final de una secuencia de lectura.
Por desgracia no pude captar reloj estirando las fases, pero si veo uno al trabajar con el PIC I²C, se aseguro a los lectores.
Así, aprendimos a esto y que sobre el protocolo de comunicaciones serial usaremos, ahora vamos a ven en acción. En primer lugar quiero presentarles una tabla de ejemplo, una herramienta de PC y un programa del microcontrolador.