USB BULK : La mpusbapi.dll de Microchip

 
Siguiendo con esta serie presento USB BULK; para lo cual usamos la mpusbapi.dll
v1.0.0.0 y la v1.1.0.0 de Microchip.

Para el PIC:
Puesto que MikroElectronica no tiene implementadas librerias para USB BULK(esperemos
un poco que seguramente nos dan la sorpresa), usaremos el muy conocido compilador
PICC(compilador para C). el programa es el mismo que usamos con MikroPascal, pero en C.

Asi que tendras que instalar el compilador PICC. Si quieres modificar el programa, para los que aun no han tocado C sera una buena oportunidad para comenzar; el codigo es muy facil de seguir
y muy parecido a pascal.
(para mas detalles sobre las funciones utilizadas refierase a la ayuda de PICC)

En todo caso el .hex lo puedes cargar tal como esta en el PIC para probar que todo el proyecto funciona.

El proyecto para el PIC en PICC consta de 2 unidades USB_BULK.h y USB_BULK.c, el
primero es el descriptor, el otro el programa en si.

observa un poco el descriptor y las notas para que puedas modificarlo a tu gusto.

Observa que las configuraciones para el relog de trabajo en la unidad USB_BULK.c se
tienen que hacer de forma manual, pero si has seguido esta serie, sabras como debemos configurar dependiendo del cristal que usemos.
Código:
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#use delay(clock=48000000)
por ejemplo fijate que PLL1 (refierase a la ayuda de PICC) significa que estamos dividiendo la frecuencia del cristal entre 1, pues en el caso de este projecto se esta usando un cristal de 4MHz, para producir los 96MHz y luego los 48 que necesitamos.
(Ver esquema en USB HID/la mcHID.dll)

Si usas otro cristal por ejemplo uno de 20MHz, tendras que dividir la frecuencia entre 5(PLL5) para tener los 4MHz nesesarios para producir los 96MHz y luego los 48 que necesitamos.

Para la PC :

a)El Driver:
Hacemos uso del driver que nos provee Microchip. Para este ejemplo solo se ha modificado las secciones sobre el PID VID VendorName y ProductName. Tambien estoy incluyendo el driver original sin modificaciones, claro esta que para este ejemplo este ultimo no va a funcionar porque tiene asignados otros PID VID que no estan en el descriptor en el PIC ni en el codigo de Delphi.

Cuando ya tengas grabado el .hex en el PIC y a la hora de conectar el cable se te pedira que instales el driver, elige la carpeta 'MCHPUSB Driver v1.1.0.0' e instalas el driver..... ya esta.


Deberias tener en tu PC la MCHPFSUSB Framework v2.3 de Microchip; aqui tendras muchos ejemplos (USB : hid, mass storage, bulk, cdc(los famosos virtual ports),.etc), herramientas, las dll y driver con sus fuentes originales y mucho mas.
 


 

 






b)Delphi y la mpusbap.dll:
El programa en Delphi hace uso de la mpusbapi.dll. Esta dll en su version 1.0.0.0 como dije antes es un poco limitada. La mpusbapi.dll v1.1.0 agrega las siguientes nuevas funciones: MPUSBGetDeviceDescriptor () , MPUSBGetConfigurationDescriptor(), MPUSBGetStringDescriptor(), y MPUSBSetConfiguration(); de las cuales la mas interesante es la funcion MPUSBGetStringDescriptor(), que nos permite acceder a las cadenas del descriptor como ProducName y VendorName, se ve ahora lo limitada que era la version 1.0.0. ?

Esta dll no nos provee de algun evento para saber cuando el dispositivo USB ha sido insertado o removido asi es que usando el mensaje WM_DEVICECHANGE que Windows nos envia al insertar el dispositivo o removerlo, y verificando por medio del VID y PID que se trata de nuestro dispositivo(al insertar un CD en la lectora tambien se recibe el mismo mensaje por ejemplo), es que podemos saber cuando nuestro dispositivo USB ha sido insertado o removido.

 

 Código Delphi [-]

procedure TForm1.USBEvent(var Msg: TMessage);
var
   Instance  : DWORD;
   s         : String;
begin
  //solo estamos en capacidad de recibir el mensaje WM_DEVICECHANGE,
  //aunque quisieramos recibir tambien DBT_DEVICEARRIVAL = $8000 y
  //DBT_DEVICEREMOVECOMPLETE = $8004
  inherited;
  Instance:=0;
  myOutPipe := MPUSBOpen(Instance, vid_pid, out_pipe, MP_WRITE, 0);
  myInPipe  := MPUSBOpen(Instance,vid_pid, in_pipe,  MP_READ,  0);

  if  (MPUSBGetDeviceCount(vid_pid) <> 0) then
  begin
     EnviarButton.Enabled:=true;
     s:=ProductName+' Insertado  : '+TimeToStr(Now);
  end;

  if  (MPUSBGetDeviceCount(vid_pid) = 0) then
  begin
    If (myOutPipe = INVALID_HANDLE_VALUE) and
       (myInPipe = INVALID_HANDLE_VALUE) then
    Begin
      s := ProductName+' Removido : '+TimeToStr(Now);
      EnviarButton.Enabled:=false;
      myOutPipe := INVALID_HANDLE_VALUE;
      myInPipe := INVALID_HANDLE_VALUE;
    End
    else
    begin
      EnviarButton.Enabled:=true;
      s := ProductName+' Insertado  : '+TimeToStr(Now);
    end;

   end;
   if s <> '' then
      //microchip definio asi la version:
      //#define MPUSBAPI_VERSION    0x00010000L
      Memo2.Lines.Add(s+'    -     mpusbapi.dll v'+
                      IntToHex(MPUSBGetDLLVersion,0));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
   Msg : TMessage;
begin
   myInPipe  := INVALID_HANDLE_VALUE;
   myOutPipe := INVALID_HANDLE_VALUE;
   USBEvent(Msg);
end;

Al importar las funciones de la mpusbapi.dll v1.1.0 se debe tener cuidado en la indexacion de las funciones, sino es asi estas funciones produciran un error al querer llamarlas en tiempo de ejecucion.

Algo rapido:

1. grabar el .hex en el PIC
2. Al conectar el cable te pedira el driver, elije la carpeta 'MCHPUSB Driver v1.1.0.0' e instala el driver.
3. Ejecuta cualquiera de los .exe.

Estoy adjuntando los Help para la dll y las fuentes originales de la dll en C++ Builder, para quien quiera estudiarla un poco.



Project USB BULK con la mpusbapi.dll v1.0.0 y v1.1.0.zip

 

 

Comentarios: 8
  • #8

    fenixariel (jueves, 16 octubre 2014 22:53)

    Hola PepeGrillo, creo puede ser no he verificado, es que las pruebas se hicieron hace tiempo con XP, y en WIN7 la cosa ha cambiado un poquito.....voy a chequear.

  • #7

    PepeGrillo (miércoles, 15 octubre 2014 10:05)

    Me da un problema al intalar el driver. Me dice que se ha encontrado el driver, pero que el hash para el archivo no está en el catálogo especificado. Alguna idea del problema. Saludos y gracias.

  • #6

    fenixariel (sábado, 04 mayo 2013 12:43)

    http://delphiandpic.jimdo.com/delphi-usb-y-herramientas/usb-hid/la-mchid-dll/

  • #5

    Best Juicer (jueves, 02 mayo 2013 21:25)

    I shared this on Myspace! My buddies will really want it!

  • #4

    fenixariel (lunes, 29 octubre 2012 15:33)

    Tienes que escribir un poquito de codigo, no existen librerias para eso.....

  • #3

    Jorge Meza (lunes, 29 octubre 2012 15:14)

    Fenixariel, te agradecería si me puedes indicar con cuál de las librerias puedo determinar que led está encendido con una rutina de delphi por ejemplo.Gracias

  • #2

    fenixariel (miércoles, 24 octubre 2012 23:01)

    (Ver esquema en USB HID/la mcHID.dll)

  • #1

    SoWil (miércoles, 20 junio 2012)

    Esquema para el Reloj de trabajo