В предыдущей части нашего урока мы подключили схему урока, создали и настроили проект для устройства MASTER.
Чтобы нам не мучиться с проектом, его мы создадим из проекта для ведущего устройства, только назовём SPI_SLAVE.
Откроем проект в Cube MX и отключим для начала ножку PA4, так как управлять мы ею теперь будем по-другому
Подключим также и логический анализатор
Настроим шину SPI1 для работы в качестве ведомого устройства
Теперь мы ножку выбора отслеживаем аппаратно.
Мы видим также, что она у нас теперь включилась в свой режим
Соберём проект, откроем его в Keil, подключим файл max7219.c к дереву проекта, также настроим программатор на авторезет и отключим оптимизацию.
Мы сейчас увидим, что у нас настолько всё автоматически настроится за счёт применения Cube MX и HAL, что мы и менять-то в проекте ничего почти не будем.
Ножкой PA4 мы теперь дёргать не будем сами, всё это ляжет на плечи ведомого устройства. Поэтому сначала уберём вот эту строчку на этапе инициализации в функции main():
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
Вот эти вещи в бесконечном цикле тоже
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
и
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
Задержка нам также не нужна. Само всё задержится за счёт работы функции приёма-передачи. Мы не провалимся ниже, пока не придёт пакет от MASTER-а
HAL_Delay(100);
Функцию приёма-передачи вообще не трогаем. То, что придёт от ведущего, попадёт в RxBuf, а мы ему в ответ будем передавать значения своего счётчика.
На индикаторе в правой части, мы отобразим, то что пришло, а в левой — то что будем передавать ведущему
NumberR_7219(*(uint16_t*) RxBuf);
NumberL_7219(i);
Также, чтобы было немного интереснее, мы здесь будем считать назад.
Поэтому удалим инкрементирование
i++;
А декрементирование вместо этого добавим в другом месте (в конце цикла)
1 2 |
NumberL_7219(i); i--; |
В связи с этим немного перевернём всё вот в этом условии
if(i<1) i=9999;
Теперь ведущее устройство мы не подключаем к ПК, а подключим к нему питание от отдельного источника, а ведомое подключи к ПК.
Соберём проект, прошьём контроллер, и уже по показаниям индикатора мы увидим, что данные благоприятно приходят от ведущего устройства к ведомому
Теперь нам ещё надо будет от SLAVE данные принять на MASTER-е.
Поэтому, наоборот, SLAVE подключим от отдельного источника питания, а MASTER — к ПК.
Перейдём к проекту ведущего и в бесконечном цикле функции main() файла main.c отобразим принятое от SLAVE значение в правой части нашего индикатора
1 2 |
NumberR_7219(i); NumberL_7219(*(uint16_t*) RxBuf); |
Соберём код, прошьём контроллер, и теперь мы видим, что данные у нас принимаются и передаются в обе стороны
Давайте также посмотрим, что у нас творится в программе логического анализа.
Настроим там для начала шину SPI, включив предварительно 4 самых первых канала
Нажмём кнопку START и получим следующий результат
Посмотрим результат в отчёте, у нас отлично инкрементируется MOSI и декрементируется MISO, ничего не пропускается
Итак, на данном уроке мы научились пользоваться возможностями аппаратной реализации шины SPI, а также возможностями библиотеки HAL, настроив контроллер в режиме ведомого (SLAVE) и таким образом нам удалось обменяться данными между двумя различно настроенными контроллерами по шине SPI.
Благодарю всех за внимание!
Предыдущая часть Программирование МК STM32 Следующий урок
Исходный код для ведущего устройства (MASTER)
Исходный код для ведомого устройства (SLAVE)
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Индикатор светодиодный семиразрядный с драйвером MAX7219
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий