NXP i.MX7D модуль SPI
PICO-IMX7D не имеет в своём составе периферии на порту SPI.
Но в комплекте с этой платой идёт пимороньевская примочка Rainbow Hat. Она же
Радужная Шляпка.
И вот на этой шляпке есть несколько трёхцветных светодиодов APA102.
Для этих светодиодов не требуется полная функциональность SPI.
Разведены только два сигнала, MOSI и SCLK.
Ну хоть что-то.
Будем настраивать SPI3. Втыкайте шляпку!
@ По умолчанию, почти все ножки в камне выполняют роль I/O в режиме input
@ Переназначим их функцию на SPI3
MOV32 R0, IOMUXC_BASE
MOV R1, 3 @ Режим ALT3 для ECSPI3
STR R1, [R0, SW_MUX_CTL_PAD_I2C2_SCL] @ ECSPI3_SCLK
STR R1, [R0, SW_MUX_CTL_PAD_I2C1_SDA] @ ECSPI3_MOSI
@ Определить источник тактовых импульсов для модуля
@ И настроить делитель так, что бы получить 80 МГц
MOV32 R0, CCM_BASE + TARGET_ROOT104 @ ECSPI3_CLK_ROOT
MOV32 R1, 1 << ROOT_ENABLE + 4 << MUX + (1-1) << PRE_PODF + (6-1) << POST_PODF
STR R1, [R0] @ Источник: SYS_PLL, частота 480/6 = 80МГц
@ Частота 480 МГц делится пост-делителем POST_PODF на 6
@ Подать тактовые импульсы в модуль
MOV32 R0, CCM_BASE + CCGR122 @ ECSPI3 clock gate
SER R1
STR R1, [R0]
@ Настраиваем непосредственно SPI3
MOV32 R0, ECSPI3_BASE
@ Основные настройки порта
spi = (288-1) << BURST_LENGTH @ Размер посылки 288 бит, по количеству светодиодов
spi = spi + (10-1) << PRE_DIVIDER @ Предделитель 80 МГц / 10 = 8 МГц
spi = spi + 3 << POST_DIVIDER @ Постделитель 8 МГц / 8 == 1 МГЦ частота SCLK
spi = spi + 1 << CHANNEL_MODE @ Канал 0 в режиме мастера
spi = spi + 0 << CONREG_SMC @ 1= Старт передачи сразу после помещения первого слова в FIFO
spi = spi + 0 << CHANNEL_SELECT @ Номер канала
spi = spi + 1 @ Enable
MOV32 R1, spi
STR R1, [R0, CONREG]
@ Хардварный Chip Select не используется!
@ Он не разведён на Радужной шляпке
@ Параметры сигналов (режим)
MOV32 R1, 1 << SCLK_CTL + 1 << SCLK_PHA + 1 << SCLK_POL @ SCLK Stay high
STR R1, [R0, CONFIGREG] @ Chip Select аппаратно не используется
@ Сбросить флаги статуса
SER R1
STR R1, [R0, STATREG]
@ Настроить Chip Select вручную
@ Он висит на GPIO4_IO[7]
MOV32 R0, GPIO4_BASE
@ Ножка на выход
LDR R1, [R0, GDIR]
BIS R1, 1<<7
STR R1, [R0, GDIR]
@ CS установлен постоянно
LDR R1, [R0, DR]
BIC R1, 1<<7 @ CS = 0
STR R1, [R0, DR]
Светодиоды готовы светить. Один из вариантов, как это можно сделать,
просто сложить данные в исходящий буфер SPI и дать старт на передачу.
MOV32 R0, ECSPI3_BASE
@ Поместить данные в SPI FIFO
CLR R1 @ Стартовый фрейм, 32 нулевых бита
STR R1, [R0, TXDATA] @ Поместить в исходящий буфер
@ Цвет семи светодиодов
@ Расположение на плате справа налево
MOV32 R1, 0xEF010203 @ Цвет 1, BGR
MOV32 R11, 0xE4030000 @ Цвет 2, BGR
STR R11, [R0, TXDATA] @ Светодиод 1
STR R1, [R0, TXDATA] @ Светодиод 2
STR R1, [R0, TXDATA] @ Светодиод 3
STR R11, [R0, TXDATA] @ Светодиод 4
STR R1, [R0, TXDATA] @ Светодиод 5
STR R1, [R0, TXDATA] @ Светодиод 6
STR R11, [R0, TXDATA] @ Светодиод 7
SER R1 @ Завершающий фрейм
STR R1, [R0, TXDATA] @ 32 единичных бита
@ Стартовать передачу по SPI
LDR R1, [R0, CONREG]
BIS R1, 1 << XCH
STR R1, [R0, CONREG]
@ Дождаться завершения передачи
1:
LDR R1, [R0, STATREG]
TST R1, 1 << TC @ Transfer completed?
BEQ 1b @ Нет - переход
@ По окончанию, сбросить флаг TC
STR R1, [R0, STATREG]
Проверяйте светики! Должны гореть!