2016-08-16 5 views
0

Когда мастер SPI записывает в подчиненное устройство, что-то смещается в буфер приема правильно? Если да, то это нормальный флаг «RXDATAAVAILABLE», который должен быть установлен? Это вздор! Мы отправляем данные, и когда данные отправляются, мы получаем уведомление о получении данных.Что происходит в принимающей части, когда мы пишем с SPI?

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

Предположим, мы отправили два байтовых кадра. Первый - это адрес, а второй - фиктивный, чтобы прочитать значение в этом адресе (ведомого). Тогда предположим, что мы имеем два уровня Rx FIFO. В этом FIFO вместо значения, считываемого из подчиненного устройства, у нас есть два байта, первый - кто знает, а второй - значение, считанное из подчиненного.

Итак, вопрос в том, как нам удается получать только то, что необходимо, без получения мусорных данных во время записи части кадра?

+0

https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi Это должно позволить вам лучше понять SPI. У меня такое чувство, что этот вопрос слишком общий, и вы не представили рабочие примеры. – Neil

+0

Это определенно не вопрос «С». Вы можете задать этот вопрос в http://electronics.stackexchange.com/ или следовать приведенной выше рекомендации. – tofro

+0

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

ответ

2

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 для работы. Все это один большой беспорядок, и виновата отсутствие международной стандартизации.

+0

Это аппаратный вопрос и не связан с программным обеспечением. Он должен быть закрыт и не отвечать. – Olaf

+2

@Olaf SPI - это почти 50/50 аппаратное/программное обеспечение. Я не понимаю, как это будет не по теме.Вы тоже столкнетесь с закрытием всех вопросов о COM-портах RS-232 и Windows? – Lundin

+0

Если они спрашивают о том, как работает RS232 (уровни напряжения и т. Д.), Обязательно. И я не согласен, что SPI - это 50% -ное программное обеспечение. Вы можете реализовать ведомое устройство SPI, например. простой 74HC594, мастер с еще 1-2 стандартными логическими микросхемами и имеет межсетевой интерфейс без процессора. По крайней мере, одна из сторон была простой аппаратурой, на самом деле была идеей SPI. Нет, он не подходит для переполнения стека. Но вопрос может быть подходящим для электроники. – Olaf

1

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

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

  • Если выбраны правильно и взаимодействовал с существующей, оперативной периферией в читать или передачи работы, где он документированная дать результат, они будут иметь смысл

  • Если вы выполнили чисто операцию на периферийное устройство, для которого данные ответа не задокументированы в рассматриваемой позиции слова, это будет бессмысленно, фактически ничем не отличается от чтения некоторого случайного местоположения логической памяти. Обратите внимание, что в большинстве случаев операция записи - это просто передача, в которой принимаемые данные должны игнорироваться - на уровне реализации обычно нет другой разницы.

  • Если вы не смогли устранить любые существующие периферийные устройства, это будет также не имеющим смысла.

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

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

(Кстати, многие, хотя далеко не все, SPI периферийных документируется перекладывать из любой составляет их основной регистр состояния в фазе адреса, так как это делает быстрый способ опрашивать его)

+0

Есть что-то еще. Я намерен использовать DMA для приема. Это означает, что мне нужно подготовить четыре байта для предстоящего кадра, когда мне нужно только два. Это связано с конкретной работой DMA. Я просто не могу сказать, что DMA игнорируют первые два байта и берут два вторых. Я хочу освободить процессор от этой передачи. Да, я могу подготовить передачу по четыре байта и взять только последние два. Это меня раздражает, потому что мне нужно выделить четыре байта :-). В любом случае, спасибо @ Крис Страттон. – Hairi

+0

Действительно, если вы собираетесь использовать DMA, вам, вероятно, понадобится подготовить буферы с полным размером переноса и игнорировать часть используемого вами буфера. Именно так работает SPI. –