Межмодульный интерфейс SPI. Графический индикатор
Электроника
“
Мы продолжим изучать модули микроконтроллера и рассмотрим интерфейс SPI на примере графического индикатора. После чего адаптируем библиотеку этого индикатора для вывода примитивов на экран индикатора
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
SPI
SPI (англ. Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс, шина SPI) — последовательный синхронный стандарт передачи данных в режиме полного дуплекса, предназначенный для обеспечения простого и недорогого высокоскоростного сопряжения микроконтроллеров и периферии
Графический индикатор
наиболее сложный тип индикаторов, позволяющий передавать как символьную информацию, так и рисунки
Видеолекция
Конспект
Продолжим изучать модули микроконтроллера и рассмотрим интерфейс SPI на примере графического индикатора. Также адаптируем библиотеку этого индикатора для вывода примитивов на экран индикатора.
SPI — наиболее распространенный межмодульный интерфейс, так как он обеспечивает очень высокую скорость передачи и наименьшее количество выводов. Широко используется для периферийных модулей в интегральном исполнении. Мы будем использовать графический индикатор Waveshare и организуем подключение через интерфейс SPI.
SPI — наиболее распространенный межмодульный интерфейс, так как он обеспечивает очень высокую скорость передачи и наименьшее количество выводов. Широко используется для периферийных модулей в интегральном исполнении. Мы будем использовать графический индикатор Waveshare и организуем подключение через интерфейс SPI.
Подключение SPI к микроконтроллеру
SPI имеет специальные входы — MOSI и CLK, которые подключаются к портам SPI микроконтроллера. Дополнительные входные линии мы подключим к цифровым выходам микроконтроллера.
Важно
Так как индикатор будет только принимать данные, то порт SPI микроконтроллера следует настроить только на передачу
Задача
- Настроить модуль SPI для микроконтроллера
- Подключить стандартную библиотеку от разработчика для индикатора
- Нарисовать на индикаторе примитивы, например, окружность, текст, иконки
Работа на компьютере
1. Копируем предыдущий проект, переименовываем и открываем
2. Заходим в конфигурацию, выбираем Connectivity и используем SPI2
3. Выбираем режим Transmit Only Master, то есть только передачу данных
4. Устанавливаем передачу размера 8 бит
5. Указываем скорость 40 Мбит/с
2. Заходим в конфигурацию, выбираем Connectivity и используем SPI2
3. Выбираем режим Transmit Only Master, то есть только передачу данных
4. Устанавливаем передачу размера 8 бит
5. Указываем скорость 40 Мбит/с
6. Настраиваем ножки для индикатора:
7. Добавляем дополнительные управляющие сигналы для индикатора GPIO_Output
- SPI2_SCK передвинем на ножку PB13, зажав Ctrl
- аналогично сдвигаем SPI2_MOSI на PB15
7. Добавляем дополнительные управляющие сигналы для индикатора GPIO_Output
8. Добавляем OLED_CS
9. Аналогично добавляем OLED_DC и OLED_RST
10. Проверяем все ножки и переходим к настройке выводов
11. В разделе GPIO находим все выходные порты и устанавливаем им скорость Very High
12. Сохраняем и генерируем код
10. Проверяем все ножки и переходим к настройке выводов
11. В разделе GPIO находим все выходные порты и устанавливаем им скорость Very High
12. Сохраняем и генерируем код
Работа с кодом
1. В main.c находим функцию инициализации SPI2
2. Скачиваем библиотеку для используемого графического индикатора с сайта waveshare.com (Modules → Displays → OLED)
2. Скачиваем библиотеку для используемого графического индикатора с сайта waveshare.com (Modules → Displays → OLED)
3. Скачиваем архив (Resources → Code)
4. Распаковываем содержимое, но вне нашего проекта
5. Находим файл Fonts.h и копируем в каталог inc
6. Находим файл Fonts.с и копируем в каталог Src
7. Аналогично SSD1331.h копируем в inc, а SSD1331.h в Src
8. В USER находим функцию main.c и из нее копируем вызовы отрисовки примитивов в содержимое нашей функции main.c
5. Находим файл Fonts.h и копируем в каталог inc
6. Находим файл Fonts.с и копируем в каталог Src
7. Аналогично SSD1331.h копируем в inc, а SSD1331.h в Src
8. В USER находим функцию main.c и из нее копируем вызовы отрисовки примитивов в содержимое нашей функции main.c
Адаптация библиотеки
1. Заменяем delay_ms на HAL_Delay
2. Заменяем System_init на библиотечную функцию ssd1331_init
3. Поправляем добавление заголовочных файлов. В main добавляем заголовочный файл библиотеки #include "SSD1331.h" и #include "Fonts.h", в котором располагаются шрифты для вывода текста
4. Исправляем файлы библиотеки:
5. Функции для управления портами записываем в ssd1331 в виде вызовов соответствующих портов
6. Создаем функцию get_hspi1() и копируем ее в main.c и main.h
2. Заменяем System_init на библиотечную функцию ssd1331_init
3. Поправляем добавление заголовочных файлов. В main добавляем заголовочный файл библиотеки #include "SSD1331.h" и #include "Fonts.h", в котором располагаются шрифты для вывода текста
4. Исправляем файлы библиотеки:
- убираем лишние заголовочные файлы, которые не используются
- добавляем заголовочный файл для микроконтроллера #include "stm32l4xx_hal.h"
- добавляем заголовочный файл для main
5. Функции для управления портами записываем в ssd1331 в виде вызовов соответствующих портов
6. Создаем функцию get_hspi1() и копируем ее в main.c и main.h
Основные ошибки
1. Отсутствие наименования порта для reset
Исправление: в main.c находим названия портов и копируем эти названия в соответствующий вызов
2. Ошибка «undefined reference»
Исправление: к функции инициализации добавляем написанную функцию сброса микроконтроллера
Тестирование
После сброса устройства видим вызовы очистки красным, зеленым, синим. Потом выводы шрифтов разного цвета и размера, а в конце — пиктограммы
“
Мы изучили настройку SPI для микроконтроллера, адаптировали библиотеку для графического индикатора и создали проект для работы с индикатором. Приступим к проверке знаний.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем! |
Вам необходимо передвинуть SPI2_SCK на ножку PB13. Какая клавиша вам понадобится?
Дальше |
Проверить |
Узнать результат |
Как исправить ошибку отсутствия наименования порта для reset?
Дальше |
Проверить |
Узнать результат |
Где найти вызовы отрисовки примитивов в скаченной библиотеке?
Дальше |
Проверить |
Узнать результат |
Что располагается в #include "Fonts.h"
Дальше |
Проверить |
Узнать результат |
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз |