Forum: Mikrocontroller und Digitale Elektronik Hilfe für SPI Master mit Tiny25


von Torsten K. (nobby)


Lesenswert?

Hallo,

ich möchte die USI des Tiny25 als SPI Master einstellen. Bei den Megas 
habe ich das prima hinbekommen, aber leider blicke ich durch das 
Datenblatt vom Tiny nicht richtig durch. Die Initialisierung ist dort 
nur in ASM-Code abgedruckt, C verstehe ich besser.

Wirklich was gefunden habe ich hier auch noch nicht, bisher nur was für 
I2C. Kann mir jemand einen Tipp geben, wie ich das einstellen muß, und 
wie ich dann die Daten rausbekomme ?
Ich denke die Lesen/ Schreibregister sind USIDR/ USIBR, allerdings 
bekomme ich die ganze Geschichte nicht zum Start.

Gruß
Torsten

von Torsten K. (nobby)


Lesenswert?

Ich habe die USI jetzt als SPI eingestellt.
Aber, das Ding verhält sich sehr mehrwürdig. Normalerweise sind ja 16 
Takte nötig um die 8Bit rauszuschieben.
Es gibt auch genau dafür einen Interrupt, der nach den 16 Takten sich 
meldet. Das Problem ist jetzt aber, das die Daten schon nach 8 Takten 
rausgeschoben werden.
Also jedes mal, wenn der SCK seinen Zustand ändert !!!
Das darf doch so aber nicht sein.
Ich habe praktisch 8 Leertakte, und SPI komform ist das natürlich auch 
nicht, zumindest nicht wenn ich einen Mega angeschlossen hätte.

Kann mir da irgendwer was zu sagen, bitte ?!

Gruß
Torsten

von Peter D. (peda)


Lesenswert?

Als Master spart Dir das USI nix.
Da ist es einfacher, gleich ein universelles SW-SPI zu nehmen:
1
#include <avr/io.h>
2
3
4
struct bits {
5
  uint8_t b0:1;
6
  uint8_t b1:1;
7
  uint8_t b2:1;
8
  uint8_t b3:1;
9
  uint8_t b4:1;
10
  uint8_t b5:1;
11
  uint8_t b6:1;
12
  uint8_t b7:1;
13
} __attribute__((__packed__));
14
15
#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
16
17
18
#define SPI_CLK         SBIT( PORTB, 0 )        // clock
19
#define SPI_CLK_DDR     SBIT( DDRB,  0 )
20
#define SPI_MOSI        SBIT( PORTB, 1 )        // data out
21
#define SPI_MOSI_DDR    SBIT( DDRB,  1 )
22
#define SPI_MISO_PIN    SBIT( PINB,  2 )        // data in
23
24
25
uint8_t shift_io( uint8_t b )   // send / receive byte
26
{
27
  uint8_t i;
28
29
  SPI_CLK_DDR = 1;              // set as output
30
  SPI_MOSI_DDR = 1;
31
32
  for( i = 8; i; i-- ){         // 8 bits
33
    SPI_MOSI = 0;
34
    if( b & 0x80 )              // high bit first
35
      SPI_MOSI = 1;
36
    b <<= 1;
37
    SPI_CLK = 1;
38
    if( SPI_MISO_PIN )
39
      b++;
40
    SPI_CLK = 0;
41
  }
42
  return b;
43
}


Peter

von Torsten K. (nobby)


Lesenswert?

Hallo Peter,

vielen Dank für die Antwort !!
Ich bin hier schon schwer verzweifelt.
Eigentlich wollte ich gerne die Hardware nutzen, aber dann muß ich es 
halt doch in Software machen.
Danke für den Code !!

Weist Du denn, ob der Tiny da nen Fehler hat, wenn er als Master 
arbeiten soll ???

Gruß
Torsten

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.