 |
|
|
|
|
|
|
 |
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
|
|
|