STM32 STM32VL Discovery STM32F100RBT6 (урок 10) SPI, теория

| 03.04.2016

STM32 STM32VL Discovery STM32F100RBT6 (урок 10) SPI, теорияSPI_block_diagram

Общее
SPI (англ. Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс, шина SPI) — последовательный синхронный стандарт передачи данных в режиме полного дуплекса, предназначенный для обеспечения простого и недорогого высокоскоростного сопряжения микроконтроллеров и периферии. SPI также иногда называют четырёхпроводным (англ. four-wire) интерфейсом.

В отличие от стандартного последовательного порта (англ. standard serial port), SPI является синхронным интерфейсом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая (ведомая) периферия синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (англ. chip select) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участия в передаче по SPI.

Частота следования битовых интервалов в линиях передачи данных определяется синхросигналом SCK, который генерирует ведущее устройство, ведомые устройства используют синхросигнал для определения моментов изменения битов на линии данных, при этом ведомые устройства никак не могут влиять на частоту следования битовых интервалов. Как в ведущем устройстве, так и в ведомом устройстве имеется счетчик импульсов синхронизации (битов). Счетчик в ведомом устройстве позволяет последнему определить момент окончания передачи пакета. Счетчик сбрасывается при выключении подсистемы SPI, такая возможность всегда имеется в ведущем устройстве. В ведомом устройстве счетчик обычно сбрасывается деактивацией интерфейсного сигнала SS.

Так как действия ведущего и ведомого устройства тактируются одним и тем же сигналом, то к стабильности этого сигнала не предъявляется никаких требований, за исключением ограничения на длительность полупериодов, которая определяется максимальной рабочей частотой более медленного устройства. Это позволяет использовать SPI в системах с низкостабильной тактовой частотой, а также облегчает программную эмуляцию ведущего устройства.

Устройство SPISPI_Single_master_single_slave_application

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

В SPI используются четыре цифровых сигнала:

  • MOSI — выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому.
  • MISO — вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
  • SCLK — последовательный тактовый сигнал (англ. Serial Clock). Служит для передачи тактового сигнала для ведомых устройств.
  • CS или SS — выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select).

Конкретные имена портов интерфейса SPI могут различаться в зависимости от производителя аппаратных средств, при этом возможны следующие варианты:

  • MOSI: SIMO, SDI (на устройстве), DI, DIN, SI, MTST;
  • MISO: SOMI, SDO (на устройстве), DO, DOUT, SO, MRSR;
  • SCLK: SCK, CLK;
  • SS: nCS, CS, CSB, CSN, nSS, STE, SYNC.

** Важно : Последняя линия включает модуль SPI Slave, причем обычно включение это происходит когда на линии логический “0″, а выключение, когда на линии логическая “1″ (отсюда вход Slave Select слейва, логичнее называть Not Slave Select, то есть когда на линии лог “1″, слейв НЕ выбран).
Дело в том, что к одному мастеру может быть подключено несколько Slave устройств(линии MISO, MOSI, SCK становятся общими) и конкретное  Slave устройство выбирается Мастером благодаря этому входу. Таким образом это позволяет SPI master обмениваться данными с несколькими устройствами slave, индивидуально обращаясь к каждому устройству, что позволяет избежать конфликта по шинам данных. Но тут кроется сюрприз в виде того, что при настройке нашего модуля в качестве мастера (Master) эта ножка может работать совсем в другом качестве, а именно на вход. Этот вариант поддерживается для возможности реализации шины SPI с несколькими Master(мастерами).

подключение

Где SPI в нашем MK (STM32F100RBT6) ?
В нашем микроконтроллере есть несколько блоков SPI. SPI1 – находится на шине APB2, а другой  SPI2 на шине APB1. В других микроконтроллерах серии можно встретить большее или меньшее число число интерфейсов.

Глядя на картинку ниже, можно определить, какие ножки определенного SPI на каком порту находятся. Необходимо не забывать про возможность ремапа, то есть изменение ножки, которую может взять под контроль блок SPI.

SPI_PinsDiscr

Data frame formatSPI_Data_clock_timing_diagram

У нас есть не так много вариантов настройки нашего модуля. При подключении какого-либо устройства к микроконтроллеру по интерфейсу SPI необходимо посмотреть техническую документацию на это устройство и понять всего несколько параметров. Как правило подключаемые устройства к микроконтроллеру это рабы(slave), то есть они будут подчинятся и управляться мастером, а именно нашим микроконтроллером. 
1) Определить в каком режиме мы будем работать. Режимом называется вариант работы CLK – линии тактирования.
2) Определить скорость на которой будем работать. Период импульсов тактирования.
3) Определить старшим битом вперед или младшим и число бит 8 или 16.

4) Определить где какие ножки и все подключить.

Различные варианты связи SPI устройств
Есть несколько вариантов использования нашего блока SPI. Главным образом устройства SPI делятся на два типа Master или Slave, но сейчас мы рассмотрим какие есть варианты соединения SPI устройств между собой.
Можно выделить 4-е варианта работы нашего блока :
1)  Две линии данных      (передача-прием)  [ BIDIMODE = 0, RXONLY = 0]
2)  Одна линия данных   (передача-прием) [ BIDIMODE = 1, BIDIOE = направление]
3)  Одна линия данных   (только прием)      [ BIDIMODE = 1, RXONLY=1]
4)  Одна линия данных   (только передача) [ BIDIMODE = 0, RXONLY = 0]
** Видим в пункте 4 та же настройка что и пункт 2. Оно все так и есть и производитель просто предлагает игнорировать приемную часть нашего микроконтроллера и соответствующую ножку можно использовать как ножку общего назначения.

Встроенный механизм счета CRC в блок SPI
Замечательные новости ведь, мы видим встроенный (аппаратный) блок счета CRC в составе нашего, широко известного интерфейса SPI. Это должно сказать нам о том, что теперь у нас есть власть легко и просто обеспечить передачу пакетов данных с посчитанной CRC для этого пакета, а на принимающей стороне так же легко проверить целостность пакета.

Вычисление CRC разрешается установкой бита CRCEN в регистре SPI_CR1. Это действие сбрасывает регистры CRC (SPI_RXCRCR и SPI_TXCRCR). В полном дуплексе или в режиме только передачи, когда передача управляется программно (CPU mode), необходимо записать бит CRCNEXT немедленно после последней передаваемой порции данных, записанной в SPI_DR. По окончании последней передачи данных будет передано значение SPI_TXCRCR. Фактически бит CRCNEXT должен быть записан перед окончанием передачи/приема последней порции данных.

Чтобы очистить CRC, выполните следующую процедуру (Регистры то на чтение):
1. Запретите SPI (SPE = 0).
2. Очистите бит CRCEN.
3. Установите бит CRCEN.
4. Разрешите SPI (SPE = 1).

Управление выводом выборки Slave (NSS)
Аппаратное или программное управление выводом NSS может быть установлено битом SSM в регистре SPI_CR1. [Биты  SSM и SSI]

• Программное управление NSS. когда SSM = 1. Выборка slave select управляется внутри микроконтроллера программно по значению бита SSI в регистре SPI_CR1. Внешний вывод NSS остается свободным, и может использоваться в приложении для других целей.
• Аппаратное управление NSS, когда SSM = 0. В этом состоянии возможны 2 варианта конфигурации в зависимости от того, как сконфигурирован выход NSS (бит SSOE в регистре SPI_CR2).
– выход NSS разрешен (SSM = 0, SSOE = 1). Эта конфигурация используется только когда устройство работает в режиме master. Сигнал NSS переходит в лог. 0, когда master начинает обмен и остается в лог. 0, пока SPI не будет запрещен.
– выход NSS запрещен (SSM = 0, SSOE = 0). Эта конфигурация разрешает возможность multimaster для устройств, работающих в режиме master. Для устройств, которые установлены как slave, вывод NSS работает как классический вход NSS: slave выбирается и становится активным, когда NSS переходит в лог. 0, и деактивируется, когда NSS переходит в лог. 1.

Зачем при режиме мастер опрашивается вывод NSS?
Есть вариант строить систему с несколькими мастерами(Master) на шине SPI, но что бы не было конфликтов введен определенный функционал для ножки NSS в режиме Master. Как мы знаем в этом режиме она если используется, то может быть только входом и должна быть притянута к лог единице, если на этот вход подается ноль, то у нас возникает штатная ситуация отключения модуля SPI [Master mode fault (MODF)].

Master mode fault (MODF), флаг ошибки режима master. Событие этой ошибки происходит, когда у устройства master есть вывод NSS, подтянутый к уровню лог. 0 (NSS в аппаратном режиме), или когда бит SSI равен 0 (когда NSS в программном режиме), это автоматически установит бит MODF. Master mode fault влияет на периферийное устройство SPI следующим образом:

• Бит MODF устанавливается, и генерируется прерывание SPI, если установлен бит ERRIE.
• Очищается бит SPE. Это блокирует все выходные сигналы от устройства, и запрещает интерфейс SPI.
• Очищается бит MSTR, так что устройство принудительно переходит в режим slave.

Continuous communication using DMA
Это то, с чем будем знакомиться когда изучим устройство DMA в нашем МК и тогда будут идти статьи про использования этого мощного инструмента во всех или почти всех периферийных блоках в составе нашего микроконтроллера. Просто пока надо сказать что DMA это блок, позволяющий разгрузить процессор и позволить определенному механизму перемещать данные, минуя процессор.

Прерывания (interrupts)
Разное может произойти в процессе приема-передачи данных по USART. Для полного и надежного контроля за процессом передачи данных мы можем реагировать определенным образом на все доступные прерывания. Важно увидеть организацию прерываний в виде дерева, из чего следует, что в прерывании надо будет проверять, что именно случилось читая статусный регистр, содержащий флаги прерываний. В документации есть удобная табличка содержащее описание прерывания – выставляемый флаг – бит разрешения этого прерывания.

SPI_interrupt_requests

Ссылки на комплектующие:
Отладочная плата: STM32VL Discovery (ссылка)
Микроконтроллер: STM32F100RBT6 (
ссылка)
Провод USB :  (ссылка)
Преобразователь USB-UART : FTDI (ссылка)

Макетная плата: (ссылка)
Блок питания на 12V (ссылка)
Преобразователь 12V  в  3,3/5V (ссылка)
Перемычки для макетной платы (ссылка)

Регистры (SPI)

SPI_CR1  [0x0000]SPI_CR1Описание: Регистр конфигурационный под номером один, состоящий из различных битов – настройки, которые нужно установить для достижения определенного режима работы модуля SPI.
Биты:
Bit 15    BIDIMODE:    Bidirectional data mode enable
Описание: Этот бит определяет по скольким линиям данных будет обмен.
0:  Режим 2-х однонаправленных линий данных.

1:  Режим 1-ой двунаправленной линии данных

Bit 14    BIDIOE:    Output enable in bidirectional mode
Описание: 
Этот бит до определяет работу SPI в режиме [1-ой двунаправленной линии данных](BIDImode). Выбираем, что хотим делать передавать или принимать.
0:  Выход отключен (можем только принимать)
1:  Вход отключен (можем только отправлять)

Bit 13    CRCEN:    Hardware CRC calculation enable
Описание: 
Этот бит разрешает аппаратный счет CRC (CRC8 или CRC16), этот функционал встроен в блок SPI. При установке этого бита происходит аппаратный сброс регистров SPI_RXCRCR и SPI_TXCRCR.
0:  Разрешить
1:  Запретить

Bit 12    CRCNEXT:    CRC transfer next
Описание: 
Этот бит необходимо установить для получения результата счета CRC. В случае когда мы передаем массив данных мы можем потом установить этот бит и в принимающее устройство отправится насчитанное значение контрольной суммы из регистра SPI_TXCRCR. Когда мы принимаем данные и знаем что приняли последний фрейм устанавливаем этот бит, тем самым говорим,что теперь передатчик передаст нам CRC, потом лезем в регистр статуса и смотрим флаг ошибки счета CRC (бит CRCERR – устанавливается при ошибке проверки контрольной суммы при приеме). 
0:  Принимается/Передается  фрейм данных 
1:  Принимается/Передается  фрейм CRC 

Bit 11    DFF:    Data frame format
Описание: 
Этот бит определяем длину фреймов (по сколько бит передаем/принимаем). Этот бит можно менять только если модуль не активен (бит SPE = 0).
0:  8 Бит
1:  16 Бит

Bit 10    RXONLY:    Receive only
Описание: 
Этот бит определяет, что у нас будет работать. Мы выбираем, что мы хотим [только принимать (полу дуплекс)] или [принимать/передавать (полный дуплекс)]. 
0:  Полный дуплекс (прием и передача)
1:  Полу дуплекс (только прием)

Bit 9    SSM:    Software slave management
Описание: 
Этот бит включает программное управление ведомым. Когда этот бит установлен, вместо уровня на входе NSS контролируется состояние бита SSI.
0:  Разрешить
1:  Запретить

Bit 8    SSI:    Internal slave select
Описание: 
Этот бит имеет значение только в случае, когда бит SSM установлен в 1(так называемое программное управление). Записывая значение в этот бит, мы можем имитировать сигнал NSS ведь теперь при установке бита SSM мы игнорируем лог уровень на ножке NSS и берем значение из нашего бита SSI.

Bit 7    LSBFIRST:    Frame format
Описание: 
Этот бит определяет формат фреймов (Старшим разрядом вперед[MSB] или младшим[LSB]). 
0:  [MSB] – Старшим разрядом вперед
1:  [LSB] – Младшим разрядом вперед

Bit 6    SPE:    SPI enable
Описание: 
Этот бит разрешает или запрещает работу нашего блока SPI. 
0:  Запретить
1:  Разрешить

Bit 5:3    BR[2:0]:    Baud rate control
Описание: 
Эти биты определяют скорость обмена(Baud rate), другими словами определяем пред делитель входной частоты шины для нашего блока SPI. Эта настройка определяет с какой частотой будет передача – прием данных при мастер режиме, ведь именно в этом режиме мастер генерирует CLK, а вот частота этих импульсов определяется именно тут.
000: fPCLK/2
001: fPCLK/4
010: fPCLK/8
011: fPCLK/16
100: fPCLK/32
101: fPCLK/64
110: fPCLK/128
111: fPCLK/256

Bit 2    MSTR:    Master selection
Описание: 
Этот бит определяет в каком режиме мы будем работать Мастер(Master) или Раб(Slave)
0:  Выбираем режим Мастер(Master/Ведущий)
1:  Выбираем режим Раб(Slave/Ведомый)

Bit 1    CPOL:    Clock polarity
Описание: 
Этот бит определяет полярность тактового сигнала (полярность и фаза это один из 4-ех режимов). 
0:  Линия CLK в логическом нуле[0], когда ничего не передается (idle)
1:  Линия CLK в логической единице[1], когда ничего не передается (idle)

Bit 0    CPHA:    Clock phase
Описание: 
Этот бит определяет фазу тактового сигнала (полярность и фаза это один из 4-ех режимов).
0:  Не обнаружили Break
1:  Обнаружили Break

SPI_CR2  [0x0000]SPI_CR2Описание: Регистр конфигурационный под номером два, состоящий из различных битов – настройки, которые нужно установить для достижения определенного режима работы модуля SPI.
Биты:
Bit 7    TXEIE:    Tx buffer empty interrupt enable
Описание: Этот бит разрешает прерывание при опустошении буфера передачи Tx buffer. Флаг прерывания == TXE.
0:  Запретить

1:  Разрешить

Bit 6    RXNEIE:    RX buffer not empty interrupt enable
Описание: 
Этот бит разрешает прерывание в момент, когда буфер на прием не пуст. Значит мы что-то приняли и надо бы это вычитать из буфера Tx buffer. Флаг прерывания == RXNE.
0:  Запретить
1:  Разрешить

Bit 5    ERRIE:    Error interrupt enable
Описание: 
Этот бит разрешает прерывание при обнаружении ошибки. Есть несколько вариантов и соответственно флагов(CRCERR, OVR, MODF). 
0:  Запретить
1:  Разрешить

Bit 4:3    R[1:0]:    Reserved, must be kept at reset value.

Bit 2    SSOE:    SS output enable
Описание: 
Этот бит разрешает или запрещает работу функционала ножки SS (в Master mode), другими словами это означает, что наш блок SPI берет под контроль ножку SS или нет.
0:  Запретить
1:  Разрешить

Bit 1    TXDMAEN:    Tx buffer DMA enable
Описание: 
Этот бит активирует/деактивирует запросы DMA для буфера передачи Tx buffer. Когда этот бит установлен, запрос DMA формируется при установке флага TXE в регистре SPI_SR
0:  Запретить
1:  Разрешить

Bit 0    RXDMAEN:    Rx buffer DMA enable
Описание: 
Этот бит активирует/деактивирует запросы DMA для буфера приема Rx buffer. Когда этот бит установлен, запрос DMA формируется при установке флага RXNE в регистре SPI_SR
0:  Запретить
1:  Разрешить

SPI_SR  [0x0000]SPI_SRОписание: Статусный регистр, состоящий из различных битов – флагов, которые устанавливаются аппаратно когда что-то значимое происходит. Важно знать, что флаги ошибок влияют сильно влияют на состояние нашего SPI блока и это влияние описано в даташите (21.3.10 Error flags).
Биты:
Bit 7    BSY:    Busy flag
Описание: Это флаг занятости. Устанавливается аппаратно в случае, когда происходит обмен данными или буфер передатчика содержит данные.
0:  SPI модуль занят

1:  SPI модуль свободен

Bit 6    OVR:    Overrun flag
Описание: 
Это флаг переполнения. Устанавливается аппаратно в случае, когда начали поступать новые данные, а мы еще не вычитали данные из буфера на прием. Важно помнить что у нас регистр данных и сдвиговый регистр, значит данные мы еще не потеряли, но можем, если передатчик начнет что-то нам передавать, а мы не вычитаем регистр данных, чтобы наш SPI мог переместить туда данные из своего сдвигового регистра.
0:  Не случилось
1:  Случилось

Bit 5    MODF:    Mode fault
Описание: 
Это флаг ошибки режима. Устанавливается аппаратно случае, когда обнаружен сбой в работе (флаг сбрасывается программно). Это может означать, что при работе устройства в режиме Master, когда при этом на его вход NSS поступил сигнал низкого уровня, переводящий устройство в режим Slave. Это серьезная ошибка и поэтому есть сильное влияние установки этого бита на наш блок SPI. А именно аппаратная очистка битов SPE и MSTR.
0:  Не случилось
1:  Случилось

Bit 4    CRCERR:    CRC error flag
Описание: 
Это флаг ошибки CRC. Устанавливается аппаратно в случае ошибки CRC (флаг сбрасывается программно). Суть в том, что если мы разрешили работу этого  блока в составе нашего SPI и приняли посылку с CRC от передатчика, то хотим знать совпало CRC или нет.
0:  Не случилось
1:  Случилось

Bit 3:2    R[1:0]:    Reserved, must be kept at reset value.

Bit 1    TXE:    Transmit buffer empty
Описание: 
Это флаг буфер на отправку пуст. Устанавливается аппаратно в случае, когда буфер на отправку пуст, что говорит о том, что теперь мы можем записать в этот буфер очередное значение на отправку. 
0:  Tx Bufer – Не пуст
1:  Tx Bufer – Пуст

Bit 0    RXNE:    Receive buffer not empty
Описание: 
Это флаг буфер на прием не пуст. Устанавливается аппаратно в случае, когда буфер на прием не пуст, что говорит о том, что теперь должны вытащить это значение, освободив место для новых приходящих данных. 
0:  Rx Bufer – Пуст
1:  Rx Bufer – Не пуст

SPI_DR  [0x0002]SPI_DRОписание: Регистр данных.
Биты:
Bits 15:0    DR[15:0]:    Data register
Описание: Это регистр данных, который на самом деле является двумя регистрами. Просто операции записи и чтения происходят над разными регистрами. Такой подход удобен, ведь теперь мы можем использовать одно имя регистра записывая данные на отправку и читать полученные данные. Важно учитывать выбранную длину фреймов, от нее зависит количество используемых бит этого регистра (16 или 8).

 

SPI_CRCPR  [0x0007]SPI_CRCPRОписание: Регистр хранения полинома для аппаратного счета CRC в составе блока SPI.
Биты:
Bits 15:0    CRCPOLY[15:0]:    CRC polynomial register
Описание: Это регистр для хранения полинома вычисления CRC. После сброса регистр содержит полином 0×0007, который может быть при необходимости программно изменен на другой.

SPI_RXCRCR  [0x0000]SPI_RXCRCRОписание: Регистр хранения контрольной суммы, которая посчиталась для принятых данных.
Биты:
Bits 15:0    RXCRC[15:0]:    Rx CRC register
Описание: Это регистр вычисленной CRC для принятого потока данных. Когда вычисление CRC разрешено, биты RxCRC[15:0] содержат вычисленную контрольную сумму от последовательно принятых байт. Этот регистр сбрасывается, когда в бит CRCEN в регистре SPI_CR1 записывается 1. CRC вычисляется с задействованием полинома, запрограммированного в регистре SPI_CRCPR.

 

SPI_TXCRCR  [0x0000]SPI_TXCRCRОписание: Регистр хранения контрольной суммы, которая посчиталась для отправляемых данных.
Биты:
Bits 15:0    TXCRC[15:0]:    Tx CRC register
Описание: Это  регистр вычисленной CRC для переданного потока данных. Когда вычисление CRC разрешено, биты TxCRC[15:0] содержат вычисленную контрольную сумму от последовательно переданных байт. Этот регистр сбрасывается, когда в бит CRCEN в регистре SPI_CR1 записывается 1. CRC вычисляется с задействованием полинома, запрограммированного в регистре SPI_CRCPR.

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

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