Pierwszy problem w Twoim kodzie to brak obsługi pinu SS. Podczas inicjalizacji SPI powinieneś ustawić te pin jako wyjście (to masz dobrze) i ustawić je w stan wysoki (czego nie robisz). Ponadto pin ten przed rozpoczęciem transmisji powinien być ustawiony w stan niski (czego nie robisz), a po jej zakończeniu z powrotem w stan wysoki (czego też nie robisz).
Drugi problem jest taki, że chyba nie bardzo rozumiesz zasadę działania SPI. Najpierw należy wysłać komendę (tu jest OK, wysyłasz 1 bajt o wartości 0x0B) i adres (w przypadku komendy 0x0B wymagane są
4 bajty, Ty wysyłasz
3). Później jednak, aby cokolwiek odebrać musisz utrzymać taktowanie na linii SCK. By to zrealizować, musisz wpisać cokolwiek do rejestru SPDR, wtedy mikrokontroler utrzyma taktowanie i Twoje dane zostaną "wysunięte" do układu slave (w tym przypadku do pamięci - zostaną przez nią zignorowane), a do mikrokontrolera zostanie "wsunięty" odczytany z pamięci bajt danych.
Reasumując algorytm jest taki:
- ustawiasz pin SS w stan niski,
- wpisujesz do SPDR komendę 0x0B i czekasz na zakończenie transmisji,
- wpisujesz do SPDR po kolei cztery bajty adresu zaczynając od najbardziej znaczącego (z czego pierwsze 3 są adresem, ostatni bajt może być dowolny - zostanie zignorowany) za każdym razem czekając na zakończenie transmisji,
- wpisujesz do SPDR dowolny bajt danych i czekasz na zakończenie transmisji,
- odczytujesz z SPDR odebrany bajt danych,
- powtarzasz punkty 4 i 5 tyle razy, ile bajtów chcesz odebrać,
- po odebraniu potrzebnej ilości danych ustawiasz pin SS w stan wysoki.
Komendy odczytu
0x0B należy używać dopiero przy prędkościach transmisji powyżej 50MHz, co i tak jest w 8-bitowych AVR nieosiągalne, więc możesz spokojnie użyć komendy
0x03. Wtedy wystarczy wysłać tylko
3 bajty adresu, co skróci czas potrzebny na odczyt (szczególnie w przypadku odczytu pojedynczych bajtów).