Квест первый
Сразу после подключения система радостно обнаружила спаренное FTDI-устройство, создав сразу два ttyUSBx-девайса. И тут дилемма — либо использовать Serial-консоль, либо иметь возможность заливать прошивки, — идущий в комплекте загрузчик работает напрямую с FTDI-устройством. Пришлось на коленке рисовать скрипты для «правильной» загрузки модуля ftdi_sio. Наколенность проявила себя в использовании питоновских биндингов к библиотеке ftd2xx. Общая суть сводится к выгрузке модуля, блокированию FTDI, используемого для прошивки, и одновременной с этим загрузке модуля обратно. Тогда ядерный модуль может заблокировать оставшийся FTDI для UART.
Hello, world! — слишком банально
Простенький «Hello, world!» с мигающими LED заработал сразу, только обнаружилось, что после прошивки линуксовым mc-ploader'ом необходимо дополнительо сбросить плату или подожать, пока сработает WDT.
Когда-то зимой заказывал себе пару SPI-экранчиков HY28A, но с нашей почтой пришли они только в мае. Тут и решение само пришло — начать с экранчика. Вооружившись USB'ым логическим анализатором SYSCLK DX, полез штудировать спеки на регистры GPIO и SPIx в процессоре MCp и ковыряться в примерах использования SPI.
Настройка звука
На плате LDM уже были задействованы два SPI из трёх. Один под АЦП, второй под слот microSD. Вся периферия MCp состоит из GPIO-регистров, имеющих также альтернативные функции, будь то сетевой интерфейс (MAC/MDIO), UART, USB или I2C.
Первым делом, необходимо сконфигурировать через битовые поля альтернативную функцию для оставшегося незадействованным SPI0. Для работы нам надо подключить пару заголовочных файлов:
#include <HDL51001_ccf.h>
#include <spi.h>
…
GPIOB->BPS = 0x07F;
Здесь мы задали альтернативные функции для пинов 0-9 GPIOB, соответствующие SCK, MOSI, MISO, SS0, SS1 и SS2. Ещё пара SEL_IN/SCK_IN используется только в режиме ведомого.
Теперь нам необходимо задать параметры самой шины SPI:
SPI0->SS = 0x07; // выставляем сигнал CS в логическую единицу
SPI0->CR = 0x37710000;
Итак, что из себя представляет регистр SPIxCR. Отмечу наиболее интересные для нас поля:
Бит | Значение | Описание |
---|---|---|
29 | 1 | Поляризация. Состояние SCK в режиме ожидания. Мы используем сигнал HIGH. |
28 | 1 | Фаза синхросиганал. Мы читаем данные от ведомого на спаде сигнала. |
27 | 0 | Разрешение делителя на 16. Мы хотим максимальной скорости. При частоте процессора 80МГц, частота шины SPI будет 20MHz |
26 | 1 | Последовательность бит при передаче — LSB или MSB. Мы используем MSB. |
25 | 1 | Режим работы нашего SPI: ведомый или ведущий. |
24 | 1 | Данный бит включает блок SPI |
23-20 | 0111 | Длина слова данных. Мы хотим 8 бит (0x3 — 0xf — 4-16 бит соответственно). Для 32 бит значение поля должо быть нулевым. |
19-16 | 0001 | Задаёт режим предделителя. При нулевом значении были проблемы с синхросигналом. Т.ч. я выбрал «1». |
Для выбора ведомого используются линии SS0-SS2. Активным считается состояние LOW. Выборка осуществляется через регистр SPIxSS: «1» выставляет значение HIGH, а «0» — значение LOW.
С конфигурированием SPI более-менее разобрались. Перейдём к дисплейчику.
Распиновка достаточно простая. Нам понадобится подключить выводы 3v3_IN, GND, SCK, CS, SDO (он же MISO), SDI (он же MOSI) и nRESET с BL_CTRL. С помощью линии BL_CTRL и ШИМ можно управлять яркостью LED-подсветки. Подсветка и так слабовата, т.ч. просто запитываем её от 3v3. Сигнальная линия nRESET используется во время процедуры сброса/инициализации экрана. Для этого нам понадобится сконфигурировать ещё один GPIO-выход:
Теперь мы готовы немного поработать с SPI.
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html
Комментариев нет:
Отправить комментарий