USI-Schnittstelle des ATtiny44

Verwendung für eine SPI-Kommunikation

Hier ein Programmbeispiel in C, wie die USI-Schnittstelle des ATtiny44 für eine SPI-Kommunikation verwendet wird:

 

/*********************************************************

USI to SPI communication routine

Controller: ATtiny 44, Osc. = 1 MHz

*********************************************************/

 

#include <avr/io.h>

#include <stdlib.h>

#include <util/delay.h>

 

void SPI_init(void)

{

DDRA |= (1<<PA4)|(1<<PA5); //Output: PA4=USCK, PA5=DO

DDRA &= ~(1<<PA6); //Input: PA6=DI

PORTA |= (1<<PA6); //int. Pull-up an PA6 aktivieren

DDRA |= (1<<PA7); //LED auf Ausgang

 

USICR = (1<<USIWM0) | (1<<USICLK)|(1<<USITC)| (1<<USICS1);

// USIWM0 = 1: SPI-Betrieb mit DO, DI und USCK

// USICLK = 1, USITC = 1, USICS1 = 1: generiert den Taktimpuls für das Schieberegister und

// den 4bit Timer. Der Takt wird am USCK-Pin (PA4) ausgegeben.

}

 

void SPI_transfer(int data)

{

USIDR = data; //Daten in Data Register laden

USISR |= (1<<USIOIF); //Überlaufflag löschen

 

while (!(USISR & (1<<USIOIF))) //solange kein Timerüberlauf...

{

USICR |= (1<<USITC); //Toggle clk (2x)

USICR |= (1<<USITC);

}

}

 

int main (void)

{

SPI_init();

 

while(1)

{

SPI_transfer(0xAA); // Daten (AA) senden

 

PORTA |= (1<<PA7); // Led on

_delay_ms(1000);

PORTA &= !(1<<PA7); // Led off

_delay_ms(1000);

}

}