iit 0 12 ноября, 2004 Опубликовано 12 ноября, 2004 · Жалоба Попробуй так (код на асме, перевести сам сможешь): 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] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться