Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
USB CDC
17-02-2015, 11:10 AM,
#1
USB CDC
Bonjour,

J'aimerais savoir si on peut écrire un programme qui communique par l'USB avec une machine hôte en émulation port série mais qui puisse également fonctionner quand l'Hôte est absent.
Bref est il possible en cours de programme de démarrer l'émulation port série puis de la stopper ?
Cordialement,

Xavier
Reply
19-02-2015, 09:45 AM,
#2
RE: USB CDC
Salut Xavier,
En fait tu voudrais pouvoir détecter s'il y a communication USB ou non, donc si le cable USB est connecté ou non, c'est ça ?
En 32-bit tu peux essayer les fonctions (cf. __cdc.c) :

        CDCUSBIsConnected() et/ou CDCDTRIsReady()

J'ai aussi déjà utilisé ceci :

        if (U1OTGIE & _U1OTGIE_SESVDIE_MASK)

        {
            // SESVD is detected as 1 when USB cable has been plugged
            if (U1OTGIR & _U1OTGIR_SESVDIF_MASK)
                SerialPrint(UART1,"USB CABLE PLUGGED\r\n");
            else
                SerialPrint(UART1,"USB CABLE PLUGGED\r\n");
         }

Il te faudra au préalable autoriser l'interruption avec :
         U1OTGIE |= _U1OTGIE_SESVDIE_MASK;

S'il s'agit des 8-bit, alors tu as le choix entre monitorer VBUS sur une pin pour voir s'il y a 5V (donc présence d'un cable USB) ou (solution utilisée par le bootloader) faire une boucle du genre :

        u32 usb_counter = 0;

        do

        {
            EnableUSBModule();
            ProcessUSBTransactions();
 
            if (usb_counter == 0xFFFFF)
            {
                // Pas d'activité USB
                // On saute vers le reste du programme
            }
            usb_counter++;
        }
        while (deviceState != CONFIGURED);
It is easier to complain than it is to do, but it is better to do than it is to complain.
Reply
19-02-2015, 11:13 AM, (This post was last modified: 19-02-2015, 11:16 AM by xapon66.)
#3
RE: USB CDC
Bonjour Régis,

En fait, je voudrais réaliser un petit automate industriel, probablement à partir d'un 45K50. L'automate doit être autonome mais pouvoir communiquer occasionnellement avec un PC hôte en mode émulation de port série.

Le problème que j'ai rencontré est que dès qu'une commande de type CDC.<cmd> est présente dans le code, le PIC essaie d'initialiser le mode CDC au démarrage et reste bloqué si l'Hôte n'est pas présent.
Je voulais donc savoir s'il est possible de contourner le problème.

Je n'ai pas besoin de détecter si un câble USB est connecté, car c'est l'opérateur qui active la connexion. S'il n'a pas branché son PC avant, tant pis pour lui ...

Au fait, la 47j53 n'est plus disponible ?
Reply
19-02-2015, 03:37 PM,
#4
RE: USB CDC
Tu peux tester les pins RC5 et RC6 qui correspondent à D+ et D-.
Je me disais que si tu désactive l'USB :
UCON=0;
et que tu mets les pins RC5 et RC6 en INPUT sur ton 45K50 :
TRISCbits.TRISC5 = INPUT;
TRISCbits.TRISC6 = INPUT;
Tu dois pouvoir lire les pins avec :
PORTCbits.RC5
PORTCbits.RC6
et voir s'il y a de l'activité.
Tu créé un booléen,  s'il est true tu executes les fonctions CDC sinon tu les passes.
Le meiux serait de modifier les fichiers CDC avec cela mais je pars en vacances alors je te laisse tester d'abord ;-)

PS : tous les 47J53 ont été vendus.
It is easier to complain than it is to do, but it is better to do than it is to complain.
Reply
20-02-2015, 11:26 AM,
#5
RE: USB CDC
Bonne vacances
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)