Skip to content

Instantly share code, notes, and snippets.

@avr-programmierung
Created May 16, 2019 11:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save avr-programmierung/356acc8cb0d4578d9b2715f90a16ca44 to your computer and use it in GitHub Desktop.
Save avr-programmierung/356acc8cb0d4578d9b2715f90a16ca44 to your computer and use it in GitHub Desktop.
ATtiny44 @ 1MHz Initialisierung der USI Schnittstelle (SPI Mode)
/*
* 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);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment