SPI работает как простые 8-разрядные регистры сдвига. Вы смещаете байты на MOSI на каждом фланге часов и в то же время вы переносите новые данные из MISO. Таким образом, вы отправляете и получаете в то же время. Следовательно, имена MOSI = Master Out Slave In и MISO = Master In Slave Out.
SPI периферийные устройства на микроконтроллерах более сложны, чем это, и имеют отдельные регистры данных, которые отличаются от реального регистра сдвига аппаратных средств, так что мы можем писать данные, не беспокоясь о ожидающей передаче. У некоторых может быть даже несколько буферов данных. Но на фундаментальном уровне SPI всегда работает с 8 бит.
Когда микроконтроллер, действующий как ведущий SPI, что-то пишет, обычно два флага, в котором говорится, что буфер данных становится доступным, а другой, который сообщает, что передача выполнена.
Когда вы закончите отправку, вы также получите получение. Вы получите какой-то флаг. Это предполагает, что все устройства реализуют SPI по назначению, что часто бывает не так.
Обратите внимание, что некоторые устройства реализуют систему, в которой вы сначала отправляете x байтов данных, а после этого получаете x байтов данных. Кажется, это сценарий, который вы описываете. Отправка и получение не выполняется одновременно для этого устройства, а вместо этого в последовательности. Это означает, что во время первой передачи вы будете часами в мусоре, а затем, чтобы получать данные, вы должны следить за мусором. Это не ошибка SPI, а то, как производитель конкретного устройства указал вещи.
Обратите внимание, что SPI очень плохо стандартизирован, и поэтому на рынке существует всякая странная дерьмо. Способ отправки/приема данных может изменяться, полярность часов (фланки) может изменяться, когда устройство синхронизирует данные. Некоторым устройствам могут потребоваться задержки между байтами данных. Некоторым устройствам может понадобиться некоторая неясная обработка булавки Slave Select для работы. Все это один большой беспорядок, и виновата отсутствие международной стандартизации.
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi Это должно позволить вам лучше понять SPI. У меня такое чувство, что этот вопрос слишком общий, и вы не представили рабочие примеры. – Neil
Это определенно не вопрос «С». Вы можете задать этот вопрос в http://electronics.stackexchange.com/ или следовать приведенной выше рекомендации. – tofro
SPI - очень упрощенный интерфейс, предназначенный для того, чтобы устройства на одной печатной плате разговаривали друг с другом. Неявные с тем, как они разработаны, если есть «дерьмо», тогда эта проблема начинается между стулом и клавиатурой или следующей кабиной. –