Carte Explorer 16 en mode USB host et périphérique USB
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Carte Explorer 16 en mode USB host et périphérique USB



  1. #1
    invitecb573265

    Carte Explorer 16 en mode USB host et périphérique USB


    ------

    Bonjour,

    Je suis sur un projet qui consiste à piloter une carte qui contient le composant CP2102 de chez silabs qui convertit des données USB en UART.

    Lorsque la carte est branchée sur le PC, la communication se fait bien et j'arrive à envoyer des données vers la carte.

    La suite du projet consiste à piloter cette même carte à partir d'une carte explorer 16 Microchip qui possède un PIC24FJ256GB110 (il fait office d'hôte).

    Le problème est que la carte, après configuration des fichiers USBConfig h et c, arrive à se connecter sur l'explorer 16 mais les données sont bloqué dans le composant CP2102. En effet, les données arrives sur les broches D+ et D- mais ne ressortent pas sur les broches TX et RX.

    Je bloque, bloque, bloque,

    Quelqu'un peut-il m'aider?

    merci de vos supports

    -----

  2. #2
    Aurélien

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Salut,
    As tu bien configuré ton host pour qu'il puisse gérer le CP2102 ?
    De plus il ne faut pas envoyer les données simplement, il y a un header à rajouter dans chaque trame, c'est spécifique aux chips de ce type.
    Dans le temps j'avais contacté Silabs qui m'avait fourni leur specs, hélas sous NDA donc je ne peux pas les partager ici. Mais tu peux leur demander, ou bien sinon chercher sur le net des exemples de ce type.

    Aurélien

  3. #3
    RISC

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Salut Guizmail,

    Peux-tu clarifier ce que tu cherches à faire :
    1/ connecter le CP2102 au PIC via l'UART
    2/ connecter le CP2102 au PIC via l'USB

    Si c'est l'option 2 tu peux oublier de suite...car il faudrait écrire un driver USB spécifique au bridge USB-UART
    si le CP2102 te pose un problème utilise le MCP2200 qui est simple à mettre en oeuvre (cas 1/ ci-dessus).
    Pour mettre en oeuvre plus facilement les solutions USB Microchip, des formations sont régulièrement proposées.

    a+

  4. #4
    Aurélien

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Citation Envoyé par RISC Voir le message
    2/ connecter le CP2102 au PIC via l'USB
    Si c'est l'option 2 tu peux oublier de suite...car il faudrait écrire un driver USB spécifique au bridge USB-UART
    Ohh le rabat-joie...
    Si on connait un peu le fonctionnement du driver USB ce n'est pas compliqué de modifier les host requests nécessaires et d'encapsuler les data à envoyer...
    Il faut juste avoir le protocole, et pour cela demander à silabs ou chercher sur le net.
    Ca pour nous vendre du microchip tu es fort, mais s'il doit piloter une carte existante il n'a pas le choix ! En plus tu es de mauvaise foi car il indique bien dans son appli qu'il veut faire du PIC USB Host vers CP2102. Le fait de prendre ton MCP ne ramenera en aucun cas au cas 1/ !

    Aurélien

  5. A voir en vidéo sur Futura
  6. #5
    invitecb573265

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Bonjour à tous,

    Déjà merci de vos réponses rapides.

    Pour répondre à Aurélien, j'ai effectivement contacté Silabs pour leur signaler la situation dans laquelle je suis, il m'ont répondu clairement que le CP2102 ne supporte pas l'environnement CDC (ce que fait Microchip seulement à ce que j'ai compris). Donc du coup je vais devoir m'orienter vers un autre composant que le CP2102. J'ai testé une autre carte un peu dans le même style (avec un composant FT232RQ) et j'arrive à ressortir les data sur la broches TX de ce composant donc je pense m'orienter la-dessus.

    Pour répondre à RISC, je vais regarder le fonctionnement du MCP2200 car il me semble peut-être plus audacieux pour le projet que j'ai à mener (je dois fair des comparaisons avant de choisir).

    Merci beaucoup de vos réponses, je reviens vers vous si j'ai d'autres problèmes.

    Guizmail!

  7. #6
    Aurélien

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Citation Envoyé par guizmail Voir le message
    j'ai effectivement contacté Silabs pour leur signaler la situation dans laquelle je suis, il m'ont répondu clairement que le CP2102 ne supporte pas l'environnement CDC
    Ce n'est qu'une variante, mais ils sont tres bete chez silabs, ils ne comprennent pas qu'en mettant des bâtons dans les roues (j'ai du attendre des semaines avant qu'ils daignent m'envoyer leur spec), les gens fuient leur composant.

    Citation Envoyé par guizmail Voir le message
    (ce que fait Microchip seulement à ce que j'ai compris)
    Il est en effet tres probable que le MCP soit compatible avec la stack fournie par microchip.

    Citation Envoyé par guizmail Voir le message
    Donc du coup je vais devoir m'orienter vers un autre composant que le CP2102.
    Pas vraiment nécessaire, mais comme tu veux.

    Citation Envoyé par guizmail Voir le message
    J'ai testé une autre carte un peu dans le même style (avec un composant FT232RQ) et j'arrive à ressortir les data sur la broches TX de ce composant donc je pense m'orienter la-dessus.
    Pourtant le FTDI souffre du meme probleme que le CP2102 (par contre chez ftdi l'envoi des specs est beaucoup plus rapide).

    Aurélien

  8. #7
    invitecb573265

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Aurélien,

    Ce que tu me dit c'est que le CP2102 peut faire du CDC?

  9. #8
    Aurélien

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Citation Envoyé par guizmail Voir le message
    Aurélien,

    Ce que tu me dit c'est que le CP2102 peut faire du CDC?
    A ce qu'il me semble, le CDC n'est pas une classe supportée par defaut par Windows comme l'est le HID. Il faut des drivers spécifiques, et en général la plupart des fabriquants de transceivers fournissent le leur (ça doit être le cas de microchip aussi) qui est bien spécifique à leur produit, dont certains détails de fonctionnement ne sont pas couvert par la spec CDC d'origine.
    Le CP2102 fait donc un erzatz de CDC, tout comme les FTDI et autres.

    Aurélien

  10. #9
    invitecb573265

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Ok,

    Je pense comprendre.

    Tu as dit que tu as eu les specs de silabs. Est-ce qu'il y a beaucoup de lignes de code à modifier en ce qui concerne le code du host? (c'est pour savoir si c'est rentable au niveau temps, de changer de composant ou de modifier le code en sachant que le host est un PIC24FJ256GB110)

    Merci de ton support.

    Guizmail

  11. #10
    Aurélien

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Ma réponse sera subjective....je travaillais à l'epoque sur un AVR, je connaissais parfaitement la stack USB, donc non ça ne m'a pas pris beaucoup de temps.
    Il n'y a que 3 points à toucher de mémoire :
    - inscrire le PID/VID du composant pour qu'il soit géré par le host
    - créer quelques host requests spécifiques pour paramétrer l'UART et quelques détails spécifiques au CP2102
    - ajouter un ou deux caractères d'encapsulation lorsque tu envoies ou reçois des données

    Ca dépend comment tu es à l'aise avec la stack microchip (et plus généralement l'USB), personnellement je ne l'ai jamais utilisée.

    Mais voici par exemple les host requests à coder :

    Code:
    // Specific requests for CP2102 USB UART Device
    #define     CP_REQUEST_TYPE               0x41
    #define     CP_RESET                      0x11
    #define     CP_IFC_ENABLE                 0x00
    #define     CP_SET_BAUDDIV                0x01
    #define     CP_SET_LINE_CTL               0x03
    
    // Baud rate settings (determined by dividing 3.6864MHz by the desired baud rate value)
    #define     BRD_9600                      0x0180
    #define     BRD_19200                     0x00C0
    
    // Line control settings (must be OR-ed)
    #define     LINE_1_STOP_BIT               0x0000
    #define     LINE_1_5_STOP_BIT             0x0001
    #define     LINE_2_STOP_BIT               0x0002
    
    #define     LINE_PARITY_NONE              0x0000
    #define     LINE_PARITY_ODD               0x0010
    #define     LINE_PARITY_EVEN              0x0020
    #define     LINE_PARITY_MARK              0x0030
    #define     LINE_PARITY_SPACE             0x0040
    
    #define     LINE_DATA_LG_8_BITS           0x0800
    #define     LINE_DATA_LG_7_BITS           0x0700
    #define     LINE_DATA_LG_6_BITS           0x0600
    #define     LINE_DATA_LG_5_BITS           0x0500
    
    // Specific requests for CP2102 USB-UART device
    // ============================================
    #define host_cdc_cp2102_reset()           (usb_request.bmRequestType = CP_REQUEST_TYPE,\
                                               usb_request.bRequest      = CP_RESET,\
                                               usb_request.wValue        = 0,\
                                               usb_request.wIndex        = cdc_interface_comm,\
                                               usb_request.wLength       = 0,\
                                               usb_request.uncomplete_read = FALSE,\
                                               host_send_control(data_stage))
    
    #define host_cdc_cp2102_enable()          (usb_request.bmRequestType = CP_REQUEST_TYPE,\
                                               usb_request.bRequest      = CP_IFC_ENABLE,\
                                               usb_request.wValue        = 1,\
                                               usb_request.wIndex        = cdc_interface_comm,\
                                               usb_request.wLength       = 0,\
                                               usb_request.uncomplete_read = FALSE,\
                                               host_send_control(data_stage))
    
    #define host_cdc_cp2102_disable()         (usb_request.bmRequestType = CP_REQUEST_TYPE,\
                                               usb_request.bRequest      = CP_IFC_ENABLE,\
                                               usb_request.wValue        = 0,\
                                               usb_request.wIndex        = cdc_interface_comm,\
                                               usb_request.wLength       = 0,\
                                               usb_request.uncomplete_read = FALSE,\
                                               host_send_control(data_stage))
    
    #define host_cdc_cp2102_baudrate(brd)     (usb_request.bmRequestType = CP_REQUEST_TYPE,\
                                               usb_request.bRequest      = CP_SET_BAUDDIV,\
                                               usb_request.wValue        = brd,\
                                               usb_request.wIndex        = cdc_interface_comm,\
                                               usb_request.wLength       = 0,\
                                               usb_request.uncomplete_read = FALSE,\
                                               host_send_control(data_stage))
    
    #define host_cdc_cp2102_line_ctl(lctl)    (usb_request.bmRequestType = CP_REQUEST_TYPE,\
                                               usb_request.bRequest      = CP_SET_LINE_CTL,\
                                               usb_request.wValue        = lctl,\
                                               usb_request.wIndex        = cdc_interface_comm,\
                                               usb_request.wLength       = 0,\
                                               usb_request.uncomplete_read = FALSE,\
                                               host_send_control(data_stage))
    Et côté applicatif, la seule chose à faire juste apres l'énumération :
    Code:
                   //-----------------------------------------------------
                   if ((Get_class(i)==0xFF) && (Get_protocol(i)==0x00))
                   {
                     tempvar = host_cdc_cp2102_reset();
                     tempvar = host_cdc_cp2102_baudrate(BRD_19200);
                     tempvar = host_cdc_cp2102_line_ctl(LINE_1_STOP_BIT | LINE_PARITY_NONE | LINE_DATA_LG_8_BITS);
                     tempvar = host_cdc_cp2102_enable();
                   }
                   //-----------------------------------------------------
                   Host_select_pipe(PIPE_CDC_DATA_IN);
                   Host_continuous_in_mode();
    Je n'ai pas retrouvé dans mon code (rapidemment lu certes) l'encapsulation des données, peut etre que cela ne concerne que les chips FTDI finalement.

    Aurélien

  12. #11
    invitecb573265

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Aurélien,

    Merci pour ces informations. Cependant, la connexion avec le composant CP2102 se fait très bien.

    Ce qu'il me manquerai finalement c'est les data d'encapsulation

    Pour le composant FTDI ca semble fonctionner correctement. chose étrange que j'ai oublié de préciser, le CP2102 est censé faire du 2.0 quand j'utilise USBlyser qui est logiciel qui pemet de décrire l'activité du bus USB ainsi que ca configuration, il m'indique qu'il est en 1.1...

    Serait-ce aussi une piste?

    merci,

    Guizmail

  13. #12
    Aurélien

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Citation Envoyé par guizmail Voir le message
    Merci pour ces informations. Cependant, la connexion avec le composant CP2102 se fait très bien.
    Sur quoi te bases tu pour dire ça ?
    La connexion se fait tres bien si on n'envoie pas les host requests spécifique, par contre si tu veux faire vraiment fonctionner ton composant, il faut au moins les lui envoyer (surtout la partie enable par exemple !).

    Citation Envoyé par guizmail Voir le message
    Ce qu'il me manquerai finalement c'est les data d'encapsulation
    Si tu envoies des données sur l'UART du CP2102, est ce que tu les reçois sur l'USB ? Si oui, comment est l'encapsulation ? Si non, le chip n'est pas activé.

    Aurélien

  14. #13
    invitecb573265

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Aurélien,

    Merci pour ta réponse.

    En effet, le CP2102 n'est pas activé car rien ne se passe dans les deux sens de communication.

    Je connais très peu la stack USB. J'ai essayé de prendre des parties du code que tu as envoyé, mais je ne sais pas et ne trouve pas la fonction qui permet de transférer les infos (reset, enable, etc) au CP2102. J'ai beau chercher, je ne sais pas qu'elle est cette fonction.

    Je bloque sur ce point

    Je sens que c'est ça mon problème pour ce projet.

    Si quelqu'un qui connait bien la stack USB de microchip, peut-il me dire qu'elle est cette fonction?

    Merci

    Guizmail

  15. #14
    invitecb573265

    Cool Re : Carte Explorer 16 en mode USB host et périphérique USB

    Re-Bonjour,

    J'ai finalement trouvé la fonction qui permet de transferer les infos (BYTE USBHostIssueDeviceRequest( BYTE deviceAddress, BYTE bmRequestType, BYTE bRequest,WORD wValue, WORD wIndex, WORD wLength, BYTE *data, BYTE dataDirection,BYTE clientDriverID ).

    maintenant le CP2102 recoit et envoi des data du host vers le device et inversement.

    Aurélien, merci beaucoup pour ton aide.

    A bientôt

    guizmail

  16. #15
    Aurélien

    Re : Carte Explorer 16 en mode USB host et périphérique USB

    Cool tant mieux !

Discussions similaires

  1. Tuto montage USB HOST
    Par elbart dans le forum Électronique
    Réponses: 8
    Dernier message: 26/07/2012, 22h08
  2. Utilisation Host USB VNC1L
    Par invite9019a3bb dans le forum Électronique
    Réponses: 1
    Dernier message: 18/12/2008, 18h33
  3. Recherche PDA (récent) USB host
    Par marmotte dans le forum Matériel - Hardware
    Réponses: 0
    Dernier message: 03/09/2008, 15h58
  4. USB OnTheGo, Host et Device...
    Par marmotte dans le forum Électronique
    Réponses: 2
    Dernier message: 29/08/2008, 22h46
  5. Usb Host et device interface
    Par invite79116907 dans le forum Électronique
    Réponses: 14
    Dernier message: 10/03/2008, 10h23
Découvrez nos comparatifs produits sur l'informatique et les technologies.