NXP i.MX7D  модуль I2C

В данном примере, рассматривается модуль I2C1,
висящий на падах UART1_TX_DATA / UART1_RX_DATA.

	@ Шаг первый
	@ Переназначить функцию падов
	MOV32 R0, IOMUXC_BASE
	MOV R1, 1 << 4 + 1 @ Режим ALT1 для I2C1, SION=1
	STR R1, [R0, SW_MUX_CTL_PAD_UART1_TX_DATA] @ I2C1_SDA
	STR R1, [R0, SW_MUX_CTL_PAD_UART1_RX_DATA] @ I2C1_SCL

	@ Выбрать SYS_PLL_DIV4 в качестве источника тактовых импульсов
	@ И настроить делители для получения 24 МГц
	MOV32 R0, CCM_BASE + TARGET_ROOT91 @ I2C1_CLK_ROOT
	MOV32 R1, 1 << ROOT_ENABLE + 1 << MUX + (5-1) << PRE_PODF + (1-1) << POST_PODF
	STR R1, [R0] @ Источник: SYS_PLL_DIV4, 480/4/5/1 = 24 МГц

	@ Подать тактовые импульсы непосредственно в модуль
	MOV32 R0, CCM_BASE + CCGR136  @ I2C1 clock gate
	MOV R1, 0x00003333
	STR R1, [R0]
	

Вот собственно и всё! Модуль готов к работе. Инициализации как таковой нет.
Все настройки задаются непосредственно во время передачи. А сама передача состоит из многих шагов.
Протокол "как бы" собирается из конструктора.

Я написал несколько программок приёма - передачи. Их можно найти в файле i2c1_init.asm

Конечно наглухо стопорить гигагерцовое ядро, для подобных целей, это неправильно.
Для обмена по медленному I2C лучше сконструировать машинку на одном из каналов SDMA.