/* * 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); } }