24426

Эхо между 1986ВЕ92У с 1986ВЕ1Т по SPI

Дата последнего изменения: 30.12.2020 12:38:04

Работу интерфейса SPI рассмотрим на связке микроконтроллеров (далее МК) 1986ВЕ92У и 1986ВЕ1Т. Подключение двух отладочных плат показано на рисунке 1.

Рисунок 1 - Соединение отладочных плат 1986ВЕ92У и 1986ВЕ1Т

При подключении необходимо учитывать, что требуется общая земля для сигналов. Чем лучше будет земля, тем стабильней будет обмен. Поэтому при запуске рассматриваемого примера земля была подключена двумя проводами. Сигналы TX должны подключаться на RX.

Важно, чтобы один из МК выступал в роли ведущего, а второй в роли ведомого. Иначе, если встретятся два TX, (один подаст 0, а второй 1), то выводы могут выгореть.

Чтобы этого не случилось достаточно, чтобы в файле main.c всегда был выбран только один мастер:

#if defined (USE_BOARD_VE_1)
   #define MASTER_MODE 0
#elif defined (USE_BOARD_VE_92)
   #define MASTER_MODE 1
#endif

По этой же причине при смене того, кто будет выступать мастером, лучше разъединить микроконтроллеры на время осуществления прошивок. Если смена мастера-ведомого не происходит, то разъединять связь нет необходимости. 

По умолчанию в проекте 1986ВЕ92У выбран мастером, а 1986ВЕ1Т - ведомым. Мастер посылает значения ведомому, который возвращает их обратно. Мастер увеличивает на +1 следующее значение перед отправкой. Оба микроконтроллера сравнивают пришедшие значения с ожидаемыми и считают ошибки за определенный период.

  • Если ошибок за период нет, то переключается один светодиод.
  • Если ошибки за период были, то переключаются оба светодиода.

Код примера доступен для скачивания в конце статьи.


Вариант без использования FSS

Сигнал FSS - это сигнал фреймовой синхронизации. Он выделяет передаваемое слово из общего потока данных. FSS необходим в режимах с SPH = 0, потому что по фронту первого клока в посылке уже будет производиться чтение линии. Поэтому предварительное падение линии FSS в 0 показывает ведомому, что начинается обмен и необходимо выдать свои данные на MISO.

Рисунок 2 - Формат синхронного обмена протокола SPI, SPO=0, SPH=0 (одиночный обмен)

То есть в режимах с SPH = 0 без использования сигнала FSS не обойтись. Кроме того, при непрерывном обмене этот сигнал должен включаться-выключаться между пересылкой каждого слова данных.

Необходимо обратить внимание, что сигнал TX находится в 3-м состоянии, когда FSS = 1. И только когда FSS = 0, линия TX выходит из 3-го состояния, и по ней возможна передача данных. Это важно помнить, когда используется режим без линии FSS, то есть когда используется привычный SPI с 3-мя линиями. Для этого необходимо использовать режим SPH = 1.

Рисунок 3 - Формат синхронного обмена протокола SPI, SPO=0, SPH=1

Как видно из рисунка 3, сигнал FSS здесь не так важен и переключать его нет необходимости. Поэтому сигнал FSS со стороны ведомого просто подключают к GND, а FSS со стороны мастера не выводят на внешний пин (рисунок 4).

Рисунок 4

При подключении, изображенном на рисунке 4, видно, что сигнал CLK является входом для ведомого, и именно по сигналам на нем ведомый выдает свои данные. В случае соединения двух демоплат важно, чтобы ведомый не начал выдавать данные, пока мастер, например, инициализируется. Если мастер-контроллер еще не успел настроить свой SPI, то линия CLK будет в 3-м состоянии. На ней появятся наводки и утечки, которые ведомый может воспринять как такты обмена, если сигнал помех превысит уровень логического нуля. Ведомый может выдать часть своих бит, а когда начнется настоящий обмен, данные уже будут испорчены. В случае с использованием FSS этого бы не случилось, поскольку сигнал FSS синхронизирует посылки.

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

// Ожидание, чтобы при одновременной подаче питания ведомый уже был готов, к моменту старта мастера
#ifdef MASTER_MODE
      Delay(20000);
#endif
...
// Подтяжка CLK к 0 для ведомого, чтобы не ловил случайные помехи, пока мастер не подключился к линии.
#if !MASTER_MODE
    MDR_PORTD->PULL = BRD_SPI1_D_PIN_CLK;
#endif
...
// Режим SPH=1
#if WITHOUT_FSS
     pBRD_SPIx->pSSPInitStruct->SSP_SPH = SSP_SPH_2Edge;
#endif

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

// Максимальная скорость сэмплирования для ведомого
#if !MASTER_MODE
    pBRD_SPIx->pSSPInitStruct->SSP_CPSDVSR = 12;
    pBRD_SPIx->pSSPInitStruct->SSP_SCR = 0;
#endif

// файл brdSPI_Select.h - общие настройки блоков SPI, скорость для мастера
SSP_InitTypeDef _SSPInitStruct =
{
 .SSP_SCR = 0,
 .SSP_CPSDVSR = 12,
 ....
}

ВАЖНО помнить, что частота ведомого не может быть больше чем SPI_Clock/12, поскольку для сэмплирования входного сигнала требуется 12 тактов частоты. Этим определяется максимальная частота обмена при использовании блока SSP в качестве ведомого. В примере используется BRG = 1, то есть SPI_Clock = CPU_Clock, что при частоте ядра 80МГц дает скорость обмена 80/12 ~ 6МГц.

По сравнению с начальным соединением плат друг с другом для запуска необходимо сигнал FSS от ведомого ВЕ1Т подключить на "свою" землю (рисунок 5).

Рисунок 5 - Подключение сигнала FSS

Необходимо обеспечить одновременную подачу питания. В таком случае обмен стартует успешно. 


Сохранить статью в PDF

Файлы для скачивания

Теги

Была ли статья полезной?