Forum: Mikrocontroller und Digitale Elektronik AVR: USIBR+SPI+gcc=Datenmüll?


von Np R. (samweis)


Lesenswert?

Hallo,

wenn ich mit einem Attiny24a ein 93C46 EEprom per "Pin-Wackeln" auslese, 
so läuft alles wie zu erwarten.

Sobald ich auf USI, spimode 0 umstelle, gibt es zwei überraschende 
Effekte:

A. Ich brauche plötzlich keinen Extra-USCK-Puls für das "Dummy-Bit" 
mehr, das das EEPROM laut Datenblatt nach Empfang des READ-Befehls 
(mit Adresse) und vor den Daten ausgibt. Wird hier "zu spät" für das 
USIDR Register gesamplet?
Naja, damit kann man ja leben...

B. Viel schlimmer: Das Buffer Register USIBR stimmt nie mit dem USIDR 
überein: USIBR ist um 1 nach link verschoben. Außerdem ist das LSB 
einfach eine Kopie des vorletzten Bits.

Was geht hier vor?

1. Mein Programmierfehler?
Kaum. Erstens lese ich beide Register (USIDR und USIBR) quasi 
gleichzeitig. Wenn also USIDR weitergeschoben wäre, könnte man das durch 
einen Extra-USCK-Puls erklären - aber es ist ja das Buffer Register 
USIBR, das linksgeschoben ist. Wie geht das?
Zweitens habe ich dasselbe Problem, wenn ich mich streng an AVR319 halte 
und sogar den C-Code daraus verwende (nur in der ISR gleichzeitig mit 
USIDR auch USIBR auslese).

2. Liest gcc von der falschen Adresse?
(Die avr/iotn24a.h stimmt eigentlich mit dem Datenblatt überein.)

3. Hardware-Murks?
USIBR für SPI nicht verwendbar?
Warum gibt es dann dazu kein Erratum?
Wird USIDR zu früh in USIBR übernommen, bevor das letzte Bit da ist?
Aber warum dann linksgeschoben?

4. Hat irgendjemand eine Idee?

Übrigens: Ich bin nicht der erste mit dem Problem:
Beitrag "USI ATtiny 44/84"
Beitrag "USI Buffer Register USIBR"
Beitrag "Problem mit Inhalt von USIBR bei USI-Slave im 3-Wire-Mode"
... aber bisher gab es keine Antwort.

Hier
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=77256&start=0
gibt's zwar eine Antwort, aber die kann's nicht sein.
Der AVR ist bei mir ja der Master. Nur wenn er einen Puls sendet, kommt 
vom EEPROM etwas zurück.

Kennt jemand das Problem?
Für eine Erklärung wäre ich sehr dankbar - die Sache fuchst mich.
Eine Lösung wäre natürlich noch toller... ;-)

von Np R. (samweis)


Lesenswert?

Kleine Ergänzung:

Interessanterweise verwendet die AVR319 das USIBR Buffer Register 
nicht!
Statt dessen wird USIDR per ISR in einer Variablen zwischengespeichert.

Diese Variable wird also genau dazu benutzt, wozu eigentlich (lt. 
Datenblatt) das USIBR da sein sollte.
Wenn die Hardware nicht funktioniert, dann "emulieren" wir sie eben per 
Software, oder wie?

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.