USART, SPI или Bit-Bang для непрерывной передачи байтов без вставки дополнительных битов.

Я это слышал

  1. Аппаратное обеспечение SPI вводит девятый, СТАРШИЙ бит между байтами.
  2. USART по-прежнему использует стартовые и стоповые биты в синхронном режиме

Правдивы ли оба эти утверждения? Могу ли я изменить встроенную библиотеку SPI, чтобы избежать #1? Или мне придется немного изменить необходимый протокол?

, 👍0

Обсуждение

На страницах 217 и 220 Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016 не упоминается 9-й бит, и мне это кажется маловероятным. Вы действительно пробовали, работает ли это для вас?, @Paul

@Пол, Пол, я пробовал, но это не сработало, но это может быть проблема с самой программой. Отстой, что для моего варианта использования не существует таблицы данных., @Alexander M

№2 неверно. По сути, это USART в режиме SPI. #1 Без использования тактового сигнала возможна некоторая пауза, поскольку вы не можете записать данные заранее., @KIIV

Кстати: каков вариант использования? Зачем вам вообще нужен этот битовый поток?, @KIIV

@KIIV, ваш вопрос здесь наиболее актуален, потому что вопрос не имеет смысла. Это типичная http://xyproblem.info/. Когда речь идет о максимальном количестве байтов в секунду, дополнительные биты или байты не могут быть проблемой. Если речь идет о протоколе связи, то имеется манчестерский код. Когда байт необходимо передать без задержки, возможен 8-битный параллельный обмен данными между двумя платами Arduino плюс дополнительное прерывание. Есть много способов и много решений, если бы мы знали проблему., @Jot


2 ответа


Лучший ответ:

1

Правдивы ли оба эти утверждения?

Ни одно из этих утверждений не соответствует действительности.

SPI никогда не вставляет дополнительные биты. Если бы это произошло, это сломало бы все. То, что вы, вероятно, видите (или думаете, что видите), — это задержка между отправкой байтов. Эта задержка не имеет значения, поскольку данные всегда отбираются только на фронте тактового сигнала (какой фронт зависит от режима связи SPI), а при отсутствии фронта тактового сигнала в этот период задержки данные отсутствуют.

USART в синхронном режиме — это SPI. В синхронном режиме нет стартовых и стоповых битов, поскольку для синхронизации связи используются тактовые импульсы, а не стартовые или стоповые биты.

,

1

Периферийное устройство SPI на ATMega328 не может непрерывно отправлять данные без короткой паузы после каждого байта, поскольку оно не производит выборку входного буфера сразу после тактирования последнего бита, независимо от используемых настроек. В лучшем случае вы можете тактировать байты с ожидаемой скоростью +2 такта при использовании ассемблера. UART допускает непрерывную потоковую передачу данных и должен использоваться для максимальной скорости, если вам также не нужен тактовый сигнал. Я проверил это с кодом с подсчетом циклов, установив периферийное устройство SPI на 8 МГц (его максимальная скорость с кристаллом 16 МГц, как использует Arduino UNO). С UART, используя цикл из 16 циклов в ASM, можно непрерывно загружать его данными (я использовал это для генерации композитного видео). С периферийным устройством SPI вам нужно добавить 2 такта после того, как периферийное устройство закончит работу, прежде чем оно сможет загрузить следующий байт. Таким образом, на частоте 8 МГц вы можете загружать в него данные каждые 18 тактов. Вот почему может показаться, что он выдает 9 бит вместо 8, если не учитывать тактовый сигнал.

,