Код
Биг спс. Для 8 ми битного, правильно поправил? =)
Это на запись. А как на чтение? В случае двухстороннего обмена.
Подправили правильно

Можно поменять
unsigned int recv на
unsigned char recv если нет необходимости в возврате intov.
Чтобы прочитать из слейва нужно в него записать байт и использовать результат
recv - это будет ответ от слейва.
Запись нужна чтобы сгенерировать 8 клоков на SCK по которым слейв выведет байт данных.
По поводу быстродействия - вот то что генерирует мой иар (без оптимизации):
Код
In segment CODE, align 2, keep-with-next
\ __nearfunc __version_3 unsigned int SPIWriteWord(unsigned int)
\ ??SPIWriteWord:
\ 00000000 E020 LDI R18, 0
\ 00000002 E030 LDI R19, 0
\ 00000004 982D CBI 0x05, 0x05
\ 00000006 982A CBI 0x05, 0x02
\ 00000008 E060 LDI R22, 0
\ 0000000A C00A RJMP ??SPIWriteWord_1
\ ??SPIWriteWord_2:
\ 0000000C 982B CBI 0x05, 0x03
\ ??SPIWriteWord_3:
\ 0000000E 9A2D SBI 0x05, 0x05
\ 00000010 0F22 LSL R18
\ 00000012 1F33 ROL R19
\ 00000014 991C SBIC 0x03, 0x04
\ 00000016 6021 ORI R18, 0x01
\ ??SPIWriteWord_4:
\ 00000018 982D CBI 0x05, 0x05
\ 0000001A 0F00 LSL R16
\ 0000001C 1F11 ROL R17
\ 0000001E 9563 INC R22
\ ??SPIWriteWord_1:
\ 00000020 3160 CPI R22, 16
\ 00000022 F420 BRCC ??SPIWriteWord_5
\ 00000024 FB17 BST R17, 7
\ 00000026 F796 BRTC ??SPIWriteWord_2
\ 00000028 9A2B SBI 0x05, 0x03
\ 0000002A CFF1 RJMP ??SPIWriteWord_3
\ ??SPIWriteWord_5:
\ 0000002C 9A2A SBI 0x05, 0x02
\ 0000002E 0189 MOVW R17:R16, R19:R18
\ 00000030 9508 RET
\ 00000032 REQUIRE _A_PORTB
\ 00000032 REQUIRE _A_PINB
Со времён последнего моего проекта на ассемблере прошло почти 5 лет. Поэтому сказать что либо об эффективности этого кода я затрудняюсь.
От меня требуют внятно написанные программы на С - я их пишу, а снова влезать в дебри ассемблера не хочу