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.