www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI am attiny2313 initialisieren


Autor: georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.

Ich möchte SPI vom ATTiny2313 initialisieren und verwenden.
Der ATTiny 2313 soll dabei als Master und der MFRC531 als Slaver 
arbeiten.

Im Datenblatt hab ich gefunden dass das über USI geht. Darin steht, dass 
man als ersters einen Takt generiern muss.

Kleiner Auszug aus dem Datenblatt:
The clock is generated by the Master
device software by toggling the USCK pin via the PORT Register or by writing a one to
the USITC bit in USICR.

Klingt ja recht einfach, dürfte aber noch nicht alles gewesen sein.

Weiters hab ich ein schönes Beispiel im Datenblatt gefunden, wie man den 
ATTiny als Master initialisiert.
SPITransfer:
out USIDR,r16
ldi r16,(1<<USIOIF)
out USISR,r16
ldi r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
SPITransfer_loop:
out USICR,r16
sbis USISR,USIOIF
rjmp SPITransfer_loop
in r16,USIDR
ret

Ich prog aber in c und hab folgendes draus gemacht:

void init_master()
{
  DDRB =   (0<<5);      // Setzt DI auf Eingang
  DDRB =   (1<<6)|(1<<7);    //Setzt DO und SCK auf Ausgang
  PORTD = (1<<7);     //Setzt SCL auf HIGH

  USICR =             // Aktiviert USI
    (1<<USIWM0) |
    (0<<USIWM1) |
    (1<<USICS0) |
    (0<<USICS1) |
    (1<<USICLK) |
    (1<<USITC);        
}



Nur leider bekomme ich am SCL nur HIGH und keinen Takt.


Kann mir bitte jemand sagen, was noch zu ergänzen ist, am SCL einen Takt 
zu bekommen?

lg georg

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke doch dass im Datasheet auch C Sample Code dristeht. Und allein 
durch die Initialisierung kommt da sowieso kein Takt raus.

Autor: georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bin zwar kein englisch guru aber folgender text sagt mir: wenn du 
USITC = 1 setzt dann generierst du einen takt.

The clock is generated by the Master
device software by toggling the USCK pin via the PORT Register or by 
writing a one to
the USITC bit in USICR.

das macht mich ein wenig stutzig. was muss dann machen, dass ich am SCL 
einen Takt habe.

Ich bin davon ausgegangen, wenn ich USI initialisiere, dann nutze ich 
die alternativen Funktionen der Ports(DI DO SCL) und generiere einen 
Takt.

Wo liegt da der Denkfehler.

lg georg

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@georg (Gast)

>The clock is generated by the Master
>device software by toggling the USCK pin via the PORT Register or by
>writing a one to
>the USITC bit in USICR.

>das macht mich ein wenig stutzig. was muss dann machen, dass ich am SCL
>einen Takt habe.

Acht mal USITC bit in USICR setzen. Das Ganze ist ein halber Soft-SPI.

MFG
Falk

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Master ist der Unterschied zwischen USI und Software-SPI eher 
gering. Jedes Bit wird einzeln angeschoben.

Autor: georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die antworten.

hab mal ein wenig gegoogled und habs jetzt wie folgt gelöst.
unsigned char master_trans(unsigned char byte)
{
 
  USIDR=byte;
  USISR=(1<<USIOIF);
  do
    {
    USICR=  (1<<USIWM0)|
        (1<<USICS1)|
        (1<<USICLK)|
        (1<<USITC);
    }
  while (!(USISR&(1<<USIOIF)));
  return USIDR;
}

Sendet wunderbar ein Byte über DO. Leider hat es nicht lange gedauert, 
bis ich jetzt das nächste Mal eure Hilfe brauche. Habe dazu einen neuen 
Thread gemacht, passt hier nicht ganz dazu.

Beitrag "MFRC531 als Slave über USI an ATTiny2313"

lg georg

lg georg

Autor: Dimon11/09 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Miteinander,

Bin gerade an einem änlichem Problem dran. Möcht mit folgendem Code eine 
TWO-WIRE-SPI Datenübertragung realesieren. Die Hardware dafür (Slave) 
ist noch nicht verschaltet. Der Master (µC) steckt in STK505.
...
#define CLEAR_A(x) PORTA = PORTA&(~(1<<x))
#define SET_A(x) PORTA = PORTA|(1<<x)

void spi_init(void)
{
    DDRA = (1<<DDA6) | (1<<DDA4)); /* Ausgänge: Pin PA6 SDA, PA4 SCL */
  DDRA  &= (1<<DDA6);      /* Pin PA6 als Ausgang */
  PORTA |= (1<<PA6);      /* internen Pull-Up an PA6 aktivieren */

  
// Timer 0 parametrieren:  CTC-Mode normal, keine Verbindung zur Pins, NUR! 8-Bit 
  TCCR0A = (1<<WGM01);  

  TCCR0B = (1<<CS01)|(1<<CS00);     // Prescaler = 64

  // Timer STOP  ->  TCCR0B &= ~((1<<CS01)|(1<<CS00));

  OCR0A = 2;      // T = OCR0A * F_CPU/64


 /* Counter0 Comp.Match aktiviert, Two-Wire Mode aktiviert, Toggle Clock Port Pin aktiviert */
    USICR = (1<<USICS0) | (1<<USIWM1) | (1<<USITC) ;
    
}


void spi_send(uint8_t data)
{
  USIDR = data;  
        while (!(USISR & (1<<USIPF))) {  }
 
}


Frage ergeben diese zwei Funktionen einen Sinn, wenn ich den Takt für 
die Übertragung per Timer0 realesiere und spi_send() gegenwärtige Form 
hat?

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.