Путаница с проводкой SPI
В настоящее время я пытаюсь узнать о SPI и о том, как он работает на Arduino. Я хочу подключить к нему микросхему MAX7219 для управления светодиодной матрицей 8x8. Обычно я бы предположил, что проводка от Arduino к MAX7219 идет:
- PIN 10 SS -> CS
- PIN 11 MOSI -> DIN
- PIN 13 SCK -> CLK
И действительно, этот ответ подтверждает мое предположение. Тем не менее, изучив некоторые другие ресурсы и руководства, я нашел некоторую запутанную и противоречивую информацию о том, как должны быть соединены контакты на двух устройствах.
Например, в документации, прилагаемой к моему комплекту Arduino, есть эта схема.
Это руководство, как я обнаружил, имеет ту же проводку.
Удивительно, но это руководство вообще не использует контакты SPI.
Больше всего меня смущает предложение
VCC и GND модуля подключаются к контактам 5V и GND платы Arduino, а три других контакта, DIN, CLK и CS, подключаются к любому цифровому выводу платы Arduino.
Это правда? Если да, то в чем вообще смысл контактов SPI? Почему контакты подключены в столь разных конфигурациях? Я действительно смущен этим.
@omniverseal, 👍1
Обсуждение3 ответа
SPI — это коммуникационный протокол, вы можете воспользоваться преимуществами некоторых аппаратных оптимизаций, используя контакты там, где это оборудование доступно, или вы можете делать все вручную, используя любой контакт, который вам нравится, с недостатком более крупная и медленная прошивка. В определенных ситуациях, например при наличии шилда или библиотеки, уже использующей эти контакты, контакты SPI могут быть недоступны, и вам придется прибегнуть к программному решению (он же bitbang, поскольку вы манипулируете битами для генерировать правильные сигналы), в противном случае настоятельно рекомендуется использовать аппаратные контакты SPI.
I2C не должен мешать SPI на Uno, это разные контакты. Я использую SPI для проектов Max7219, гораздо более быстрые обновления, чем программная битовая обработка сигналов. Значения по умолчанию для SPI: часы 4 МГц, MSBFIRST, режим часов 0, работают нормально, и использование SPI.transfer для отправки данных в регистр простое: digitalWrite (ssPin, LOW); SPI.transfer (адрес регистрации); SPI.transfer(dataToLoad); digitalWrite (ssPin, ВЫСОКИЙ); с SCK, MOSI для часов и данных и D10, используемым для ssPin. Или любой другой контакт для ssPin, если D10 является выходом в вашем скетче, поэтому Uno все время является мастером SPI., @CrossRoads
Вы правы, SPI и I2C не конфликтуют, моя ошибка: ответ отредактирован. Не уверен, что вы имели в виду со всеми дополнительными комментариями, я также заявил, что аппаратный SPI намного быстрее, чем программные манипуляции с портами., @Roberto Lo Giacco
Да, мы согласны с тем, что SPI — это путь., @CrossRoads
Значит ли это, что ни одна из спецификаций выводов не является «принудительной»? Например, могу ли я использовать ШИМ на не-ШИМ-контакте или даже I2C на любых произвольных цифровых контактах?, @omniverseal
Скажем так: если это абсолютно необходимо и вы готовы столкнуться с множеством проблем, да, вы можете иметь последовательную связь, SPI или I2C на любом общем выводе ввода-вывода с некоторыми ограничениями в отношении скорости. Также можно получить ШИМ с более низкой частотой и жертвуя драгоценными циклами процессора только для вывода прямоугольной волны. Будьте осторожны: никто не советовал вам идти по этому пути, и мы прямо заявляем, что это будет трудный путь, если вы решите следовать ему., @Roberto Lo Giacco
@omnivrseal, на 328P, 1284P, 2560 есть специальное оборудование для SPI, I2C, последовательной связи, поэтому вам лучше использовать эти контакты. Для ШИМ также имеется аппаратное обеспечение таймера/счетчика/сравнения для поддержки ШИМ в режиме «установил и забыл», поэтому они могут свободно работать после того, как вы их включите, без необходимости участия скетча. Да, вы можете использовать программное обеспечение для имитации того, что делает аппаратное обеспечение, но оно будет работать медленнее, потому что код намного более интенсивный. Просто посмотрите на SPI — вы записываете в регистр, аппаратное обеспечение отправляет байт, вы получаете прерывание, когда это делается. Выполнение этого в программном обеспечении занимает много времени., @CrossRoads
Например, в документации, прилагаемой к моему комплекту Arduino, есть эта схема.
Выводы с 10 по 13 являются стандартными контактами SPI на Uno.
- 10 (СС)
- 11 (МОСИ)
- 12 (МИСО)
- 13 (SCK)
У меня есть учебник здесь. У меня также есть Stack Exchange справочный вопрос и ответ о SPI.
Самое удивительное, что в этом руководстве вообще не используются выводы SPI.
Конечно, можно "укусить" SPI и в некоторых случаях это желательно, например, если у вас что-то вроде интерфейса SD-карты, а также вы хотите использовать SPI для дисплея. На странице, на которую я дал ссылку, а именно в этом сообщении, я описываю, как кусать -банг SPI.
Больше всего меня смущает предложение
VCC и GND модуля подключаются к контактам 5V и GND платы Arduino, а три других контакта, DIN, CLK и CS, подключаются к любому цифровому выводу платы Arduino.
Для битового SPI да, вы можете использовать любые выводы.
Это правда? Если да, то какой вообще смысл в выводах SPI?
Аппаратный SPI быстрее и проще, и вы можете заниматься другими делами, пока SPI отправляет/принимает, но с битовым взрывом это гораздо больше зависит от времени.
В этом видео показан проект, который я сделал с Duemilanove, 4 MAX7219, управляющими 4 светодиодными матрицами 8x8, и питанием от источника питания 7,5 В. https://www.youtube.com/watch?v=hwYqgyMc5S4
При питании 9 В стабилизатор 5 В перегрелся и отключился через несколько минут. С 7,5 В проблем не было.
Выводы SPI и питания, 5V, Gnd, SCK, MOSI, идут на все устройства, и каждый чип имеет свой собственный вывод SS (я не хотел возиться с отправкой множества команд NOP для передачи данных через гирляндные чипсы). Данные на все 4 устройства обновляются со скоростью 50 мс, быстрее, а дисплей становится слишком сложным для чтения. Я думаю, что я тоже использовал только SPI на 4 МГц, я делал другие проекты с SCK на 8 МГц, которые могут очень быстро отправлять данные.
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как передать более 1 байта сразу по шине SPI?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Путаница между SPI и I2C для SSD1306 OLED
это выглядит как плохая инструкция ..... вы не должны подключать 5V к Vcc ...... я бы не доверял никакому учебнику, который говорит иначе ..... не используйте arduino в качестве источника питания, @jsotola
с «программным» SPI можно использовать любые выводы. с аппаратным SPI CS не следует подключать к MISO, @Juraj
Max7219 может питаться от 5В Arduino. Я делал проект, где питались 4 Max7219. При подаче 9 В в разъем ствола регулятор 5 В через некоторое время перегревался. С 7,5 В все пошло более гладко. Это зависит от того, сколько светодиодов горит одновременно и какой ток используется. 10K для резистора ограничения тока Max7219 сохраняли разумность., @CrossRoads
Вот 4 из Max7219 с питанием от USB, даже https://www.youtube.com/watch?v=hwYqgyMc5S4&pbjreload=10 Я взял это на работу и вместо этого запитал его от бочкообразного разъема, вот когда я увидел перегрев / отключение при 9 В и вместо этого пришлось упасть до 7,5 В., @CrossRoads