Pracuję nad projektem V-USB, który pokazuje się jako klawiatura za pomocą ATmega328p. Część USB działa świetnie (to nie jest mój pierwszy projekt V-USB), ale po uruchomieniu stosu V-USB usbInit()
wszystkie wywołania biblioteki kart SD kończą się niepowodzeniem. Jeśli wcześniej wywołam te same funkcje usbInit()
, wszystko działa idealnie.
Używam klonu Arduino o nazwie Diavolino, ale bez frameworka Arduino / okablowania. Mam USB podłączony do cyfrowych I / O 2 i 3, a kartę SD do 10-13 (wbudowane linie SPI).
Przejrzałem bibliotekę kart SD i nie znalazłem żadnych śladów, używając żadnych przerwań lub rejestrów innych niż SPxx
. Myślałem też o grep
kodzie V-USB, ale nawet nie dotyka SPxx
rejestrów.
Pierwszą oznaką problemu było odłączenie urządzenia, gdy miało ono uzyskać dostęp do karty SD. Następnie wstawiłem usbPoll()
i wdt_reset()
wywołałem wszystkie pętle obsługi kart SD i stwierdziłem, że w przypadku zapisu karta czeka na potwierdzenie z karty po wysłaniu dwóch ostatnich bajtów (CRC-16).
sd_raw
Używana przeze mnie biblioteka kart SD to Roland Riegel.
Odpowiedzi:
Miałem taki problem z USART i rozwiązałem go, zmieniając ustawienia obserwatora. Jak wiadomo, V-USB używa psa stróżującego i jeśli poświęcisz więcej czasu na jedną operację, pies stróżujący zostanie aktywowany. Spróbuj wyłączyć psa stróżującego, a jeśli zobaczysz, że wszystko idzie dobrze, możesz zmienić czas psa stróżującego lub podzielić kod zakłócający (kody kart SD w twoim przypadku) na mniejsze części i „zresetować” psa stróżującego między nimi. Ale nie zapomnij ponownie aktywować swojego psa stróżującego po debugowaniu, ponieważ nie zaleca się używania V-USB bez tego.
źródło