Что-то слишком мало кода. /* Настройка модуля SPI */
/* Установка выводов SCK, MISO, MOSI, SSEL */
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))
orr r1,r1,#((0x01 << 4)|(0x01 << 6))
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]
/**/
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]
// Настройка прерывания от SPI.
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]
// Обработчик прерывания от 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
ldmfd sp!,{r0-r3}
subs pc,lr,#0x04
// У меня SPI работает на прием, поэтому в программе для инициализации приема делается следующее.
/* Запускаем SPI */
ldr r0,=SPI_Base
str r1,[r0,#SPDR_Ofs]
-
- Блин, шо за херня??? Начальник куда текст дел??? - iit(12.11.2004 06:25)