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