Pull to refresh

Comments 29

Добрый день, спасибо за статью! А не подскажите как соединить 2 ведущих/1 ведомый? Т.е. две ардуинки которые собирают данные и отдают главной, а та отсылает по интернету куда надо.. Я понимаю что с каждой можно собрать и сразу отправить, но там такой кейс :)

Нужно ставить коммутатор линий. Иначе при одновременной работе двух ведущих устройств будут коллизии.

Но правильней поменять ведущих и ведомых местами.

Для этих целей лучше использовать I2C — там есть встроенный мультимастеринг. Правда его часто забывают реализовать ;)

Предложу такие варианты:

  1. Соединить одним проводом двух мастеров, и пусть один поднимает на нем уровень в момент когда не опрашивает слейва, тогда второй может в этот момент общаться.

  2. Модифицированный первый вариант - CS от первого мастера параллельно подключен как вход второго мастера, и второй следит, когда первый перестанет опрашивать слейва.

  3. Если мастеры запрашивают одно и то же, то можно второй мастер сконфигурировать как "Receive only master", и он будет подслушивать, что отвечает слейв на запросы первого.

Поменять мастер/слейв местами и далее по классике.

SPI у большинства контроллеров, от AVR до STM32 поддерживает режим Мультимастер. Когда все другие Мастеры автоматически переходят в Слэйв, увидев, что один из Мастеров опустил уровень на CS. Дальнейшая обработка, прослушивание MOSI и пр. производится программно, но работает вполне надёжно. Для Ардуино этого может не быть, но на С делал для AVR и работало прекрасно.
  1. Использовать не только !CS для выбора ведомого, но и !SS (Slave Select) для арбитража между ведущими.
  2. Поменять роли, как уже писали.

Обмен по SPI - фактически DMA в мире микроконтроллеров. Сравнивать его с I2C и тем более с RS-232 некорректно - область первого - внутрисистемный высокоскоростной синхронный обмен с заранее известным количеством hardwire-адресуемых устройств. В принципе, SPI реализуется аппаратно парой сдвиговых регистров и парой регистров-защелок без всяких МК, поэтому, особой стандартизации и не требует - многие системы, между компонентам которых еще во времена ИС малой степени интеграции не хотелось тянуть параллельные шлейфы, как г-н Журден, говорили прозой - то есть использовали последовательный синхронный обмен, который еще не был назван SPI :)

I2C же - адресный протокол внутрисистемного и ближнего межсистемного обмена, и соответственно, нагружен метаинформацией, что требует дополнительной буферизации при обмене с абсолютно детерминированным таймингом (например ЦАП/АЦП). Хотя сейчас буферизация на кристалле - совершенно не проблема для ИС, а ограничение на количество выводов - как раз проблема, увеличивающая стоимость - поэтому I2C популярен и для синхронных по своей природе устройств :)

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

Разве SPI синхронный протокол? Работа передатчика никак не синхронизируется с работой приемника. Наоборот то да. Но передатчик ни когда не узнает, что там с приемником.

Он "синхронный" в том плане, что известно когда надо сэмплить линию данных (как и в I²C), в отличие от асинхронного UART.

Конечно, SPI синхронный протокол. У него есть выделенная, по которой тактовый сигнал синхронизации передачи данных ходит.
И, если ведомый спроектирован нормально, то ведущий может в любой момент прочитать из ведомого слово состояния и узнать, что с ним происходит.

Может подскажет кто почти по теме...
Есть устройство где два блока (морда с крутилками/мигалками и SoC) связаны по SPI четырьмя линиями как здесь. Задача - эмулировать морду. Но осложняется, что посылки могут быть как 4 ,8 и на вскидку до 24 бит. Также летают какие то по видимому служебные сигналы ид... (смотрю в PulseView)
Каким бы статистическим анализатором воспользоваться что бы найти повторяющиеся паттерны? Уж очень не хочется вручную.

пример

Там точно SPI-шина? То, что изображено на картинке на неё не похоже.

То что последовательное - точно (видно что тактируется по фронту), но то что именно SPI как в статье - не совсем. Сигналы называются ACK, TX, RX, STB.
Мечтается просто взять и насэмплировать по много раз одних и тех же операций, скормить какому то софту и посмотреть какие паттерны и где.

UFO just landed and posted this here

Ну дак это канал об анимэ сайт для программистов от программистов.
Статья про основы петончика с инфой взятой из соседнего поискового запроса очевидно получила бы тут сразу тонну минусов. А по не программистким (но техническим) темам тут чуть более снисходительнее.

тут хотябы схема есть нормальная, а не только ардуиновский рисунок. Это уже огромный шаг вперед для любителей Ардуино.

UFO just landed and posted this here
Соединение типа «кольцо» больше теоретическое, никогда на практике не встречал такое соединение — обычно несколько микросхем подключают или напрямую, если с пинами проблем нет, или «звездой».

да, я как-то тоже не уверен, возможно ли такое последовательное соединение (если не сделать специально). Вот JTAG да, можно цепочкой соединять, объединяя TCK.

Да потому что выгоды нет никакой — количество пинов то же самое. А как конкретный производитель там у себя трансляцию реализовал или не реализовал неизвестно. Часть микросхем вообще MISO не подразумевает. Получается надо штудировать даташиты + программная нагрузка возрастает. Ну и кому это надо, если можно просто четыре сигнала подключить не думая)

Удобная штука, если есть много однотипных датчиков, которые можно опрашивать одновременно, а с ногами недостача.

Но на датчик же всё равно обычно нужно команду на чтение отправить. SS у всех опущены будут. Это команда спровоцирует ответ от первого датчика, который вторым будет как команда приниматься? А первичная команда как до второго дойдёт? Или она из первого датчика потом за ответом выйдет и второй датчик не примет данные от первого, но среагирует на команду, а за это же время на первый датчик придёт нулевой байт, который далее ни на что не повлияет? Как-то замороченно… Если проверить такую логику не на чем, лучше уж не рисковать и дешифратор поставить)

Пропустил важный момент: датчики подключены к сдвиговым регистрам, или чисто входным, или к паре 595(отправка команды)+165(прием ответа). Тогда все нормально: подали SS, ноги регистров ушли в high-z, в mosi запихали команду, из miso "выдавился" результат измерения.

Слишком кучеряво. "Датчик" — уже имеет в себе SPI-ведомый, не так ли?

Нет, что-то тупое типа кнопки. Схему 165+595 использовал для самопальных однобитных АЦП, к которым подключеные фотодиоды-датчики приближения.

Ваш ковёр с часиками (на видео) показывает неправильное время. Надо, чтобы показывал 4:20 - тогда в него можно залипать долго :)))

(щютк, киргуду))

ЗЫ: *ля, что за дебильный редактор здесь сделали...

Автор, а ты уверен что "Наличие множества вариантов реализации интерфейса." недостаток?

Sign up to leave a comment.