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