MicroSD мешает программированию ISP

У меня есть microSD, подключенная к Arduino, и я не могу запрограммировать ее через ISP, не извлекая SD-карту. Кто-нибудь знает, как сделать так, чтобы SD-карта не мешала программированию ISP?

Подробности:

Вот обзор microSD: https://www.adafruit.com/products/254

Я использую ATMEGA328P на 3,3 В 8 МГц.

Я не использую загрузчик и по ряду причин не могу использовать последовательный порт для программирования.

Спасибо!

, 👍7

Обсуждение

Пробовали ли вы подключить резистор 10 кОм от CS к +3,3 В? К какому выводу подключен CS?, @frarugi87


2 ответа


3

Поскольку 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


1

У меня была точно такая же проблема, также с использованием Arduino (Atmega 328P). У меня есть модуль SD-карты с другой компоновкой, но также с преобразователем уровня. Моя схема работает на 5 В (что подходит при использовании преобразователя уровня).

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

Похоже, в модуле нет интегрированного подтягивающего резистора. Следовательно, CS имеет низкий уровень во время программирования (без подтягивающего резистора), SD-карта думает, что должна отвечать на команды SPI, и таким образом мешает связи с MCU, поэтому программирование через ISP не удается.

,