Перейти к содержанию
    

SPI for ChumA

Попробуй так (код на асме, перевести сам сможешь):

 

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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...