Présentation

Le port USB a pris un essor considérable avec la disparition progressive du port série asynchrone RS232. Cette page présente le développement d'applicatif permettant de gérer en mode HID le port USB entre un applicatif windows et une carte embarquée à base de microncontrôleur PIC18F4550

Outils nécessaires

Kit de développement windows (DDK) pour le développement de la DLL (noyau 32bits)

Microsoft Visual studio pour la compilation de la DLL

Borland C++ pour le développement de l'applicatif sous la plateforme Windows

Le compilateur CCS PIC18F pour l'applicatif du PIC18F4550

Développement de l'applicatif sous Borland C++

Ils existent 3 fonctions précompilées dans le fichier hiddllR.lib :

bool Initialize();// initialisation des tubes vers la terminaison EP1
int write(unsigned char buffer[64]); // emission dans le tube (terminaison EP1) de 64 Octets
unsigned char* read();// réception de 64 octets attention à l'allocation dynamique.

Inclure la librairie dans le projet hiddllR.lib et la DLL hiddllR.dll avec l'executable

Sous Borland C++ declarez les 3 fonctions externes:

extern "C" __declspec(dllimport) bool __stdcall Initialize();
extern "C" __declspec(dllimport) int __stdcall write(unsigned char buffer[64]);
extern "C" __declspec(dllimport) unsigned char* __stdcall read();

Dans le constructeur de l'objet Form1 de la classe TForm1

iRet = Initialize(); // initialisation des tubes

Dans les différentes méthodes de la classe Tform1 faire appel aux méthodes de lecture écriture

tamponout[0]=0x00; //non envoye attention au Report ID bit 8 a 0
tamponout[1]=0x00; // premier octet envoye
tamponout[2]=0x01; // demande lecture ID device
//Label1->Caption="c'est prêt";
write(tamponout); //Label1->Caption="ecriture realise";

unsigned char *p= (unsigned char*) malloc(64);

p=read();// réception des octets

Développement de l'applicatif sous le compilateur CCS PIC18F4550

Dans la fonction Main faites appels aux fonctions de haut niveau de CCS pour l'USB:

usb_init();
usb_task();
usb_wait_for_enumeration();
while (TRUE)
{
if (usb_enumerated())
{
if(usb_kbhit(1)){
usb_get_packet(1, in_data, 64); // Réception du paquet des 64 octets à partir de la terminaison EP 1

usb_put_packet(1, out_data, 64, USB_DTS_TOGGLE);// émission des 64 octets vers EP1

Bien compléter le fichier usb_desc_hid.h notamment le VID et le PID:

0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??) VID
0x20,0x00, //product id ==11,12 //don't use ffff says usb-by-example guy. oops PID

Le VID et le PID sont codés dans le fichier hiddllR.dll

Les fichiers

La DLL La librairie Fichier de simulation sous Proteus