Arduino UNO и пользовательский csPin для SD-карт

sd-card sd custom

Я подключил модуль 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. Надеюсь, это поможет кому-то еще!

, 👍0

Обсуждение

Я не вижу разницы для контакта 10 между SD.begin(A3) и SD.begin(-1), но как установить контакт SS для SD-карты?, @Juraj

Я заземлил SD csPin, и все работает., @Khalil Laleh


1 ответ


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

3

Вывод 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