Попробуй так (код на асме, перевести сам сможешь):
SPI_Setup:
.....
/* Настройка модуля SPI */
/* Установка выводов SCK, MISO, MOSI, SSEL */
/* Подключение выводов к блоку SPI */
ldr r0,=PINSEL_Base
ldr r1,[r0,#PINSEL0_Ofs]
orr r1,r1,#((0x01 << 14)|(0x01 << 12)|(0x01 << 10)|(0x01 << 8))
str r1,[r0,#PINSEL0_Ofs]
/* Хотя вроде-бы этот кусок смысла не имеет,
но так как писал я давно и не помню зачем он нужен, поэтому
оставляю так как есть */
ldr r0,=IO_Base
ldr r1,[r0,#IODIR_Ofs]
bic r1,r1,#((0x01 << 5)|(0x01 << 7)) /* MISO, SSEL - Input */
orr r1,r1,#((0x01 << 4)|(0x01 << 6)) /* SCK, MOSI - Output */
str r1,[r0,#IODIR_Ofs]
ldr r1,[r0,#IOSET_Ofs]
orr r1,r1,#((0x01 << 4)|(0x01 << 6)|(0x01 << 5)|(0x01 << 7))
str r1,[r0,#IOSET_Ofs]
/* Настройка регистров SPI*/
ldr r0,=SPI_Base
/* Set SPI Control Regisrer */
mov r1,#0xA0
str r1,[r0,#SPCR_Ofs]
/* Clear SPI Status Register */
ldr r1,[r0,#SPSR_Ofs]
/* Set SPI Speed = 2 MHz */
mov r1,#0x1E
str r1,[r0,#SPCCR_Ofs]
SPISetup_Exit:
.......
Установка прерываний:
/* Настройка VIC */
ldr r0,=VIC_Base
/* Выбор FIQ и IRQ прерываний */
mov r1,#(T0IS_Mask)
str r1,[r0,#VICIntSelect_Ofs]
/* Настройка векторов */
/* SPI в слот 0 */
mov r1,#0x2A
str r1,[r0,#VICVectCntl0_Ofs]
ldr r1,=SPI_Intrpt
str r1,[r0,#VICVectAddr0_Ofs]
/* Включение прерываний */
ldr r0,=VIC_Base
ldr r1,[r0,#VICIntEnable_Ofs]
orr r1,r1,#SPIS_Mask
str r1,[r0,#VICIntEnable_Ofs] /* Timer1, SPI */
Обработчик прерывания:
SPI_Intrpt:
/* Сохраняем в стеке регистры */
stmfd sp!,{r0-r3}
mrs r0,cpsr
stmfd sp!,{r0}
/* Сброс запроса на прерывание */
ldr r0,=SPI_Base
mov r1,#0x01
str r1,[r0,#SPINT_Ofs]
/* Считываем источник прерывания */
ldr r0,=SPI_Base
ldr r1,[r0,#SPSR_Ofs]
ldr r3,[r0,#SPDR_Ofs] /* r3 := принятое значение */
ands r1,r1,#(01 << 7)
beq SPInt_Exit /* Если данных нет то выход */
/* Тело обработчика */
...........
SPInt_Exit:
/* Выход */
ldmfd sp!,{r0}
msr cpsr,r0
/* Обновление регистра VICVectAddr */
ldr r0,=VIC_Base
mov r1,#0x00
str r1,[r0,#VICVectAddr_Ofs]
/* */
ldmfd sp!,{r0-r3}
subs pc,lr,#0x04
Запуск где-нибудь в прграмме SPI:
/* Запускаем SPI */
ldr r0,=SPI_Base
mov r1, Байт данных для передачи.
str r1,[r0,#SPDR_Ofs]