Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

USB MSD avec PIC24FJ (résolu)
pucpood
Débutant
Débutant
Messages : 36
Âge : 53
Enregistré en : septembre 2023
Localisation : 01960

#1 Message par pucpood » mer. 29 oct. 2025 14:44

Bonjour,

Je traîne un problème de liaison USB depuis plusieurs années et là j'arrive au pied du mur.

Mon but :
Que ma plateforme PIC soit vue comme un device USB de type MSD (mass storage device).

Matériellement :
Plateforme PIC24FJ1024GB610 accueillant aussi une carte SD qui communique avec le PIC via SPI. Programmateur PICKit5.

Logiciellement :
XC16 sous Windows et librairie MLA, environnement MPLabX.

Ce qui fonctionne : ma plateforme tire correctement parti de la carte SD, formatée en FAT. Je peux créer, lire, effacer des fichiers, tout va bien de ce côté. Donc c'est OK du point de vue carte SD et SPI.

Ce qui ne va pas : Windows ne parvient pas à prendre en compte ma plateforme. Au mieux, il voit qu'un périphérique tente de se connecter mais signale que celui n'est pas configuré correctement. Et je pense qu'à ce moment, Windows est encore loin de vouloir accéder au système de fichier de ma plateforme.

Le problème est sans doute en amont, purement USB, mais j'ai essayé tellement de réglages et la librairie est tellement fournie que je ne sais plus par où prendre le problème. Et personne d'autre que moi ne maîtrise le sujet au boulot, je suis seul en bas niveau :cry: .

Le process de connexion s'arrête lors du tests if( USBDeviceState < DEFAULT_STATE) (usb_device.c, fonction USBDeviceTasks()). Il faudrait avoir atteint ce DEFAULT_STATE pour aller plus loin, mais ce n'est jamais mon cas.
J'ai essayé en polling et par interruptions : les 2 cas échouent.

Voilà, si l'un ou l'une d'entre vous avait une expérience à partager ça pourrait m'ouvrir des horizons.

À bientôt :-) !
Modifié en dernier par pucpood le mer. 10 déc. 2025 15:40, modifié 1 fois.

USB MSD avec PIC24FJ
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2886
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » dim. 9 nov. 2025 21:02

Bonjour,

Normalement c'est une USB Hid ou Microchip fourni gratuitement un fichier à installer dans le gestionnaire de périphériques mais à faible vitesse

Je me rapelle plus du non du fichier, surement dû à l'age :-D

Si tu veux une USB plus rapide il faut payer :sad: c'est bien pour ça qu'il serait judicieux de se rabatre sur des circuits qui gére l'usb comme un circuit FT232RL ou tu peux communiquer USB (PC) ===> USART (Pic)

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

USB MSD avec PIC24FJ
pucpood
Débutant
Débutant
Messages : 36
Âge : 53
Enregistré en : septembre 2023
Localisation : 01960

#3 Message par pucpood » mer. 10 déc. 2025 15:36

Merci (tardif) pour ta réponse Temps-X. En plus tu me rappelles cette émission que je regardais gamin avec mon père :wink: !

Perso c'est l'USB MSD qui m'intéresse. La librairie Microchip MLA fournit les éléments nécessaires pour fonctionner dans ce mode, et je savais que ça pouvait fonctionner car je l'ai déjà fait avec la V1 de mon prototype.

En fait, depuis mon précédent post j'ai réussi à rétablir un fonctionnement correct. Il est vrai qu'on est peut-être un peu "slow", ce qui semblerait te donner raison quant à la "faible vitesse". Si j'ai du temps tuer j'essayerai de pousser plus loin l'analyse de cette librairie pour l'améliorer (?). Après tout c'est tout des sources en C et le PIC aussi bien que la librairie sont bien documentés.

Pour ceux que ça pourrait intéresser, voici ce que j'ai appliqué comme réglages à ma librairie USB dans sa version MSD :

Déjà, je ne m'embête pas avec du POLLING, je suis passé en INTERRUPT :
#define INTERRUPT // dans usb_config.h - Bien veiller à ce que USB_POLLING ne soit pas déclaré, car rien ne l'empêche.

Ensuite, après discussion avec notre électronicien, il me confirme que jamais on ne sollicite de puissance auprès du bus USB, on est donc en mode SELF POWERED :
#define self_power 1 // dans usb_config.h sinon elle sera définie par défaut à 0, ce qui correspond à "bus powered".

USB_BUS_SENSE_IO : non défini, ça implique que USB_BUS_SENSE va être forcé à 1. // Là je ne maîtrise pas le sujet mais en INTERRUPT ça semble inutile, donc laissé tel quel. Ce sont USBDeviceAttach() et USBDeviceDetach() qui vont gérer les aspects liés.

Il est impératif de solliciter MSDTasks() souvent sous peine de se faire jeter par l'hôte assez rapidement.
Voici le bloc de code que j'exécute à chaque tour de la boucle principale :

Code : Tout sélectionner


    if
( ( USBGetDeviceState() == DETACHED_STATE ) && ( USB_VBUS_Powered() ) )
        return false;
    
    
/* If the USB device isn't configured yet, we can't really do anything
       else since we don't have a host to talk to.  So jump back to the
       top of the while loop.                                                                     */
    if( USBGetDeviceState() < CONFIGURED_STATE ) // c'est le state le plus haut
        return false;

    else
    
{
        /* If we are currently suspended, then we need to see if we need to
           issue a remote wakeup.  In either case, we shouldn't process any
           keyboard commands since we aren't currently communicating to the host
           thus just continue back to the start of the while loop.                             */
        if( USBIsDeviceSuspended() == true )
            return false;
    }
    
    switch
( MSDTasks() ) // exploitation du retour pas obligatoire, mais ça peut servir
    {
        case MSD_WAIT :
            break;
        case MSD_DATA_IN :  // vers l'hôte
            break;
        case MSD_DATA_OUT : // vers le device
            break;
        case MSD_SEND_CSW : // correspond à la fin de la transaction initiale
            break;
        default :
            // normalement ce n'est pas possible
            return false;
    }
    
    return true
;


et là ça fonctionne nickel, juste Windows met 7 ou 8 secondes à donner la main sur le système de fichier du périphérique, sinon tout fonctionne.

Au plaisir !

Laurent


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité