/*
* usi_spi_01.c
* Controller: ATtiny44 @ 1MHz
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

void SPI_init(void) // Initialisierung der USI Schnittstelle (SPI Mode)
{
	DDRA |= (1<<PA4)|(1<<PA5);	//Output: PA4=USCK, PA5=DO (MISO)
	DDRB |= (1<<PB1);			//Output: PB1=CS
	DDRA &= ~(1<<PA6);			//Input: PA6=DI (MOSI)
	PORTA |= (1<<PA6);			//interner Pull-up an PA6 aktivieren
	DDRA |= (1<<PA7);			//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)
{
	PORTB &= ~(1<<PB1);		//CS = 0
	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);
	}
	PORTB |= (1<<PB1);	//CS = 1
}

int main (void)
{
	SPI_init();
	sei();
	
	while(1)
	{
		SPI_transfer(0xA5);		// 0xA5 (10100101) übertragen
		PORTA |= (1<<PA7);		// Led on
		_delay_ms(1000);
		SPI_transfer(0x5A);		// 0x5A (01011010) übertragen
		PORTA &= !(1<<PA7);		// Led off
		_delay_ms(1000);
	}
}