Как V-USB может испортить встроенный SPI ATmega328p?

14

Я работаю над проектом V-USB, который отображается как клавиатура с использованием ATmega328p. Часть USB работает отлично (это не мой первый проект V-USB), но после запуска стека V-USB usbInit()все вызовы библиотеки SD-карт завершаются неудачно. Если я вызываю те же функции раньше usbInit(), все работает отлично.

Я использую клон Arduino под названием Diavolino, но без Arduino / каркаса проводки. У меня USB подключен к цифровым входам / выходам 2 и 3, а SD-карта к 10-13 (встроенные линии SPI).

Я просмотрел библиотеку SD-карт и не обнаружил никаких признаков использования каких-либо прерываний или регистров, кроме SPxx. Я также хотел grepбы код V-USB, но он даже не касается SPxxрегистров.

Первым признаком проблемы было, когда устройство отключалось, когда предполагалось получить доступ к SD-карте. Затем я вставил usbPoll()и wdt_reset()позвонил во все циклы обработки SD-карты и обнаружил, что в случае записи карта всегда ожидает подтверждения от карты после отправки последних двух байтов (CRC-16).

Библиотека SD-карт, которую я использую, sd_rawпринадлежит Роланду Ригелю.

DNET
источник
2
Насколько я понимаю, V-USB очень сильно загружает процессор и, вероятно, вносит недопустимые задержки в процедуры SPI. Обычно, операции SPI не чувствительны ко времени, но операции записи и стирания на SPI FLASH определенно являются.
Дэйв Твид
Проблема в том, что даже операции чтения не работали большую часть времени, и, как я прочитал, SPI-связи выполняются независимо, как только регистры данных и управления устанавливаются рабочим кодом.
DNET
@DaveTweed - чувствителен ко времени с точки зрения необходимости ждать карту, да, но с точки зрения неспособности держать карту в ожидании вашей программы ??
Крис Страттон
2
Вероятно, вы ожидаете чего-то, что либо не может произойти, либо не может быть обнаружено; например, вывод ввода-вывода мог быть перенастроен и больше не являлся входом, или ложные данные / часы могли быть отправлены на карту, приводя ее в нежелательное состояние. Также убедитесь, что механизм, с помощью которого библиотека SD выполняет требуемые задержки, не был сломан или ускорен.
Крис Страттон
3
У вас могут быть проблемы с питанием или шумом. Проверьте ваши рельсы с помощью прицела и проверьте линии SD с помощью логического анализатора, чтобы увидеть, что происходит.
Джим Пэрис

Ответы:

1

У меня была такая проблема с USART, и я решил ее, изменив настройки сторожевого пса. Как вы знаете, V-USB использует сторожевой таймер, и если вы добавляете дополнительное время на одну операцию, сторожевой таймер активируется. Попробуйте деактивировать сторожевой таймер, и если вы видите, что все идет хорошо, вы можете изменить время сторожевого таймера или разделить мешающий код (коды SD-карты в вашем случае) на более мелкие части и выполнить «сброс» сторожевого устройства между ними. Но не забудьте повторно активировать свою сторожевую собаку после отладки, так как без этого не рекомендуется использовать V-USB.

август
источник
Обратите внимание, что в вопросе упоминается вставка вызовов wdt_reset () в код SD; хотя, конечно, возможно, что это было сделано не везде.
Крис Страттон
1
Да, но действительно стоит попробовать код с отключением сторожевого пса. Иногда, особенно когда возвращаемые данные обрабатываются в процедуре прерывания, код застревает там, и сторожевая собака активируется перед сбросом
августа 13 августа