Безопасно ли прерывание SPI?

Я пишу на карту microSD из своей прошивки, но это задача с самым низким приоритетом, поэтому она может быть прервана другими задачами, пока идет чтение/запись.

Теперь предположим, что я общался с этой картой microSD с помощью UART. Проблема во время чтения будет заключаться в том, что аппаратный RX FIFO переполнится, поэтому максимальная задержка, которую я могу предпринять, будет (размер FIFO × байт в секунду), а во время записи проблем не будет, потому что другой конец просто будет ждать, пока я отправить следующий символ.

Как это работает теперь, когда я использую SPI? Ситуация такая же, что для записи не имеет значения, а для чтения зависит от размера SPI FIFO?

Ответы (2)

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

Есть три основных предостережения, о которых следует знать:

  1. Как правило, после того, как транзакция на шине SPI началась, ни один из проводов на шине не может использоваться для каких-либо других целей, пока эта транзакция не будет завершена. В общем, это означает, что прерывание не может использовать шину SPI, за исключением случаев, когда это единственное, что будет использовать шину (в некоторых случаях прерывание может иметь исключительное использование шины, а для основного программа для эксклюзивного использования в другое время). Некоторые устройства включают в себя специальные контакты, позволяющие им «игнорировать» шину в середине транзакции, но даже с такими функциями я бы не рекомендовал пытаться прерывать транзакцию SPI с одним устройством, выполнять транзакцию с каким-то другим устройством, а затем позволить основному коду возобновить свою транзакцию с первым. Лучше, чтобы прерывание использовало отдельную шину SPI.
  2. Некоторые устройства могут вести себя странно, если транзакция продолжается слишком долго. Некоторые микросхемы часов реального времени, например, не выполняют двойную буферизацию регистров времени/даты, а вместо этого фиксируют любые события «опережения во времени», которые могут произойти во время транзакции, и применяют их после завершения транзакции. Если транзакция занимает так много времени, что приходит второе событие с опережением времени, последнее событие будет проигнорировано, что приведет к смещению часов на это время. Я действительно не вижу оправдания для разработки чипа таким образом (даже если кто-то не хочет затрат на двойную буферизацию данных, указание того, что программное обеспечение отвечает за обеспечение их согласованности, будет дешевле, чем добавление логики «отсрочки обновления», и сведет к минимуму вероятность нарушения часов), но такие чипы существуют.
  3. Есть несколько устройств, которые используют часы и сигнал данных, но используют «паузу» для обозначения кадрирования. Самым последним примером этого, с которым я столкнулся, была светодиодная гирлянда с контроллером на лампочку. Мне не особенно нравятся такие конструкции (с таким же успехом можно указать кадрирование с использованием трех последовательных нарастающих фронтов на проводе данных без каких-либо промежуточных тактовых импульсов), но опять же, такие устройства существуют.

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

+1 Красиво! Полностью согласен со всеми вашими мнениями/недовольствами. Видел тоже много раз.

Проверяя копию спецификации (которую я не могу процитировать по причинам авторского права / NDA), скорость SPI указана, начиная с 0 Гц, что означает, что статическая работа в порядке. При использовании SPI вы получаете данные обратно только во время тактирования устройства, поэтому при использовании аппаратного SPI вы получите что-то только после отправки данных (даже если 0 / все равно). Таким образом, в этом отношении он отличается от UART, где вы можете получать незапрошенные данные в любое время.

Так что меня беспокоит только то, что карта MicroSD имеет какой-то встроенный тайм-аут, но не сам SPI?
Согласно спецификациям, которые я мог видеть, на SD-карте также не должно быть тайм-аута, поэтому не вижу, чтобы у вас были какие-либо проблемы. Несколько лет назад я написал некоторый собственный код, и пока отладка выполнялась пошагово, оставляя, скажем, 10 или более секунд между операциями SPI, и все было в порядке.
+1, возможность запуска SPI до 0 Гц полезно знать для отладки. Спасибо.
Стоит отметить, что на некоторых SPI-устройствах выходные данные могут изменяться только по определенному фронту тактового сигнала, а на некоторых других выходные данные могут иногда изменяться асинхронно; это особенно характерно для «занятого» бита. На некоторых микросхемах, если состояние бита «занято» отключено, и он все еще находится на выходе, когда часть становится незанятой, выход будет асинхронно изменяться. На некоторых других чипах сообщаемое состояние «занято» не изменится до тех пор, пока он не будет перетактирован. Обе конструкции имеют свои преимущества и недостатки, поэтому полезно знать, что существуют оба типа конструкций.