Есть задача читать данные с SPI устройства. При этом наш хост (imx536) должен работать в режиме аппаратного SPI, т.к. софтварный съест больно много ресурсов.
Пытаюсь сконфигурить SPI, в частности ECSPI2, через запись в соответствующие регистры (ECSPI2_CONREG и др.). ПРОБЛЕМА:
Проблема в том, что на ногах проца никакого отклика на мои действия с регистрами нет. Т.е. ноги на разъеме X4 висят все время в одном состоянии.
Вот что пишу в регистры: http://pastebin.com/raw.php?i=1XppNdSS
Тестовую передачу данных делаю через запись в TXDATA регистр:
*(int*)(spi_base+ECSPI2_TXDATA) = 0xAABBCCDD;
ECPSI без "пинка" сразу данные выплёвывать не хочет.
Попробуйте после записи в ФИФО (ECSPIx_TXDATA) форсировать передачу записью бита XCH в регистре ECSPIx_CONREG.
Или же единожды установите бит SMC в регистре ECSPIx_CONREG.
SMC бит я выставляю в единицу, поэтому SPI должен без пинка выдавать данные:
Может быть проблема в том, что надо CLK для SPI как-то активировать ?
У проца есть целый блок CCM (Clock Control Module), отвечающий за управление клоками и он конфигурится из ядра. В ядре я нашел пару строк на этот счет:
/arch/arm/mach-mx5/clock.c
этого достаточно чтоб клок был включен для SPI ?
или еще где-то надо править?
Ура! Аппаратный SPI мастер на ECSPI-2 задышал!
Ключевой оказалась фраза из мануала:
24.3.4 Low Power Modes
The ECSPI does not operate under low power mode. It holds its operation when its clock is gated off in master mode. In slave mode, the ECSPI does not respond when its clock is gated off.
Чтобы включить клок залез в
/arch/arm/mach-mx5/clock.c
в функцию mx53_clocks_init(...) в тело добавил вызов одной процедурки:
Теперь в регистрах ECSPI-2 есть активность, данные гоняются через FIFO. В тестовом режиме включил лупбек и теперь все что пишу в TXDATA вижу в RXDATA.
Далее предстоит настроить DMA и все это перевести в слейв режим (из-за чего собственно весь сырбор, ведь линукс не умеет SPI слейв)....