Cześć,
chciałbym zapytać jaka jest prawidłowa procedura rozłączenia urządzenia z USB. Sam kontroler aktywuję komendą:
i wszystko ładnie działa, komputer rozpoznaje urządzenie. Problem pojawił się natomiast przy rozłączaniu. Wcześniej się tym nie przejmowałem, bo nie miałem potrzeby wyłączania USB na urządzeniu, ale teraz taka się pojawiła. Naturalnie do tego celu użyłem więc:
wszystko działa okej, urządzenie przestaje być wtedy rozpoznawane przez komputer. Problem polega na tym, że raz na jakiś czas ta funkcja powoduje dziwne zawieszenie procesora. O tyle dziwne, że jednocześnie odtwarzany jest dźwięk podawany na DAC przez DMA z bufora zapełnianego cyklicznie i w przypadku zwyczajnego utknięcia w pętli gdzieś w części programu napisanej przeze mnie efekt jest taki, że dźwięk się zwyczajnie zapętla na tych kilkuset próbkach, korzystając ciągle z bufora, który nie jest już uzupełniany. A przy wywołaniu udc_stop() jest cisza, dźwięk znika w ogóle, urządzenie jest zupełnie nieresponsywne i restartuje je dopiero watchdog. Trudno mi jest to zdiagnozować, bo zdarza się to dość rzadko, a nie za bardzo też wyobrażam sobie co musiałoby się stać, żeby zatrzymać DMA lub DAC, albo jeszcze inaczej doprowadzić do takiego efektu.
Próbowałem zagłębiać się w to, co się dzieje w wywołaniu ucd_stop ale im dalej w las tym ciemniej i zwyczajnie mnie to przerosło.
Ale jest jeszcze druga opcja:
Która w środku jest jednolinijkową komendą, która w rejestrze USB.CTRLB mikrokontrolera wyłącza podciągnięcie do vcc na pinach d+ u d-. Efekt wydaje się być taki sam (z punktu widzenia aplikacji na PC, która łączy się z urządzeniem), jak po wywołaniu udc_stop oprócz tego, że nie dochodzi do zawieszenia. Zresztą trudno się tutaj tego spodziewać, skoro to tylko zmiana bitu w rejestrze.
Czy są jakieś przeciwwskazania, żeby nie wywoływać udc_stop, a zamiast tego tylko udc_detach? USB nie jest potem ponownie włączane, dopiero po resecie urządzenia.
EDIT: Dodam tylko, że korzystam oczywiście z atmelowej implementacji USB ASF.
chciałbym zapytać jaka jest prawidłowa procedura rozłączenia urządzenia z USB. Sam kontroler aktywuję komendą:
Kod: C / C++
i wszystko ładnie działa, komputer rozpoznaje urządzenie. Problem pojawił się natomiast przy rozłączaniu. Wcześniej się tym nie przejmowałem, bo nie miałem potrzeby wyłączania USB na urządzeniu, ale teraz taka się pojawiła. Naturalnie do tego celu użyłem więc:
Kod: C / C++
wszystko działa okej, urządzenie przestaje być wtedy rozpoznawane przez komputer. Problem polega na tym, że raz na jakiś czas ta funkcja powoduje dziwne zawieszenie procesora. O tyle dziwne, że jednocześnie odtwarzany jest dźwięk podawany na DAC przez DMA z bufora zapełnianego cyklicznie i w przypadku zwyczajnego utknięcia w pętli gdzieś w części programu napisanej przeze mnie efekt jest taki, że dźwięk się zwyczajnie zapętla na tych kilkuset próbkach, korzystając ciągle z bufora, który nie jest już uzupełniany. A przy wywołaniu udc_stop() jest cisza, dźwięk znika w ogóle, urządzenie jest zupełnie nieresponsywne i restartuje je dopiero watchdog. Trudno mi jest to zdiagnozować, bo zdarza się to dość rzadko, a nie za bardzo też wyobrażam sobie co musiałoby się stać, żeby zatrzymać DMA lub DAC, albo jeszcze inaczej doprowadzić do takiego efektu.
Próbowałem zagłębiać się w to, co się dzieje w wywołaniu ucd_stop ale im dalej w las tym ciemniej i zwyczajnie mnie to przerosło.
Ale jest jeszcze druga opcja:
Kod: C / C++
Która w środku jest jednolinijkową komendą, która w rejestrze USB.CTRLB mikrokontrolera wyłącza podciągnięcie do vcc na pinach d+ u d-. Efekt wydaje się być taki sam (z punktu widzenia aplikacji na PC, która łączy się z urządzeniem), jak po wywołaniu udc_stop oprócz tego, że nie dochodzi do zawieszenia. Zresztą trudno się tutaj tego spodziewać, skoro to tylko zmiana bitu w rejestrze.
Czy są jakieś przeciwwskazania, żeby nie wywoływać udc_stop, a zamiast tego tylko udc_detach? USB nie jest potem ponownie włączane, dopiero po resecie urządzenia.
EDIT: Dodam tylko, że korzystam oczywiście z atmelowej implementacji USB ASF.