Инструменты пользователя

Инструменты сайта


prog:spi:ve1_ve92

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

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

spi_ve1_ve92.jpg

По подключению надо отметить, что требуется общая земля для сигналов. Чем лучше будет земля, тем стабильней будет обмен. Поэтому я подключил землю двумя проводами. Сигналы 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ВЕ2У выбран мастером, 1986ВЕ1Т - ведомым. Мастер посылает значения ведомому, который возвращает их обратно. Мастер увеличивает на +1 следующее значение перед отправкой. Оба микроконтроллера сравнивают пришедшие значения с ожидаемыми и считают ошибки за определенный период.

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

Код примера доступен на GitHub

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

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

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

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

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

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

При таком включении видно, что сигнал 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Т подключить на свою землю.

spi_nofss_be1_be92.jpg

Обе платы я включил в один фильтр (удлинитель с кнопкой), при одновременном включении питания обмен стартует успешно. Если одновременно делать сброс по Reset, то иногда старт происходит с ошибкой. Возможно необходимо увеличить паузу при старте мастера. Но дальше я не экспериментировал.

prog/spi/ve1_ve92.txt · Последние изменения: 2019/04/02 10:54 — katya