HOME  
 
 Home     Projects     Micro     Tools     Delphi     Developer     Site map
Delphi index
 




Translate Microchip C++ USB example to Delphi

The example in this page not test.


Config Constant and Type
Const
   MAXSIZE=64;
   MPUSB_FAIL=0;
   MPUSB_SUCCESS=1;
   MP_WRITE:DWORD=0;
   MP_READ:DWORD=1;
   MAX_NUM_MPUSB_DEV=127;
   READ_VERSION    = $00;
   READ_FLASH      = $01;
   WRITE_FLASH     = $02;
   ERASE_FLASH     = $03;
   READ_EEDATA     = $04;
   WRITE_EEDATA    = $05;
   READ_CONFIG     = $06;
   WRITE_CONFIG    = $07;
   UPDATE_LED      = $32;
   RESET_DEVICE    = $FF;

type
  DWORD = LongInt;
  PCHAR8 =  array[0..MAXSIZE] of char;
  PBYTE = array[0..MAXSIZE] of BYTE;
  PDWORD =  array[0..MAXSIZE] of DWORD;
  PVOID = Pointer;
  UINT = Cardinal;


var
  vid_pid:PCHAR8='vid_04d8&pid_000b';
  out_pipe:PCHAR8='\MCHP_EP1';
  in_pipe:PCHAR8='\MCHP_EP1';  
  myOutPipe:THANDLE; 
  myInPipe:THANDLE;  
  isConnected:boolean;

Loading MPUSBAPI.DLL
function _MPUSBGetDLLVersion():DWORD; 
             stdcall;external 'mpusbapi.dll';
function _MPUSBGetDeviceCount(pVID_PID:PCHAR8):DWORD; 
             stdcall;external 'mpusbapi.dll';
function _MPUSBOpen(instance:DWORD;pVID_PID:PCHAR8;
             pEP:PCHAR8;dwDir:DWORD;dwReserved:DWORD):
             THANDLE;stdcall;external 'mpusbapi.dll';
function _MPUSBClose(handle:THANDLE):DWORD; 
             stdcall;external 'mpusbapi.dll';
function _MPUSBRead(handle:THANDLE;var pData:PBYTE;
             dwLen:DWORD;var pLength:DWORD;
             dwMilliseconds:DWORD):DWORD;stdcall;
             external 'mpusbapi.dll';
function _MPUSBReadInt(handle:THANDLE;
             var pData:PBYTE;dwLen:DWORD;
             var pLength:PDWORD;
             dwMilliseconds:DWORD):DWORD; 
             stdcall;external 'mpusbapi.dll';
function _MPUSBWrite(handle:THANDLE;pData:PBYTE;
             dwLen:DWORD;
             var pLength:DWORD;
             dwMilliseconds:DWORD):DWORD; 
             stdcall;external 'mpusbapi.dll';


 
procedure CheckInvalidHandle();
begin
  if(GetLastError=ERROR_INVALID_HANDLE) then
  begin
        _MPUSBClose(myOutPipe);
        _MPUSBClose(myInPipe);

        myInPipe:=INVALID_HANDLE_VALUE;
        myOutPipe:=INVALID_HANDLE_VALUE;
  end
  else
    ShowMessage('Error Code :'+inttostr(GetLastError()));
end;

function SendReceivePacket(SendData:PBYTE;SendLength:DWORD;var ReceiveData:PBYTE;
var ReceiveLength:DWORD;SendDelay:UINT;ReceiveDelay:UINT):DWORD; stdcall;
var
  SentDataLength:DWORD ;
  ExpectedReceiveLength:DWORD;
begin
 ExpectedReceiveLength:= ReceiveLength;
 if((myOutPipe <> INVALID_HANDLE_VALUE) and (myInPipe <> INVALID_HANDLE_VALUE)) then
   begin
    if(_MPUSBWrite(myOutPipe,SendData,SendLength,SentDataLength,SendDelay)<>0) then
     if(_MPUSBRead(myInPipe,ReceiveData,ExpectedReceiveLength,ReceiveLength,ReceiveDelay)<>0) then
       begin
       if(ReceiveLength = ExpectedReceiveLength) then
        begin
         Result:=1; // Success
         exit;
        end
       else
        if(ReceiveLength < ExpectedReceiveLength) then
         begin
           Result:=2; // incorrect receive length
           exit;
         end
        end
     else
      CheckInvalidHandle()
    else
      CheckInvalidHandle()
   end
 else
   begin
     Result:=0; // Failed
   end;
end;


Example :
procedure TForm1.Button1Click(Sender: TObject);
var
   selection:DWORD;
   send_buf:PBYTE;
   receive_buf:PBYTE;
   RecvLength:DWORD;
   CurrentCMD:BYTE;
begin          // Read Firmware version
  selection:=0;
  if (_MPUSBGetDeviceCount(vid_pid)=0) then
  begin
    Memo1.lines.add('- Device not connected');
    exit;
  end;


  myOutPipe:= _MPUSBOpen(selection,vid_pid,out_pipe,MP_WRITE,0);
  myInPipe:= _MPUSBOpen(selection,vid_pid,out_pipe,MP_READ,0);

  if ((myOutPipe = INVALID_HANDLE_VALUE) or (myInPipe = INVALID_HANDLE_VALUE)) then
  begin
   showmessage('USB Error');
   exit;
  end;

  send_buf[0]:=READ_VERSION;

  RecvLength:=4;
  if(SendReceivePacket(send_buf,1,receive_buf,RecvLength,100,100) = 1) then
  begin
   if(receive_buf[0] =  READ_VERSION) then
   begin
     showmessage('Firmware version : '+ IntToStr(receive_buf[3])+'.'+IntToStr(receive_buf[2]));
   end;
  end
  else
  begin
     showmessage('USB Error');
  end;

  _MPUSBClose(myOutPipe);
  _MPUSBClose(myInPipe);
  myInPipe:= INVALID_HANDLE_VALUE;
  myOutPipe:=INVALID_HANDLE_VALUE;
end;
Copyright(c) 2005-2010 sixca.com, All rights reserved.
Best view @ 800X600, IE 6.0 up Terms Privacy