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

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

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

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

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

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

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

2.2 Пример SPI

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

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

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

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

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

Ответы (2)

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

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

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


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

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

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

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

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

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

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

«мастер не может просто обеспечить непрерывные часы». На самом деле я недавно видел устройство, которое делает именно это. Это был странный маленький зверек. P/N не помню к сожалению.
@ Аарон Полезно знать! Люди становятся все умнее и умнее :-)

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

Не могли бы вы добавить пример системы с несколькими мастерами?