Як 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Роланда Рігеля.


2
Наскільки я розумію, V-USB дуже інтенсивний процесор, і, ймовірно, вводяться неприйнятні затримки в підпрограми SPI. Зазвичай SPI-операції не залежать від часу, але операції запису та стирання на SPI FLASH безумовно є.
Трейд Дейва

Проблема полягає в тому, що навіть операції з читання не спрацьовували більшу частину часу, і, як я читав, SPI-comms виконуються самостійно, як тільки регістри даних і керування встановлюються за допомогою запущеного коду.
dnet

@DaveTweed - часовий режим, з точки зору необхідності чекати на карту так, але з точки зору неможливості тримати карту в очікуванні вашої програми ??
Кріс Страттон

2
Ймовірно, ви чекаєте на щось, що або не може статися, або неможливо виявити; наприклад, штифт вводу / виводу, можливо, був налаштований і більше не був входом, або неправдиві дані / годинники могли бути відправлені на карту, переводячи її в небажаний стан. Також переконайтесь, що механізм, за допомогою якого бібліотека SD виконує необхідні затримки, не був порушений або прискорений.
Кріс Страттон

3
У вас також можуть виникнути проблеми з шумом або електропостачанням. Перевірте рейки з розмахом і перевірте лінії SD за допомогою логічного аналізатора, щоб побачити, що відбувається.
Джим Париж

Відповіді:


1

У мене виникла така проблема з USART, і я вирішив її, змінивши налаштування сторожової собаки. Як відомо, V-USB використовує сторожову собаку, і якщо ви вкладете додатковий час в одну операцію, сторожова собака активується. Спробуйте відключити сторожову собаку, і якщо ви побачите, що все йде добре, ви можете змінити час сторожової собаки або ви можете розділити код перешкод (коди SD-карти у вашому випадку) на менші частини та "Скинути" сторожову собаку між ними. Але не забувайте повторно активувати свою сторожову собаку після налагодження, оскільки не рекомендується використовувати V-USB без цього.


Зауважте, що питання зазначає, що дзвінки wdt_reset () вставлені у код SD; хоча, звичайно, можливо, що це робилося не скрізь.
Кріс Страттон

1
Так, але дійсно варто спробувати код, відключивши сторожову собаку. Іноді, особливо, коли дані, що повертаються, обробляються в режимі переривання, код застрягає там і сторожова собака активується перед скиданням
серпня
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.