MicroSD мешает программированию ISP
У меня есть microSD, подключенная к Arduino, и я не могу запрограммировать ее через ISP, не извлекая SD-карту. Кто-нибудь знает, как сделать так, чтобы SD-карта не мешала программированию ISP?
Подробности:
Вот обзор microSD: https://www.adafruit.com/products/254
Я использую ATMEGA328P на 3,3 В 8 МГц.
Я не использую загрузчик и по ряду причин не могу использовать последовательный порт для программирования.
Спасибо!
@mar1980, 👍7
Обсуждение2 ответа
Поскольку SD-карта является устройством SPI, она использует те же контакты, что и интерфейс ISP. Единственный способ не допустить, чтобы SD-карта мешала ISP, — не подключать SD-карту.
Как вы видели, этого можно добиться, удалив карту.
Этого также можно добиться, добавив буфер с тремя состояниями между микроконтроллером и картой, чтобы микроконтроллер подключал карту к шине SPI только тогда, когда он готов ее использовать — в режиме по умолчанию карта отключена.
Нужно ли вам тогда отключать трехстабильный буфер перед программированием микроконтроллера?, @mar1980
Если вы правильно подключите буфер, он по умолчанию будет выключен, когда микроконтроллер перестанет активно включать его., @Majenko
Звучит здорово! Спасибо за совет. (Не могли бы вы порекомендовать, какой буфер мне использовать?), @mar1980
В качестве дополнительного бонуса вы также можете использовать буфер в качестве преобразователя уровня. Обратите внимание на серию 74hc, где есть четырёхпозиционный неинвертирующий буфер., @Majenko
Вам не нужно отключать карту — если программирование выполняется при совместимом уровне напряжения, достаточно отключить выбор чипа карты. Устройства SPI, в конце концов, предназначены для *совместного* использования сигналов SCK, MOSI и MISO, поэтому они не должны управлять сигналом MISO, если они не выбраны в качестве ведомых., @Chris Stratton
@ChrisStratton, в этом аргументе есть два недостатка... 1: большинство дешёвых шилдов для карт не имеют подтягивающего напряжения на CS, поэтому во время программирования CS нестабилен. 2: SD-карты не на 100% совместимы с SPI. Иногда во время тактирования на CS поддерживается высокий уровень. Они известны тем, что не всегда хорошо взаимодействуют с другими устройствами на шине — с ними нужно быть осторожным., @Majenko
Автор поста использует не шилд, а печатную плату, подключенную к чему-то, что, судя по всему, не является полноценной Arduino. Добавление резистора (в интерфейсе подключения, если не к какому-либо другому) — тривиальная задача (хотя и с шилдом это было бы несложно). Многие устройства SPI могут продолжать работу после того, как сигнал выбора возвращается к высокому уровню, что существенно отличается от управления ими на MISO , когда он никогда, или, по крайней мере, в последнее время не был низким. Сложности могут возникнуть, если существующий скетч запускает операцию SPI, которая затем прерывается переходом в режим программирования. Но ваш «единственно возможный» вариант кажется неточным ., @Chris Stratton
@ChrisStratton Да, многие (большинство) SPI-устройств продолжают работать с поднятым CS. Никакие другие SPI-устройства *не требуют запуска тактовой частоты с поднятым CS*. Это *фундаментальное* отличие между SD-картами и настоящими SPI-устройствами, которое, как известно, вызывает проблемы в полевых условиях. И, конечно же, есть нечёткость в понимании того, что представляет собой SPI-интерфейс SD-карт, реализованный по-разному у разных производителей, многие дешёвые китайские производители экономят на чём-то и т.д. Я видел некоторые SD-карты, у которых даже вывод MISO никогда не переходит в третье состояние. Как правило, я всегда подключаю SD-карты к их собственному выделенному каналу SPI., @Majenko
Это полезная деталь — ваш ответ был бы намного лучше, если бы в его тексте содержалось объяснение того, почему вы рекомендуете обращаться с SD-картой особым образом, а не как с обычным устройством SPI., @Chris Stratton
У меня была точно такая же проблема, также с использованием Arduino (Atmega 328P). У меня есть модуль SD-карты с другой компоновкой, но также с преобразователем уровня. Моя схема работает на 5 В (что подходит при использовании преобразователя уровня).

Чтобы решить эту проблему, я просто установил на своей плате подтягивающий резистор (10k) на линию выбора чипа модуля sd, который не позволяет выбрать карту sd во время программирования микроконтроллера. Теперь это работает.

Похоже, в модуле нет интегрированного подтягивающего резистора. Следовательно, CS имеет низкий уровень во время программирования (без подтягивающего резистора), SD-карта думает, что должна отвечать на команды SPI, и таким образом мешает связи с MCU, поэтому программирование через ISP не удается.
- Как изменить назначение контактов для LUFA AVRISPMkII?
- Не удается записать байт блокировки на Arduino Pro Micro
- При использовании Arduino Uno в качестве ISP: "Yikes! Invalid device signature" - плохое соединение, неверную конфигурацию или неверную версию avrdude?
- Arduino Pro Micro, получить данные с контакта Tx?
- Прорыв FTDI с дополнительным соединителем ISP
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
- Не удается загрузить скетч - avrdude: butterfly_recv(): programmer is not responding
Пробовали ли вы подключить резистор 10 кОм от CS к +3,3 В? К какому выводу подключен CS?, @frarugi87