Stap 6: ATTiny USI I2C Code uitvoering - USI I2C Master
De transmissie-functie heeft twee argumenten. De eerste is een aanwijzer naar een gegevensbuffer waarin verzenden of ontvangen van gegevens uit. Er wordt van uitgegaan dat de eerste byte in deze buffer het adres + R/W-byte is (bovenste 7 bits adres, LSB is R/W). Deze byte, protocol, wordt altijd verzonden en nooit ontvangen. De rest van de buffer zal worden verzonden uit of gevuld door ontvangen gegevens volgens de R/W-bit (1 voor lezen, 0 voor schrijven). Het tweede argument is de totale grootte van de buffer (met inbegrip van de byte van het adres).
Hier is een kort voorbeeld. Laten we zeggen dat we willen output de waarde 0x70 naar het interne adres 0x12 van het apparaat met het adres 0x40. Eerst maken we een buffer om op te slaan onze transmissie:
char i2c_transmit_buffer [3];
char i2c_transmit_buffer_len = 3;
i2c_transmit_buffer [0] = (0x40 << 1) | 0 //Or'ing met 0 is niet nodig, maar voor alle duidelijkheid dat de R/W-bit ingesteld voor een schrijven.
i2c_transmit_buffer [1] = 0x12; Intern adres
i2c_transmit_buffer [2] = 0x70; Waarde te schrijven
Overdracht van het bericht van de I2C
USI_I2C_Master_Start_Transmission (i2c_transmit_buffer, i2c_transmit_buffer_size);
Daar heb je het, volledige overdracht van berichten! Dat was makkelijk! Wilt u meer informatie over de binnenwerkingen van de USI_I2C_Master code, neem dan eens een kijkje in het usi_i2c_master.c bestand waar ik de Staten, overdrachtsfunctie en andere interessante secties hebt gereageerd. Ik heb gebruik van één regel #define macro's meer duidelijk wat elke lijn's doel is te maken.
In de volgende stap zal ik de code van de slave-modus, die aanzienlijk complexer maar ook makkelijk te gebruiken vanuit een oogpunt van de eindgebruiker is. Ik heb gebruik gemaakt van een verschillende aanpak voor de uitvoering van de slave-code die ik nog niet in een andere tutorials gezien, het is interessant en nuttig!