Урвал минутку, посмотрел.
Для начала, так:
Код
while(SSPSR & (1<<1))
SSPDR = *out++;
Делать нельзя, дело в том, что обращение к периферии очень медленное (не менее 8 тактов на обращение) и на приличных скоростях SPI SSPDR удается в общем случае загружать медленне, чем он разгружается :-(
Даже простейший вариант
SSPDR = i++;
Успевает (проверено электроникой) даже на 15Mhz "залить" в 8ми элементное FIFO 32!!! байта до его "переполнения" Глубина FIFO действительно 8 элементов и при приеме из 32 переданных вычитываются первые 8.
Эксперимент проводился на 2148
без индекса 01 - возможно с 01 картина будет несколько иная.
Так что заливать придется, например, с огдядкой :-( на переполнение
приемного FIFO.