Forum: Mikrocontroller und Digitale Elektronik USI SPI bei ATtiny 25 o.a.


von Jens (Gast)


Lesenswert?

Suche einen funktionierenden Quellcode in C

Habe bisher dies hier probiert (laut Anleitung):

Vorher DO und SCK auf Ausgang gesetzt --

Geht nicht - leider
1
void SPI_MasterTransmit(uint8_t SPI_Data)
2
{
3
  USIDR = SPI_Data;    // sts USIDR,r16
4
  USISR = (1<<USIOIF);    // ldi   r16,(1<<USIOIF)
5
                          // sts   USISR,r16
6
        
7
                                       // TransferLoop:
8
9
  USICR |= (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);    
10
11
                 // ldi r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
12
                 // sts USICR,r16
13
14
      while(!(USISR & (1<<USIOIF)))  // lds r16, USISR
15
                                     // sbrs r16,USIOIF 
16
    
17
}

von spess53 (Gast)


Lesenswert?

Hi

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

muss in deine while-Scheife.

MfG Spess

von spess53 (Gast)


Lesenswert?


von Jens (Gast)


Lesenswert?

Nur noch mal zur Verständigung:


Beim ATtiny25 steht bei PB1   MISO / DO

bei PB0  MOSI / DI

wenn ich den AVR als Master benutzen will, dann widerspricht sich das 
etwas.

Bleibt DO Ausgang (Master in, Slave out)?

von Frank-Neu (Gast)


Lesenswert?

Hallo liebe µC-Crew,

quäle mich nun seit geraumer Zeit mit dem Einrichten der USI für SPI an 
einem ATtiny25. Habe schon mehrere Threads gelesen und irgendwie bin ich 
wohl nen DAU. Aber mit Atmegas etc. habe ich das schon hinbekommen und 
das läuft auch einwandfrei.

Ggf. hat ja jmd während des Eier-SChmauses Lust zu helfen?

Ich will doch einfach nur nen Master-USI-SPI generieren.

Folgendes:

Funktioniert:
1
ISR (TIMER0_COMPA_vect)
2
{
3
USICR |= (1<<USITC);
4
}

Einrichten:
1
void init_SPI(void)  // see 13/15 Use of ..pdf
2
{
3
DDRB = (1<<SS) | (1<<SCK)| (1<<MOSI);  
4
  USICR |= (1<<USIOIE) |(1<<USIWM0)|(0<<USIWM1) | (1<<USICS0) | (0<<USICS1) |(1<<USICLK); 
5
  //Toggeln des CLK via Timer / Counter 0 IRQ
6
  //The Counter Overflow (interrupt) Flag, or USIOIF, can therefore  //be used to determine when a transfer is completed
7
}
Frage: Welche IRQ-Routine-Vektor kann ich den für den USIOIE benutzen? 
Bzw. (ich kann es auch falsch verstehen!) wird dieser IRQ für das 
interne USI benutzt um den Counter zu setzen?

Senden:
1
void sent_Byte_SPI(unsigned char Byte)
2
{
3
  USIDR=Byte;
4
USISR=(1<<USIOIF);
5
  while (!(USISR &(1<<USIOIF)));

PS: Mein Oszilloksop meldet: SCK Läuft, MOSI geht auf LOW und bleibt 
auch LOW

Vielen Dank im Voraus

von Interessiert-Zwei (Gast)


Lesenswert?

Hi,

diese Antwort ist nicht sehr hilfreich. Aber ich stehe bei einem 
identischen Problem. Ich hätte auch gerne eine Antwort :-)

Grüße

von Idee (Gast)


Lesenswert?

Muss das nicht heißen:
1
ISR (TIMER0_COMPA_vect)
2
{
3
USICR |= (1<<USICLK);
4
}

??

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.