[Home] [Donate!] [Контакты]

SPI в STM32. Работа в ведомом и ведущем режимах

Наиболее типичный способ использования SPI предполагает наличие одного ведущего и одного или нескольких ведомых устройств; одноимённые выводы всех устройств соединяются вместе (кроме NSS, использование которого зависит от конфигурации). Рассмотрим процедуру настройки SPI в микроконтроллерах STM32 для работы в ведомом и ведущем режимах. Кроме того, кратко коснёмся вопросов полудуплексной и симплексной связи.

Здесь в большей степени рассматривается теоретическая сторона вопросов. Об использовании SPI с точки зрения практики, с примерами кода, смотрите: "Примеры использования SPI в STM32".

Подключение устройств с использованием SPI.
Рис. %img:spi_c1. Типичный вариант подключения устройства по SPI

Оглавление
SPI в микроконтроллерах STM32. Основы
SPI в STM32. Работа в ведомом и ведущем режимах
Настройка SPI для работы в ведомом режиме
Настройка SPI для работы в ведущем режиме
Конфигурирование SPI для полудуплексной и симплексной связи
Источники и дополнительная информация
SPI в STM32. Управление передачей данных
Регистры SPI
Использование SPI при работе с микроконтроллерами STM32F100xx
Примеры программ

Настройка SPI для работы в ведомом режиме

При работе в ведомом режиме, устройство получает тактовый сигнал через вход SCK от ведущего устройства. Поэтому значение битового поля BR[2:0] в регистре SPI_CR1 не оказывает влияния на скорость передачи, скорость задаётся ведущим устройством. Остальные биты регистров SPI_CR1, SPI_CR2 должны быть заданы в соответствии с требованиями к конфигурированию SPI.

Примечания.
1. Рекомендуется включать ведомое устройство SPI до того, как ведущее устройство начнёт формировать тактовый сигнал. В противном случае может произойти нежелательная передача данных.
2. Регистр данных ведомого устройства должен быть готов (в него должны быть записаны данные) до первого фронта тактового сигнала или до завершения текущей передачи. Возможно, протокол обмена между устройствами не всегда требует какой-либо передачи от данного устройства, тогда могут быть переданы любые фиктивные данные.
3. Обязательно следует задать полярность тактового сигнала до того, как ведущее и ведомое устройство будут включены.

Процедура конфигурирования SPI для работы в ведомом режиме.

  1. Задать значение бита DFF, чтобы определить длину фрейма (8 или 16 бит).
  2. Выбрать один из четырёх вариантов тактирования, задав биты полярности и фазы тактового сигнала CPOL, CPHA. Для корректной передачи данных, биты должны быть сконфигурированы одинаковым образом для ведущего и ведомого устройства.
  3. С помощью бита LSBFIRST установить порядок следования битов при передаче фрейма (старший бит первый, т.е. передача от старшего к младшему или младший бит первый, т.е. передача от младшего к старшему). Порядок битов должен быть задан одинаковым для ведущего и ведомого устройства.
  4. В режиме аппаратного выбора ведомого устройства, на вход NSS от ведущего устройства будет подан низкий уровень для активации данного ведомого устройства. Низкий уровень должен сохраняться на входе, по крайней мере, до завершения передачи фрейма. В некоторых случаях, когда ведущее устройство связано с единственным ведомым, допускается подключение NSS ведомого к общему проводу (тогда данное ведомое выбрано всегда). В режиме программного выбора (SSM бит установлен), следует сбросить бит SSI в регистре SPI_CR1 для активации ведомого устройства (т.е., в качестве сигнала NSS используется значение бита SSI этого же устройства SPI).
  5. Очистить MSTR бит и установить SPE бит (оба в регистре SPI_CR1), для того чтобы назначить для выводов микроконтроллера альтернативные функции. Не забываем предварительно правильно сконфигурировать выводы, задействованные SPI, т.е., выводы микроконтроллера, используемые как выходы SPI, должны быть сконфигурированы как выходы для выполнения альтернативной функции; подробнее о конфигурировании выводов микроконтроллера смотрите "GPIO: порты ввода/вывода".

В ведомом режиме вывод MOSI является входом, а вывод MISO - выходом. Выход находится в высокоимпедансом состоянии до тех пор, пока данное ведомое устройство не будет выбрано - в зависимости от настроек: аппаратно, низким уровнем сигнала NSS или программно, сбросом бита SSI в регистре SPI_CR1.

Для передачи данных от ведомого устройства, следует загрузить данные в буфер Tx путём записи в программно доступный регистр данных SPI_DR. Если сдвигающий регистр свободен, данные из буфера будут помещены в него (если не свободен - после завершения текущей передачи). После выгрузки данных из Tx в сдвигающий регистр, устанавливается флаг TXE в регистре SPI_SR, а также генерируется прерывание, если установлен бит TXEIE в регистре SPI_CR2. Установка флага TXE сигнализирует о том, что буфер Tx освободился и готов для записи в него новых данных.

Данные передаются из сдвигающего регистра побитно, одновременно с приёмом данных от ведущего устройства. Всё это происходит по тактовому сигналу, получаемому от ведущего устройства.

Когда пересылка фрейма завершается, сдвигающий регистр содержит принятый от ведущего устройства фрейм данных. Данные из сдвигающего регистра пересылаются в буфер Rx, при этом устанавливается флаг RXNE, сигнализирующий о наличии данных в буфере, а если установлен бит RXNEIE в регистре SPI_CR2, то генерируется прерывание. Программный доступ к буферу Rx осуществляется путём чтения регистра данных SPI_DR. При чтении из SPI_DR происходит сброс флага RXNE.

Настройка SPI для работы в ведущем режиме

В ведущем режиме, устройство SPI генерирует тактовый сигнал на выходе SCK, поэтому кроме всего прочего, необходима настройка скорости передачи.

Процедура конфигурирования SPI для работы в ведущем режиме.

  1. Установить скорость передачи данных, задав битовое поле BR[2:0] в регистре SPI_CR1.
  2. Задать полярность и фазу тактового сигнала с помощью битов CPOL и CPHA.
  3. Задать значение бита DFF, чтобы определить длину фрейма (8 или 16 бит).
  4. С помощью бита LSBFIRST установить порядок следования битов при передаче фрейма (старший бит первый, т.е. передача от старшего к младшему или младший бит первый, т.е. передача от младшего к старшему).
  5. Настроить работу вывода NSS в режиме входа или выхода. При работе в режиме входа, возможно аппаратное или программное управление. В случае аппаратного управления, на вход NSS должен быть подан сигнал высокого уровня на протяжении всей передачи данных. В случае программного управления (установлен бит SSM в регистре SPI_CR1), должен быть установлен бит SSI в регистре SPI_CR1.
    Если требуется работа NSS в режиме выхода, следует установить бит SSOE.
  6. Установить биты MSTR и SPE (если NSS настроен как вход, эти биты остаются установленными только пока на NSS подан сигнал высокого уровня).

В ведущем режиме вывод MOSI является выходом, а вывод MISO - входом.

Передача данных ведущим устройством начинается, когда данные для передачи записываются в буфер Tx (путём записи в программно доступный регистр SPI_DR). Из буфера происходит параллельная загрузка данных в сдвигающий регистр, с помощью которого в дальнейшем происходит побитовый вывод/ввод данных синхронно с тактовым сигналом. После пересылки содержимого буфера Tx в сдвигающий регистр, устанавливается флаг TXE, сигнализирующий о том, что буфер пуст и в него могут быть записаны новые данные. Таким образом, новые данные в буфер можно записать ещё до завершения текущей передачи. Если установлен бит TXEIE в регистре SPI_CR2, то при установке флага TXE генерируется прерывание.

После завершения пересылки фрейма, сдвигающий регистр содержит данные, полученные от ведомого устройства. Эти данные пересылаются в буфер Rx и устанавливается флаг RXNE, а также генерируется прерывание, если установлен бит RXNEIE в регистре SPI_CR2. Чтение содержимого буфера Rx осуществляется путём чтения программно доступного регистра данных SPI_DR. При чтении из регистра данных происходит сброс флага RXNE.

Для организации непрерывного потока передаваемых данных, следует помещать новые данные в буфер Tx сразу после начала передачи предыдущей порции данных (до завершения передачи текущего фрейма). Однако, следует убедиться в том, что TXE флаг установлен, прежде чем выполнять запись в Tx.

Примечание.
Когда осуществляется взаимодействие с ведомым SPI устройством, которому требуется снятие сигнала выбора устройства между пересылками, потребуется осуществить программную эмуляцию выхода NSS ведущего устройства с использованием какого-либо вывода GPIO (с программным управлением уровнем на этом выводе). Это связано с тем, что SPI в микроконтроллерах STM не поддерживают снятие сигнала NSS между пересылками на аппаратном уровне.

Конфигурирование SPI для полудуплексной и симплексной связи

Кроме полнодуплексной связи, требующей двух однонаправленных линий для передачи данных, возможна передача данных по одной линии. Общее количество линий уменьшается на одну, но передача осуществляется только в одном направлении (симплексная связь) или в двух направления, но поочерёдно (полудуплексная связь). При полудуплексной связи, линия для передачи данных используется как двунаправленная: в разные промежутки времени данные передаются в разных направлениях (от ведущего устройства к ведомому или обратно).

BIDIMODE = 1: одна линия для тактового сигнала и одна двунаправленная линия для передачи данных.

Полудуплексная связь по SPI с использованием одной двунаправленной линии данных.
Рис. %img:hd. Подключение для работы в полудуплексном режиме

Этот режим включается установкой бита BIDIMODE в регистре SPI_CR1. В этом режиме используется вывод SCK (для тактового сигнала) и вывод MOSI у ведущего устройства, вывод MISO у ведомого устройства (для передачи данных). Направлением передачи (вход/выход) управляем программно с помощью бита BIDIOE в регистре SPI_CR1. Когда этот бит установлен в 1, вывод для подключения к линии данных является выходом, иначе - входом.

BIDIMODE = 0: одна линия для тактового сигнала и одна однонаправленная линия данных.

В этом режиме SPI используется только для передачи или только для приёма данных.

SPI мастер в режиме только передача.
Рис. %img:master_tx. Ведущее устройство SPI работает в режиме "только передача"

SPI ведомое устройство в режиме только передача.
Рис. %img:slave_tx. Ведомое устройство SPI работает в режиме "только передача"

SPI мастер в режиме только приём.
Рис. %img:master_rx. Ведущее устройство SPI работает в режиме "только приём"

SPI ведомое устройство в режиме только приём.
Рис. %img:slave_rx. Ведомое устройство SPI работает в режиме "только приём"

Функционирование SPI в режиме "только приём" при работе в качестве ведомого устройства мало чем отличается от работы в полнодуплексном режиме. Пока оно выбрано и получает тактовый сигнал от ведущего устройства, оно должно принимать поступающие данные. Поведение ведущего устройства в режиме "только приём" весьма специфично: сразу после включения и до отключения, оно начинает безостановочную генерацию тактового сигнала, требуя от подключённого к нему ведомого устройства непрерывного потока данных.

Итак, в режиме "только приём", после конфигурирования и включения SPI, передача данных начинается:

Чтобы остановить получение данных ведомым устройством в режиме "только приём", следует отключить SPI (сбросить бит SPE). Сделать это можно в любой момент, при этом текущая пересылка будет успешно завершена, прежде чем SPI в действительности отключится (узнать о моменте действительного отключения SPI можно по сброшенному флагу BSY).

Чтобы остановить получение данных ведущим устройством в режиме "только приём", следует дождаться получения предпоследнего фрейма и во время получения последнего фрейма (выждав не менее одного периода тактового сигнала SPI от момента получения предпоследнего фрейма), отключить SPI. Перед тем, как произойдёт действительное отключение SPI, последний фрейм будет успешно принят.

Подробнее о правильном отключении SPI при работе в разных режимах, а также о многих других важных вопросах смотрите
"SPI в STM32. Управление передачей данных".

Источники и дополнительная информация

  1. "SPI Block Guide V04.01"; Motorola, Inc. (Freescale Semiconductor, Inc., http://www.freescale.com); 21 JAN 2000, Revised: 14 JUL 2004.
  2. "RM0041. Reference manual. STM32F100xx advanced ARM(R)-based 32-bit MCUs"; STMicroelectronics; Doc ID16188 Rev 5; June 2016
author: hamper; date: 2020-09-30
  Рейтинг@Mail.ru