Étape 6: Implémentation du Code ATTiny USI I2C - USI I2C maître
La fonction de transmission prend deux arguments. Le premier est un pointeur vers une mémoire tampon de données permettant d’envoyer ou de recevoir des données de. Il est supposé que le premier octet dans cette mémoire tampon est l’octet de l’adresse + R/W (supérieure à 7 bits adresse, LSB est R/W). Cet octet, par protocole, est toujours transmis et n’a jamais reçu. Le reste de la mémoire tampon sera soit envoyé ou rempli par les données reçues selon le bit R/W (1 pour lecture, 0 pour écrire). Le second argument est la taille totale du tampon (y compris l’octet de l’adresse).
Voici un bref exemple. Disons que nous voulons à la sortie de la valeur 0 x 70 , à l' adresse interne 0 x 12 de l’appareil avec l’adresse 0 x 40. Tout d’abord, nous devons créer un zone tampon pour stocker notre transmission :
char i2c_transmit_buffer [3] ;
char i2c_transmit_buffer_len = 3 ;
i2c_transmit_buffer [0] = (0 x 40 << 1) | 0 //Or'ing 0 n’est pas nécessaire, mais par souci de clarté, cela définit le bit R/W pour une écriture.
i2c_transmit_buffer [1] = 0 x 12 ; Adresse interne
i2c_transmit_buffer [2] = 0 x 70 ; Valeur à écrire
Transmettre le message I2C
USI_I2C_Master_Start_Transmission (i2c_transmit_buffer, i2c_transmit_buffer_size) ;
Là vous l’avez, la transmission du message complete ! C’est facile ! Si vous souhaitez plus d’informations sur le fonctionnement interne du code USI_I2C_Master, il suffit de prendre un coup d’oeil dans le fichier usi_i2c_master.c , où j’ai commenté les États, fonction de transfert et autres sections intéressantes. J’ai fait utiliser une ligne #define macros afin d’indiquer plus clairement ce qui est le but de chaque ligne.
Dans l’étape suivante, je vais présenter le code mode esclave, qui est beaucoup plus complex mais aussi facile à utiliser d’un point de vue de l’utilisateur final. J’ai pris une approche différente sur l’application du code de l’esclave que je n’ai pas vu dans n’importe quel autres tutoriels, c’est intéressant et utile !