Arduino UNO и пользовательский csPin для SD-карт
Я подключил модуль SD-карты к Arduino UNO
. Я хочу использовать PIN 10
для PWM DC motor control
и поэтому я подключил CS pin
напрямую к другому pin (A3).
SD-карта работает правильно, но после вызова SD.begin(A3)
она устанавливает PIN 10
в значение HIGH
!
Сразу после SD.begin(A3)
и установите этот вывод в LOW
, но в это время двигатель сделал небольшой оборот.
Я покопался в SD.cpp
и Sd2Card.cpp
, но не смог найти, где возникла эта проблема!
Любая помощь приветствуется...
Решение:
Просто вызовите SD.begin(-1)
и это не коснется PIN10
. Надеюсь, это поможет кому-то еще!
@Khalil Laleh, 👍0
Обсуждение1 ответ
Лучший ответ:
Вывод 10 является специальным. Это аппаратный вывод выбора микросхемы для SPI. Он является неотъемлемой частью периферийного устройства SPI в микросхеме.
Этот вывод должен быть ВЫХОДОМ для SPI, чтобы он работал как ведущий, или ВХОДОМ для того, чтобы он работал как ведомый.
Если вы меня спросите, это глупое решение Atmel, но вот так. Так что, по сути, попытка использовать SPI одновременно с ШИМ на выводе 10 «не определена» и ее следует избегать.
Используйте другой вывод для ШИМ или, если вам нужно больше выводов ШИМ, чем доступно, рассмотрите возможность использования внешней микросхемы управления ШИМ.
Просто покопавшись, чтобы узнать больше подробностей о том, как все это работает, вот что я обнаружил:
digitalWrite()
явно отключает ШИМ на выводе.- Направление контакта 10 определяет работу SPI как ведущего или ведомого.
analogWrite()
устанавливаетpinMode(OUTPUT)
.- Библиотека SD вызывает
pinMode(OUTPUT)
иdigitalWrite(HIGH)
на выводе 10.
Это означает, что:
SD.begin()
завершит любой существующий ШИМ на выводе 10.- Использование ШИМ на выводе 10 заставит вывод работать в режиме вывода, что сделает режим ведомого устройства SPI невозможным
Вы должны иметь возможность использовать ШИМ на выводе 10, если и только если:
- Вы используете
analogWrite()
после использованияSD.begin()
, и - Вам никогда не следует использовать подчиненный режим SPI.
Я не говорю, что это глупое решение с вашей стороны. Я говорю, что это глупое решение компании Atmel, привязавшей работу SPI к направлению определенного контакта., @Majenko
Извините, моя ошибка., @Khalil Laleh
10 должен быть ВЫХОДОМ для ведущего устройства SPI. Неважно, НИЗКИЙ, ВЫСОКИЙ или ШИМ. Единственная проблема в библиотеке SD, предполагающей наличие другого устройства SPI на выводе 10., @Juraj
второй голос за явно неверный ответ?, @Juraj
@Juraj Что не так? Проблема не в HIGH или LOW - это неважно. Проблема в том, что вывод 10 является неотъемлемой частью SPI., @Majenko
ВХОД для ведущего??? ВХОД для ведомого., @Juraj
@Juraj Простая опечатка. Довольно очевидная, я бы подумал. Не причина, чтобы это было "wong" - только причина, чтобы вы указали на опечатку., @Majenko
но тогда остальное не имеет смысла, @Juraj
Почему вы так говорите?, @Majenko
ШИМ - это ВЫХОД. Контакт 10 можно использовать для ШИМ, если Atmega - ведущий., @Juraj
А, я вижу ваше замешательство. ШИМ — это не ВЫХОД. Это ШИМ. Он не управляется регистрами порта. Он исходит от таймера., @Majenko
analogWrite имеет выход pinMode, @Juraj
Ну и что? Это ничего не значит., @Majenko
регистр установлен, SPI является ведущим, @Juraj
SS и OC1B — это *альтернативные функции* на одном и том же пине. Вы можете выбрать только одну из них за раз., @Majenko
Я интерпретирую данные и комментарии в библиотеке так, что если SPI является ведущим, то SS является gpio. только если он станет INPUT LOW, SPI переключится в подчиненный режим. вы тестировали его с ШИМ? Я нигде не видел примечания о конфликте контакта 10 ШИМ с ведущим SPI, @Juraj
digitalWrite явно отключает ШИМ на пине. Я откопаю один из своих старых Arduino и поэкспериментирую, посмотрим, какова реальная работа., @Majenko
@Juraj Я протестировал все возможные варианты и выяснил, где можно, а где нельзя использовать ШИМ на выводе 10. Я обновил свой ответ, добавив больше подробностей., @Majenko
спасибо. Я только что начал подключать SD-карту Ethernet-шилда к Nano :-), @Juraj
- Режимы открытия файлов на SD-карте Arduino добавление/перезапись
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
- Использование SD-адаптера 5 В в системе 3,3 В
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- DFPlayer для записи на SD-карту
- STM32 и SdFat - Не удается создать файл в каталоге на SD-карте
- Как **получить** атрибуты для файлов SD?
- Попытка прочитать случайную строку с SD-карты
Я не вижу разницы для контакта 10 между SD.begin(A3) и SD.begin(-1), но как установить контакт SS для SD-карты?, @Juraj
Я заземлил SD csPin, и все работает., @Khalil Laleh