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... ;-)