понедельник, 10 января 2022 г.

SPI master на stm32f103c8, Си и CMSIS

 Как уже было рассказано в статье - "USI в режиме SPI slave на ATtiny2313" SPI - это простой, быстрый и надежный способ обмена данными между устройствами. Поэтому интерфейс SPI имеется в большинстве современных микроконтроллеров, в том числе и микроконтроллерах stm32. В большинстве таких микроконтроллеров этих интерфесов даже больше одного. Чаще всего SPI в них работает в режиме master вместе со специализированными микросхемами с интерфейсами SPI которые работают в режиме slave. Микроконтроллеры также могут обмениваться данными между собой по SPI. В таких случаях микроконтроллер slave может работать в составе какого нибудь специализированного модуля. Как уже было рассказано, в статье по ссылке выше, устройства с по SPI соединяются друг с другом одноименными пинами т.е. MISO мастера с MISO слейва, MOSI мастера с MOSI слейва и т.д. Микроконтроллер stm32f103c8 (а точнее отладочную плату с ним которую называют "blue pill") можно соединить с микроконтроллером ATtiny2313 по SPI например так как на схеме:

Рисунок 1 - Соединение "blue pill" c ATtiny2313 по SPI

Резисторы R2..R4 - нужны для ограничения тока на случай неправильного конфигурирования пинов GPIO. Если все пины сконфигурированы правильно то в них нет необходимости и их можно и даже лучше не ставить. Светодиод VD1 остался от предыдущей схемы (см. ссылку в верху данной статьи) он может пригодиться для отладки но в нем также нет необходимости. Пины A5, A6, A7 (на схеме на рисунке 1) соответствуют SPI1 микроконтроллера stm32f103c8:

Т.к. микроконтроллер будет мастером то пин PA5 SCK надо настроить на выход, PA6 MISO на вход а PA7 MOSI на выход. NSS можно не трогать т.к. подключение есть только к одному слейву.
Также надо настроить uart и включить тактирование всей используемой периферии (подробнее см. предыдущие уроки). Для упрощения можно создать две переменные для приема и отправки байта данных по SPI а также вспомогательную функцию для отправки байта данных по UART.
Для минимальной настройки SPI1 в режим мастера, в данном случае, достаточно использовать регистр SPI1->CR1:

Битом 2, этого регистра, устанавливается режим мастера, битами 3...5 предделитель частоты шины от которой тактируется SPI1 (а он тактируется от APB2) так чтобы получилась нужная частота работы SPI. При установке этих битов следует иметь в виду то что SPI1, в данном микроконтроллере, не может работать на частоте более 12 МГц. Частота шины от которой тактируется SPI1, по умолчанию, равна 36 МГц (на такю частоту её настраивает CMSIS). Битами 8 и 9 устанавливаем внутреннее программное управление слейвом (чтобы SPI1 мог работать без пина SS). Битом 6 включается SPI, сделать это следует в последнюю очередь. В функции main осталось настроить UART для приема и передачи байта данных, чтобы можно было проверить SPI через монитор последовательного порта (например такой что есть в Arduino IDE) а также основной цикл в котором можно сделать проверку прихода байта данных по UART прежде чем забрать этот байт из регистра данных USART1 для записи в регистр данных SPI. В используемом микроконтроллере при записи байта данных в регистр данных, происходит помещение этого байта сначала в буферный регистр а уже потом в регистр сдвига. Прежде чем записать байт данных в регистр данных нужно подождать освобождения буфера передатчика о чем свидетельствует бит 1 регистра SPI1->SR:
После записи в регистр данных байта данных для передачи слейву нужно ждать заполнения буферного регистра приемника прежде чем принимать забрать байт данных из регистра данных. О заполнении буферного регистра приемника свидетельствует бит 0 регистра SPI1->SR:

После приема байта данных от слейва, можно сделать отчет с выводом принятого байта данных в монитор последовательного порта. Полный код программы можно скопировать из текстового поля:
Видео:

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

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