ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
10 мая
16572 Топик полностью
iit (12.11.2004 06:24, просмотров: 1) ответил ChumA на По просьбам трудящихся...
Что-то слишком мало кода. /* Настройка модуля 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]