Paso 6: Implementación de código abierto I2C ATTiny USI - USI I2C maestro
La función de transmisión tiene dos argumentos. El primero es un puntero a un búfer de datos en que enviar o recibir datos. Se supone que el primer byte de este buffer es el byte de dirección + R/W (dirección de 7 bits superior, LSB es R/W). Este byte, por protocolo, se transmite siempre y nunca recibió. El resto del búfer será enviado o llenado por datos recibidos según el bit de R/W (1 lectura, 0 para escritura). El segundo argumento es el tamaño del buffer (incluyendo el byte de dirección).
Aquí está un breve ejemplo. Supongamos que queremos generar valor 0x70 a la dirección interna 0x12 del dispositivo con la dirección 0 x 40. En primer lugar, debemos crear un búfer para almacenar nuestra transmisión:
char i2c_transmit_buffer [3];
char i2c_transmit_buffer_len = 3;
i2c_transmit_buffer [0] = (0 x 40 << 1) | //Or'ing 0 0 es innecesaria, pero claridad esto establece el bit de R/W para la escritura.
i2c_transmit_buffer [1] = 0x12; Dirección interna
i2c_transmit_buffer [2] = 0x70; Valor a escribir
Transmitir el mensaje de I2C
USI_I2C_Master_Start_Transmission (i2c_transmit_buffer, i2c_transmit_buffer_size);
Ahí lo tienen, transmisión del mensaje completada! Eso fue fácil! Si desea obtener más información sobre el funcionamiento interno del código USI_I2C_Master, eche un vistazo dentro del archivo de usi_i2c_master.c donde te he comentado los Estados, función de transferencia y otras secciones interesantes. He hecho uso de una línea #define macros para dejar más claro lo que es el propósito de cada línea.
En el siguiente paso, voy a introducir el código de modo de esclavo, que es significativamente más complejo pero también fácil de usar desde un punto de vista del usuario final. Yo he adoptado un enfoque diferente sobre la aplicación de código auxiliar que no he visto en otros tutoriales, es interesante y útil!