USART, SPI или Bit-Bang для непрерывной передачи байтов без вставки дополнительных битов.
Я это слышал
- Аппаратное обеспечение SPI вводит девятый, СТАРШИЙ бит между байтами.
- USART по-прежнему использует стартовые и стоповые биты в синхронном режиме
Правдивы ли оба эти утверждения? Могу ли я изменить встроенную библиотеку SPI, чтобы избежать #1? Или мне придется немного изменить необходимый протокол?
@Alexander M, 👍0
Обсуждение2 ответа
Лучший ответ:
Правдивы ли оба эти утверждения?
Ни одно из этих утверждений не соответствует действительности.
SPI никогда не вставляет дополнительные биты. Если бы это произошло, это сломало бы все. То, что вы, вероятно, видите (или думаете, что видите), — это задержка между отправкой байтов. Эта задержка не имеет значения, поскольку данные всегда отбираются только на фронте тактового сигнала (какой фронт зависит от режима связи SPI), а при отсутствии фронта тактового сигнала в этот период задержки данные отсутствуют.
USART в синхронном режиме — это SPI. В синхронном режиме нет стартовых и стоповых битов, поскольку для синхронизации связи используются тактовые импульсы, а не стартовые или стоповые биты.
Периферийное устройство SPI на ATMega328 не может непрерывно отправлять данные без короткой паузы после каждого байта, поскольку оно не производит выборку входного буфера сразу после тактирования последнего бита, независимо от используемых настроек. В лучшем случае вы можете тактировать байты с ожидаемой скоростью +2 такта при использовании ассемблера. UART допускает непрерывную потоковую передачу данных и должен использоваться для максимальной скорости, если вам также не нужен тактовый сигнал. Я проверил это с кодом с подсчетом циклов, установив периферийное устройство SPI на 8 МГц (его максимальная скорость с кристаллом 16 МГц, как использует Arduino UNO). С UART, используя цикл из 16 циклов в ASM, можно непрерывно загружать его данными (я использовал это для генерации композитного видео). С периферийным устройством SPI вам нужно добавить 2 такта после того, как периферийное устройство закончит работу, прежде чем оно сможет загрузить следующий байт. Таким образом, на частоте 8 МГц вы можете загружать в него данные каждые 18 тактов. Вот почему может показаться, что он выдает 9 бит вместо 8, если не учитывать тактовый сигнал.
- Последовательная связь между несколькими устройствами (или ардуино)
- Как загрузить скетч на atmega328 через FTDI FT232RL UART и Arduino IDE?
- Arduino UARTS Автоматическая адресация ведомых устройств
- Хорошие способы подключения нескольких шин I2C?
- Можно ли запрограммировать чип AVR (atmega328p) через i2c?
- Автономный ATmega328P перестает отвечать на запросы при подключении RX
- SPI.begin не работает после tristate
- Попытка понять узкое место частоты дискретизации датчика
На страницах 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