ATTiny USI I2C inledning - en kraftfull, snabb och bekväm kommunikationsgränssnitt för ATTiny projekt! (6 / 8 steg)
Steg 6: ATTiny USI I2C kod genomförandet - USI I2C Master
Elöverföringsfunktionen tar två argument. Först är en pekare till en databuffert att skicka eller ta emot data från. Det förutsätts att den första byten i denna buffert är adress + R/W byten (övre 7 bitar adress, LSB är R/W). Detta byte, av protokoll, alltid överförs och aldrig fått. Resten av bufferten kommer antingen skickas eller fylld av mottagna data enligt R/W lite (1 för läsa, 0 för skriva). Det andra argumentet är den totala storleken på buffert (inklusive adress byte).
Här är ett kort exempel. Låt oss säga att vi vill skriva ut värdet 0x70 till den interna adressen 0x12 om anordning med adress 0x40. Först måste vi skapa en buffert för att lagra våra överföring:
char i2c_transmit_buffer [3],
char i2c_transmit_buffer_len = 3;
i2c_transmit_buffer [0] = (0x40 << 1) | 0 //Or'ing med 0 är onödiga, men för tydlighetens skull anges detta R/W-biten för en skriva.
i2c_transmit_buffer [1] = 0x12; Interna adress
i2c_transmit_buffer [2] = 0x70; Värde att skriva
Överföra meddelandet I2C
USI_I2C_Master_Start_Transmission (i2c_transmit_buffer, i2c_transmit_buffer_size);
Där har du det, meddelandeöverföring komplett! Det var lätt! Om du vill ha mer information om det inre arbetet med koden USI_I2C_Master, ta bara en titt inne i usi_i2c_master.c filen där jag har kommenterat i staterna, överföringsfunktionen och andra intressanta delar. Jag har gjort använda av en rad #define makron för att göra det mer klart vad varje rad ändamål.
I nästa steg, kommer jag att införa slavläge koden, som är betydligt mer komplex men också lätt att använda från en slutanvändare synvinkel. Jag har tagit en annan strategi på att genomföra den slav-kod som jag inte sett på några andra tutorials, det är intressant och användbar!