...

пятница, 23 августа 2013 г.

[Из песочницы] MultiClet: осваиваем SPI на примере работы с LCD

В начале мая я стал счастливым обладателем отладочного комплекта LDM-MCp. Пару месяцев он пылился на столе, было много работы, назревал отпуск. Вернувшись, с новыми силами, светлой головой и рвением что-то пощупать-поделать, но точно не работу, руки сами потянулись за новую игрушку. Поставил SDK под Linux, всё подключил.

Квест первый




Сразу после подключения система радостно обнаружила спаренное 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. Отмечу наиболее интересные для нас поля:














































БитЗначениеОписание
291Поляризация. Состояние SCK в режиме ожидания. Мы используем сигнал HIGH.
281Фаза синхросиганал. Мы читаем данные от ведомого на спаде сигнала.
270Разрешение делителя на 16. Мы хотим максимальной скорости. При частоте процессора 80МГц, частота шины SPI будет 20MHz
261Последовательность бит при передаче — LSB или MSB. Мы используем MSB.
251Режим работы нашего SPI: ведомый или ведущий.
241Данный бит включает блок SPI
23-200111Длина слова данных. Мы хотим 8 бит (0x3 — 0xf — 4-16 бит соответственно). Для 32 бит значение поля должо быть нулевым.
19-160001Задаёт режим предделителя. При нулевом значении были проблемы с синхросигналом. Т.ч. я выбрал «1».



Для выбора ведомого используются линии SS0-SS2. Активным считается состояние LOW. Выборка осуществляется через регистр SPIxSS: «1» выставляет значение HIGH, а «0» — значение LOW.

С конфигурированием SPI более-менее разобрались. Перейдём к дисплейчику.

image

Распиновка достаточно простая. Нам понадобится подключить выводы 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


Комментариев нет:

Отправить комментарий