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]
	

Проверяйте светики! Должны гореть!