mikrocontroller.net

Forum: Compiler & IDEs USI (SPI Mode): Daten von Slave liegen am Eingang (DI) an, aber USIDR ist immer Null.


Autor: Bimbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche mit Hilfe des USI über SPI ein Wort zu empfangen. Der Slave 
erhält die passende Clk und CS, drauf antwortet er auch. Dies kann ich 
auf de m Oszi gut erkennen. Aber aus irgendwelchem Grund ist das USIDR 
immer Null. Ich habe direkt am DI (PB5) gemsessen, die Daten kommen an 
aber nicht im Register. PB5 ist als Eingang (also 0) im Main deklariert 
worden.

Ich finde den Fehler nicht. Der Slave antwortet doch so schön... :-(

Hier die SPI-Funktion. Zum Test habe ich die Ergebnisse im EEPROM 
abgespeichert.
uint16_t SPI_Transceive(unsigned char byte)
{
  uint16_t daten=0;            
  USIDR=byte;                //zu sendene Daten (bei MAX6675 nicht möglich)
  USISR=(1<<USIOIF);            //Overflowflag löschen
  PORTB &=~(1<<PB2);            //CS auf low (SS)
  _delay_us(10);
  for(uint8_t i=0; i<=1; i++)        //zwei Zyklen = 16Bit empfangen
  {
    do
    {  
      USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICS0)|(1<<USICLK)|(1<<USITC);
      _delay_us(10);
    }
    while (!(USISR & (1<<USIOIF)));
    USISR=(1<<USIOIF);          //Overflowflag löschen
    if(i)                //Zweiter Zyklus:
      eeprom_write_byte(&lsb, USIDR);
      //daten|=USIDR;          //LSB empfangen und speichern
    else                //Erster Zyklus:
      eeprom_write_byte(&msb, USIDR);
      //daten|=USIDR*255;        //MSB empfangen und specihern
  }
  PORTB |=(1<<PB2);            //CS auf high (SS)
  return daten;
}

Autor: Bimbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe vergessen zu sagen dass es sich um einen ATTiny2313 handelt.

Autor: risu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

obwohl ich den von Dir gewünschten SPI-Modus und ein paar andere 
relevante Details nicht kenne, wage ich mal ein paar Anmerkungen:

1. Mir ist nicht klar, weshalb Du USICR innerhalb Deiner 
"for"-Schleife initialisierst (USIOIF könntest Du auch mit 
"USISR|=(1<<USIOIF);" löschen).
2. Bei USICLK=1 müsstest Du den Takt für den 4-Bit-Counter per Software 
(durch Schreiben auf USITC) erzeugen (siehe Anlage). Deine restliche 
Initialisierung sorgt dafür, dass das Shift-Register durch das externe 
Clock-Signal getaktet wird (wie Du es vermutlich willst). Du setzt USITC 
aber nur in Deiner Initialisierung! Der Counter wird also nicht erhöht.
3. Das Schreiben ins EEPROM dauert vermutlich wesentlich länger als 
die Übertragung eines SPI-Bytes!

Debugging-Vorschläge:
a. SPI-Modus korrekt initialisieren und durch Setzen/Löschen von 
Debuging-I/O-Pins (nur zum Testen!) an verschiedenen Stellen im Programm 
feststellen, wo Dein Programm "hängen bleibt". Bei Deinem jetzigen 
Programmablauf gehe ich davon aus, dass durch Eintakten eines eingehen 
Bytes "USISR&(1<<USIOIF)" nie ungleich 0 wird, da der Counter aufgrund 
falscher Initialisierung nicht per Hardware weiterzählt, sondern 
USITC-Signale erwartet, die Du nicht erzeugst.
b. Nicht zwischendurch ins EEPROM schreiben!

Gruß

 risu

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.