Драйвер MAX7219

Реализовать работу матричного индикатора на этапе проектирования можно было по-разному. Довольно часто для этого используют сдвиговый регистр, однако он не удовлетворил нас из-за своих параметров (в случае его использования микросхема работала бы за пределами своих возможностей, но об этом в самом конце курса). Наиболее простым способом оказалось использование специализированной микросхемы-драйвера MAX7219. Работает она по и интерфейсу SPI, т.е. для управления 64 светодиодами (матрица 8 * 8) требуется всего 3 ножки микроконтроллера. В устройстве матрицы две и подключены они по каскадной схеме, нам не нужна дополнительная ножка выбора микросхемы.

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

Итак, если вы это проделали, то ваш ответ совпадет с тем, что изложено ниже:

Ответ

Структурная схема поможет нам разобраться.

Структурная схема микросхемы max7219, изображение из документации

Пакет включает в себя «адрес» (в действительности это лишь указание декодеру, чтобы микросхема поняла, по какому адресу вы хотите записать данные) регистра, куда будут записываться данные, и непосредственно сами данные. Так, например, чтобы изменить яркость, вам необходимо отправить декодеру значение 0xXA. Для начала составим перечисление всех «адресов» (согласно таблице 2 из документации).

Если нам нужно передать данные только на вторую микросхему, то сначала мы загоняем данные для второй микросхемы и следом за ней отправляем пустой блок REG_NO_OP.

Ножки DIG0 - DIG7 микросхемы подключаются к катодам (столбцы) матрицы, а SEGA - SEGDP к анодам (строки). Следовательно данные, которые мы записываем в регистры REG_DIGIT_0 - REG_DIGIT_7 определяют состояние состояние столбцов. Данные могут быть интерпретированы по разному, в зависимости от выбранного режима (регистр REG_DECODE_MODE): в режиме «No decode» каждый бит соответствует определенному светодиоду, т.е. записав 0 — светодиод не горит, записав 1 — светодиод горит; в режиме «BCD code B» биты, записанные в регистре REG_DIGIT_, кодируют определенный символ, указанный в документации. Последний режим больше подходит для семисегментных индикаторов.

Яркость индикатора регулируется регулируется регистром REG_INTENSITY. Всего имеется 16 уровней, 0 соответствует самому тусклому свечению, а 15 самому яркому.

Регистр REG_SCAN_LIMIT отвечает за число обслуживаемых линий DIG. Чем больше линий, тем меньше частота обновления. Если используются все линии (наш случай), то частота составляет 800 Гц, если меньше, то 8 x 800/N, где N — количество задействованных линий.

Записав в регистр REG_SHUTDOWN «1», вы включаете «нормальный» режим работы. Перейдём к инициализации: включим тактирование порта и периферии; настроим ножки и SPI в соответствии с документацией; включим периферию; зададим начальную интенсивность индикатора и очистим его.

Составим заголовочный файл модуля max7219.

Начнём с функции инициализации. Микросхема подключена к модулю SPI2, ножкам PB5 (CS), PB13 (SCK) и PB15 (MOSI).

Следующая функция должна релизовывать задание яркости свечения.

И функция очистки дисплея.

Далее для корректной работы нам требуется функция max7219_send_to_all(), реализуем и её.

Так как мы пишем драйвер, то нужно позаботиться об удобном его использовании. По этой причине нужно предоставить возможность отправки данных только на определённый чип.

Стараясь сделать драйвер более или менее универсальным, напишем функцию, благодаря которой можно отправлять данные сразу на всю линию. Выхода два: использовать возможность модуля из стандартной библиотеки <stdarg.h>1, но можно поступить по другому и предавать массив.

И осталась последняя функция для того, что бы протестировать работу микросхемы. Поступим следующим образом:

Вызовите эту функцию до входа в цикл while(1).

Код урока (и для других библиотек) можно найти на GitHub: CMSIS.


Назад | Оглавление | Дальше