www.mikrocontroller.net

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


Autor: Torsten K. (nobby)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Torsten K. (nobby)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Master spart Dir das USI nix.
Da ist es einfacher, gleich ein universelles SW-SPI zu nehmen:
#include <avr/io.h>


struct bits {
  uint8_t b0:1;
  uint8_t b1:1;
  uint8_t b2:1;
  uint8_t b3:1;
  uint8_t b4:1;
  uint8_t b5:1;
  uint8_t b6:1;
  uint8_t b7:1;
} __attribute__((__packed__));

#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)


#define SPI_CLK         SBIT( PORTB, 0 )        // clock
#define SPI_CLK_DDR     SBIT( DDRB,  0 )
#define SPI_MOSI        SBIT( PORTB, 1 )        // data out
#define SPI_MOSI_DDR    SBIT( DDRB,  1 )
#define SPI_MISO_PIN    SBIT( PINB,  2 )        // data in


uint8_t shift_io( uint8_t b )   // send / receive byte
{
  uint8_t i;

  SPI_CLK_DDR = 1;              // set as output
  SPI_MOSI_DDR = 1;

  for( i = 8; i; i-- ){         // 8 bits
    SPI_MOSI = 0;
    if( b & 0x80 )              // high bit first
      SPI_MOSI = 1;
    b <<= 1;
    SPI_CLK = 1;
    if( SPI_MISO_PIN )
      b++;
    SPI_CLK = 0;
  }
  return b;
}


Peter

Autor: Torsten K. (nobby)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.