Может ли ведомый SPI начать передачу в дуплексном режиме?


8

Насколько я знаю, передача SPI для ведомого SPI работает следующим образом:

  1. Мастер выбирает раба, используя пин SS
  2. Ведущий и ведомый отправляют данные друг другу одновременно
  3. Мастер запускает часы и передачу данных одновременно (до операции записи нет часов)
  4. Ведущий останавливает передачу в любое время (останавливая операцию записи и генерацию тактовых импульсов), даже если ведомый имеет больше данных для отправки.

Существует ли какая-либо конфигурация ведомого SPI, которая позволяет ведомому передавать данные без разрешения ведущего?

Я просто думаю вслух. Предположим, что есть только один ведомый, а ведущий обеспечивает непрерывные часы и т. Д.

Даже если предполагаемое утверждение истинно, не теряет ли синхронизация байта ведущий и ведомый (то есть получает поток битов), так как для SPI нет начальных и конечных битов?

Я задаю такой вопрос, потому что я прочитал следующий раздел из этого документа .

2.2 Пример SPI

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

  • Передача данных от ведущего к подчиненному.
  • Передача данных от ведомого к хозяину.
  • Передача данных от ведущего к подчиненному и от подчиненного к ведущему одновременно.

Документ дает пример SPI, но реализует пример с использованием устройств USART. И я понимаю, что ведомый USART может начать передачу без разрешения мастера.

Я не смог найти исходный код, на который ссылается документ.


4
Ведомый по определению не может инициировать транзакцию (хотя он может прервать мастер, чтобы запустить транзакцию).
Питер Смит

5
Однонаправленная передача данных в традиционном SPI - это просто тот, кто игнорирует состояние линии, идущей в другом направлении. Пишет, читает, и двунаправленные переводы на самом деле ничем не отличаются. Фактически, например, многие периферийные устройства SPI будут синхронизировать слово состояния во время первого слова, прежде чем они даже узнают, что запрашивается, поскольку это практически ничего не делает и позволяет проводить быстрый опрос статуса.
Крис Страттон

Ответы:


17

Нет, с SPI все коммуникации управляются ведущим устройством. Вы правы в том, что мастер не может просто предоставить непрерывные часы; не было бы никакого способа обнаружить границы байтов.

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

Затем устройство может установить контакт, в результате чего микроконтроллер раскручивает шину SPI.


Для получения более подробной информации, пожалуйста, читайте дальше :) Это немного измененная версия объяснения, найденного здесь :

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

Когда вы отправляете команду SPI от ведущего устройства, две передачи фактически происходят в течение тех же восьми тактовых импульсов. Во-первых, ваш байт находится вне линии MOSI. Но в то же время данные поступают на микроконтроллер через линию MISO.

Но так как ведомый не получает полную команду до конца этих транзакций, он не представляет никаких данных на шину. Это приводит к полученному значению 0x00 или 0xFF.

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

Обратите внимание, что в первой передаче мастер игнорирует все, что поступает от подчиненного. Во второй передаче подчиненный игнорирует все, что отправлено мастером.

Это описывает общий случай. Могут быть дополнительные сложности. Например, некоторые подчиненные микросхемы фактически выводят какой-либо байт состояния в то же время, когда они получают команду от ведущего. Таким образом, в этом случае мастер не должен сбрасывать первый полученный байт.


2
«Мастер не может просто обеспечить непрерывные часы». На самом деле я видел устройство не так давно, которое делает именно это. Это был странный зверёк. Я не помню P / N, к сожалению.
Аарон

@ Аарон Хорошо знать! Люди становятся все более и более умными :-)
bitmack

7

Нет, мастер - это тот, кто выбирает чипы и управляет тактовой частотой. Раб всегда будет слушать только часы и микросхемы. Передача данных может быть еще в дуплексном режиме. Существует несколько реализаций, в которых тактовая частота может быть непрерывной, но это не имеет большого значения, так как выбор чипа используется для синхронизации границ байтов в любом случае. Но есть и системы с несколькими хозяевами, поэтому в принципе у вас может быть какой-то механизм, позволяющий устройствам определять, кто является подчиненным и ведущим. Или просто включите отдельный провод «прерывания» для ведомого устройства, чтобы сообщить мастеру, что у него есть пакет данных для ведущего.


Не могли бы вы добавить пример мультимастерной системы?
Дэвидкари
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.