STM Урок 153. HAL. SPI. Соединяем два контроллера. Часть 1

По многочисленным просьбам мы на данном уроке попытаемся соединить между собой два контроллера STM32 между собой.

Просьбы данные, правда, в большинстве случаев звучали несколько по-другому. Посетители ресурса очень хотят увидеть урок по работе шины SPI в контроллере STM32 в режиме SLAVE. Но, думаю, соединение между собой двух контроллеров по шине SPI и позволит нам проследить работу шины в режиме SLAVE. А уж после этого мы сможем соединить наш контроллер и с другими контроллерами — AVR или PIC, по которым подобные уроки были, а также и соединиться с каким-либо устройством, которое требует от нас работы в режиме ведомого устройства.

На данном уроке мы будем использовать возможности по работе с шиной SPI с использованием библиотеки HAL, но те, кто увлёкся функционалом библиотеки LL, а также хочет увидеть подробности аппаратной реализации, могут посмотреть уже недавно вышедший урок по шине SPI с использованием данной библиотеки, а также урок, который обязательно вскоре выйдет и по соединению двух контроллеров по SPI, но уже с использованием библиотеки LL.

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

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

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

Начнём с ведущего устройства. Сначала подключим к нему индикатор по шине SPI. Будет использован SPI2, ножки, использованные для работы с шиной, мы увидим в Cube MX

 

 

Также давайте подключим провода для соединения с другим контроллером по шине SPI, не забываем также об общем проводе. Питание не нужно. Итого будет 5 проводов. 4 для SPI и 1 — общий

 

 

Откроем проектогенератор Cube MX и создадим там новый проект, выбрав наш контроллер

 

 

RCC настроим на работу с кварцевым резонатором

 

 

Настроим на работу с программатором по SWD

 

 

В разделе Clock Configuration настроим тактирование

 

 

Включим шину SPI2, настроим её на 16-разрядный обмен и также выберем оптимальный делитель

 

 

У нас включились следующие ножки

 

 

Не хватает только ножки SS. Для неё лучше подойдёт программный способ управления. Поэтому настроим соседнюю ножку PB12 на выход

 

 

 

Добавим ей немного скорости

 

 

Включим также SPI1 и настроим его подобным образом

 

 

У нас включатся вот эти ножки

 

 

Способом, аналогичным шине SPI2, настроим ножку SS

 

 

 

Настроим свойства проекта

 

 

Сгенерируем проект, откроем его в Keil, включим автоперезагрузку и уберём оптимизацию.

 

 

Файлы для работы с индикатором max7219.c и max7219.h возьмём из проекта урока 115 с именем NRF24_RX_00. Данные файлы мы скопируем в соответствующие им папки нашего нового проекта.

Подключим к дереву проекта файл max7219.c.

Также подключим в файле main.c нашу библиотеку

 

 

В функции main() добавим переменную для счёта

 

 

Установим высокий логический уровень на ножках SS обоих шин SPI, подождём немного, вызовем функцию инициализации микросхемы индикатора и попытаемся вывести цифру на его табло

 

 

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

 

uint8_t aTxBuf[1]={0};

 

А в функции Send_7219 передадим сразу всё.

Для начала мы там положим всё в 16-разрядную целочисленную переменную

 

 

Вот это

 

aTxBuf[0]=rg;

 

и это

 

aTxBuf[0]=dt;

HAL_SPI_Transmit (&hspi2, (uint8_t*)aTxBuf, 1, 5000);

 

удалим.

А здесь передадим в функцию адрес переменной со всеми данными

 

HAL_SPI_Transmit (&hspi2, (uint8_t*) &dtt, 1, 5000);

 

Вот теперь у нас всё будет работать

 

 

Следующая задача — передать что-нибудь ведомого устройству.

Сначала немного подправим библиотеку индикатора.

В функции вывода числа в левую половину индикатора NumberL_7219, чтобы не выводились лидирующие нули при малых значениях

 

 

Добавим аналогичную функцию вывода числа в правую половину индикатора

 

 

Создадим для данной функции прототип в заголовочном файле, перейдём в файл main.c в функцию main() и после вывода цифры на экран подождём 2 секунды. Дисплей нам очищать не надо, так как мы всё лишнее теперь гасим в самих функциях вывода чисел в тетрады индикатора

 

 

Создадим глобальный буфер для приёма данных от устройства SLAVE

 

 

В бесконечном цикле функции main() мы будем наращивать наш счётчик до 9999 и затем обнулять. Результат мы передадим ведомому, заодно на ходу принимая у него аналогичное число в массив RxBuf, а затем выведем пока передаваемое число в правой тетраде индикатора, и потом подождём десятую долю секунды

 

 

Соберём код, прошьём контроллер. Через 2 секунды правый счётчик начнёт считать. А на левом пока останется левая половина выведенного нами числа

 

 

Перейдём к SLAVE.

Аналогичным образом подключим индикатор и посадим нашу плату на маленькую макетку, так как мы ещё будем подключать логический анализатор на шину SPI1

 

 

Подключим к нашему ведущему устройству провода от шины SPI ведущего, не забывая об общем проводе. Ножки будут совпадать на MASTER и SLAVE, PA4 подключится к PA4, PA5 — к PA5, PA6 — к PA6, PA7 — к PA7

 

 

В следующей части нашего урока мы создадим и настроим проект для устройства SLAVE и на практике проверим работу нашего кода по передаче данных между двумя контроллерами посредством шины SPI.

 

 

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

Индикатор светодиодный семиразрядный с драйвером MAX7219

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

STM Name

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

STM Name

4 комментария к “STM Урок 153. HAL. SPI. Соединяем два контроллера. Часть 1

  1. Добрый день. Почему в ваших примерах работы с SPI вы не используете Hardware NSS Sygnal вместо «ногодрыга» вывода CS?
    Спасибо.

  2. Добрый день.
    Вы можете в конце каждого урока выкладывать законченный проект со всеми файлами?
    В частности я устал искать по ссылкам вот эти файлы «max7219.c и max7219.h», которые надо взять из проекта урока 115. Заходишь в 115 урок, а там снова ссылка и т.д.
    Можете дать ссылку, где можно скачать эти файлы?

    • Здравствуйте! Посмотрите во второй части этого урока (153 часть 2) в конце страницы. Полный исходный код (проект) всегда есть в конце каждого урока.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*