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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.