I²C TWI

ANTECEDENTES

En esta sección se supone que está familiarizado con los conceptos de E/S digitales.

Interfaz de dos cables (TWI ) es el nombre genérico para las interfaces conocidas comúnmente como I²C y SMBus. Es una interfaz que permite la comunicación en serie semidúplex entre varios dispositivos, que comparten el mismo bus, con un mínimo de 2 hilos (de ahí el nombre). Cada uno de los dispositivos puede ser maestro o esclavo, donde los maestros son los únicos que pueden iniciar transacciones de datos. Cada dispositivo esclavo tiene una dirección única en el bus, que se utiliza para seleccionarlo como el objetivo de una comunicación. TWI es compatible con múltiples maestros en un bus, pero esto es un caso de uso más bien raro, y para el resto de esta discusión vamos a suponer que sólo hay uno.

Los dos cables utilizados se llaman SDA ( datos) y SCL (reloj). Ambos operan en modo de drenaje abierto, con una resistencia pull-up externa a 3.3V o 5V necesaria en cada uno. La línea SCL es normalmente controlado por el maestro, pero en ciertas situaciones (estiramiento del reloj) se puede extraer desde un dispositivo esclavo. La línea SDA se utiliza para la transferencia de datos en ambas direcciones. El protocolo dicta quien tiene acceso a la línea SDA en un momento dado. Ciertas combinaciones de estado SDA/SCL se utilizan como señales especiales entre el master y el esclavo, como el comienzo y el final de una comunicación.

Una comunicación TWI se compone de una o más etapas de escritura o lectura pasos. En una etapa de escritura, el maestro envía datos a un esclavo. En una etapa de lectura, el esclavo envía los datos al maestro. Por lo general , las operaciones de inmersión recíproca tendrán ya sea una escritura seguida de una lectura , o sólo una sola escritura/lectura.

Unos parámetros tienen que ser respetados entre maestro y esclavo. En primer lugar, TWI admite dos formatos de dirección : 7 bits y 10 bits, siendo el primero más común. MIOIO soporta ambos. Consulte la documentación del esclavo para averiguar su formato y valor de la dirección. Tenga en cuenta que en 7 bits de direccionamiento, algunas documentaciones dispositivo especifican la dirección como un número entre 0-127, mientras que otros dan un número entre 0-255 , donde el bit menos significativo designa lectura/escritura. Tienes que averiguar lo que se utiliza para la convención. MIOIO utiliza la primera, por lo que puede que tenga que dividir por 2 la dirección indicada en la ficha técnica del dispositivo. En segundo lugar, la diferencia entre I²C y SMBus  son los niveles de tensión que esperan en los cables, por lo que este debe ser configurado correctamente. Lo siguiente es la velocidad de datos : 100KHz, 400KHz o 1MHz son compatibles.La última es el protocolo actual, que especifica cuál es el mensaje que el dispositivo espera y lo que los mensajes que envía como respuesta.

MIOIO soporta la actuación como maestro TWI, en un máximo de 3 buses TWI concurrentes. Se puede realizar la escritura-lectura, de sólo escritura o de sólo lectura comunicaciones en las que la duración de la respuesta se conoce de antemano. Tiene que ser el único maestro en cada uno de esos buses. Los pines utilizados para TWI son fijos. Están marcados en la tabla de aquí como el DAX / CLx . donde x corresponde al número de módulo TWI. Una lista completa de las funciones de los terminales se puede encontrar en la tabla en la parte inferior de esta página. La resistencia pull-up externa es normalmente de 10k ohmios a 3,3 V, se requiere en ambas líneas.

COMO USARLO

Para usar los módulos MIOIO TWI se realiza a través de la interfaz TwiMaster. Una instancia de esta interfaz se corresponde con un único módulo TWI en el tablero, así como a los pines que utiliza para SDA y SCL. Los eventos TwiMaster se obtienen llamando IOIO.openTwiMaster(). Por ejemplo:

TwiMaster twi = ioio.openTwiMaster(twiNum, TwiMaster.Rate.RATE_100KHz, false);

Esto abre un número de módulo TWI  twiNum en modo maestro, utilizando los pines dedicados SDA y SCL. El módulo TWI funcionará a 100KHz (400KHz y 1MHz también están soportados) y  utilizará los niveles de voltaje I²C(hay que pasar true como tercer argumento para los niveles SMBus). Es necesario que en el momento de la llamada, los pines dedicados TWI no están siendo utilizados para otra cosa, y que el módulo TWI solicitado no se encuentre en uso.

Una vez que se obtiene una instancia de TwiMaster, las solicitudes se pueden enviar mediante el uso de:

byte[] request = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 };
byte[] response = new byte[4];
twi.writeRead(address, false, request, request.length, response, response.length);

Esto escribirá 0x01, 0x02, 0x03, 0x04, 0x05 al dispositivo con la dirección solicitada, luego leerá 4 bytes de la misma. El false  pasado como segundo argumento significa que estamos usando el modo de direccionamiento de 7 bits.

El método writeRead() se bloqueará hasta que se reciba una respuesta, y entonces la respuesta se puede leer de la memoria de respuesta. Si no se desea el bloqueo, también hay una versión asíncrona:

TwiMaster.Result result = twi.writeReadAsync(address, false, request, request.length, response, response.length);
// ...do some stuff while the transaction is taking place...
result.waitReady();  // blocks until response is available
doSomethingWithResponse(response);

Cuando haya terminado de utilizar el módulo de TWI, utiliza:

twi.close();

con el fin de devolver los pines a un estado "flotante" y, posiblemente, ser capaz volverlos a abrir en el mismo o en un modo diferente, así como liberar el módulo TWI. La instancia TwiMaster se vuelve inútil después de esta llamada - no se puede hacer nada con ella.

Deja un comentario

Tu dirección de correo electrónico no será publicada.