Интерфейс SPI в STM32. Часть 2

В предыдущей статье я попробовал очень кратко рассказать о SPI интерфейсе, а сейчас настало время практики.  В микроконтроллерах STM32F407Vxxx существуют аж целых три аппаратных SPI интерфейса. В других менее крутых контроллерах SPI модули не имеют существенных отличий, разве что их там поменьше. Чтоб не запутаться на каких ногах вашего контроллера висит SPI, рекомендую воспользоваться программой MicroXplorer. Если SPI-ноги контроллера уже заняты, то следует напомнить о такой замечательной вещи как remap (позволяет перенести SPI на другие ноги). Посмотреть что и куда ремапится можно так же при помощи этой программы. У моего контроллера все SPI интерфейсы расположены на этих ногах: 

 logo

Для упрощения работы со всей периферией микроконтроллера, (таймеры, UART, SPI итд) компания ST придумала библиотеку под названием stdperiph_lib. Раньше я почему-то старался не использовать  её, но сейчас я осознал, что с её использованием код становится более понятным и читаемым + улучшается переносимость кода с одного STM32 контроллера на другой. Из-за этого, начиная с этой статьи, я буду использовать эту библиотеку для инициализации периферии. Чтоб понять как использовать SPI, крайне желательно ознакомиться со всеми регистрами через которые происходит взаимодействие с ним. Их как обычно достаточно много, но если разобраться, то ничего особо сложного в них нет. По идее библиотека stdperiph_lib как раз и предназначена для того, чтоб избавить программиста от необходимости напрямую взаимодействовать с регистрами настройки периферии, но я считаю что нужно иметь хотя-бы примерное представление о том, что и как она настраивает. 

Интерфейс SPI в STM32. Часть 1

Если вы уже знаете что такое SPI интерфейс и с чем его едят, то вряд-ли вы почерпнете что-то новое из этой статьи. В ней я попробую рассказать основные понятия относящиеся к этому интерфейсу, а в следующей расскажу как использовать модуль SPI встроенный в микроконтроллеры STM32. Как и любой другой интерфейс, SPI используется для передачи данных от одного устройства к другому. Устройства на шине SPI не равноправны, как правило, присутствует одно главное устройство (Master) и множество подчинённых устройств (Slave). Обычно, в роли мастера выступает микроконтроллер, а подчинёнными устройствами является различная периферия вроде термодатчиков, акселерометров, часов реального времени итд. Мастер не просто так называется мастером, без его ведома ни один слейв не будет предпринимать ни какого обмена данными. Сама шина SPI физически представляет собой 4 провода:
  • MOSI – По этому проводу данные идут от Master к Slave устройству
  • MISO - По этому проводу данные идут от Slave к Master устройству
  • SCK - Через этот провод, Master передает тактовый сигнал к Slave устройствам
  • CS – Chip select (или SS – Slave select) – Через этот провод мастер дает понять слейву, что сейчас он шлёт данные именно ему.

UART в STM32. Часть 2.

Теперь, когда мы познакомились с UART'ом довольно подробно, попробуем создать устройство которое возможно даже послужит для чего-то полезного. Одно я могу сказать точно - оно поможет еще лучше понять как работать с UARTом. Устройство не особо хитрое - есть 10 светодиодов, состоянием которых мы можем управлять с компьютера через UART. Когда мы отправляем с компьютера символ "1" у нас загорается первый светодиод, отправляем еще раз - светодиод гаснет. Отправляем символ "?" и контроллер выдает нам состояние всех светодиодов. Аппаратно ничего нового (кроме светодиодов) тут нет. Я использовал свою любимую STM32VL Discovery и беспаячную макетную платку, в результате был рождён этот монстр :)

uart_led

UART в STM32. Часть 1.

Благодаря предыдущей статье, у нас теперь есть базовые представления об интерефейсе UART. Руководствоясь ими и даташитом на контроллер STM32F100RBT6B попробуем разобраться, как что-то передать через UART в компьютер и наоборот, заставить контроллер принять что-то от компьютера. Начать нужно с того, что UART интерфейс в контроллерах STM32 не один, в вышеупомянутом контроллере их аж три штуки. Я планирую использовать UART1, следовательно передающий провод (TxD) от USB-UART преобразователя я подсоединяю к ноге контроллера работющей на приём (PA10), а передающую ногу (PA9) я подключаю ко входу (RxD) преобразователя USB-UART. Для работы с этим интерфейсом существует великое множество регистров. Для облегчения работы программиста, вместе с CooCox'ом поставлятся библиотека предназначеная для работы с UART'ом. Я довольно хорошо изучил её и она мне понравилась, но для лучшего понимания принципов её работы нужно вкратце познакомится с регистрами. В следующей статье, в которой будет описан практический пример использования UART'a, я буду использовать именно её. Для начала стоит сказать что нужно настроить чтоб интерфейс заработал:  

  1. Включить тактирование порта А
  2. Настроить ногу PA9 как выход push-pull в альтернативном режиме. Частота 50 МГц
  3. Настроить ногу PA10 как вход без подтяжки
  4. Включить тактирование UART1
  5. Настроить параметры UART1: Скорость, кол-во стоп бит, проверку четности итд.

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

UART в STM32. Часть 0.

Рано или поздно возникает потребность подсоединить своё устройство к компьютеру для обмена данными с ним. Например, для выгрузки результатов измерений, приёма команд от управляющей программы, обновления прошивки, да и много для чего другого. В настоящее время повсеместно используется USB и его использование было бы неплохим вариантом, если бы не его сложность. А вот UART куда проще, поэтому его то мы и будем использовать. Для начала разберемся что он представляет собой на физическом уровне. Для передачи и приёма данных используются всего два провода и само собой земля. Для обмена данными два устройства должны быть соединены так:

uart connection