MPUSBAPI--USB上位机驱动库函数简介

来源:互联网 发布:红外网络摄像机怎么用 编辑:程序博客网 时间:2024/04/27 11:03

来源:http://www.garcia-cuervo.net/picmania.garcia-cuervo.net/USB_MPUSBAPI_DLL.php

 

译者按:

最近从事硬件驱动方面的研究,正在学习写一个电机驱动的程序,接触到一些上位机、USB驱动方面的知识。在网上的资料中,对于USB上位机的驱动程序,用得比较多的是Microchip公司的PIC18F4550芯片的驱动库mpusbapi.dll

 

MPUSBAPI链接库

MPUSBAPI库是一个适用于PIC18F4550设备的usb驱动程序的用户接口。

 

定义

有以下几种定义标记:

MPUSB_FAIL = 0

MPUSB_SUCCESS = 1

MP_WRITE = 0

MP_READ = 1

MAX_NUM_MPUSB_DEV = 127

 

函数

以下的信息是从本人电脑的文件中原封不动的摘取的:

C:/MCPFSUSB/Pc/Mpusbapi/Dll/Borland_C/Source/_mpusbapi.cpp

下载地址:

http://www.hep.princeton.edu/~tziegler/electronics/microchip/_mpusbapi.cpp

1.       DWORD *MPUSBGetDLLVersion(void)

该函数获取MPUSBAPI.DLL的版本信息。这是一个32位的级别为MMMMmmmm的修正版本。该函数只返回软件代码的版本,对驱动程序并无多大意义。

2.       DWORD *MPUSBGetDeviceCount(PCHAR pVID_PID )

该函数返回版本号(Version ID)和产品号(Product ID)相匹配的设备号码。输入PCHAR类型的变量Pvid_PID

3.       HANDLE *MPUSBOpen(instance, pVID_PID, pEP, dwDir, dwReserved )

该函数返回版本号与产品号相匹配的终点管道(endpoint pipe)的句柄。所有管道都具有FILE_FLAG_OVERLAPPED属性。这样的设置将使得函数MPUSBReadMPUSBWriteMPUSBReadInt函数具有一个暂停值。

注:暂停值对于同步管道而言,没有任何意义。

输入参数见下表:

DWORD instance

输入

要打开的设备的实例号,更多的细节参见_mpusbapi.cpp

PCHAR Pvid_PID

输入

包含有目标设备的PIDVID的字符串。其格式为“vid_xxxx&pid_yyyy”,其中xxxxVID的十六进制的值,yyyyPID的十六进制的值。

PCHAR pEP

输入

对于要打开的终端目标的终端号号码。格式为//MCHP_EPz,其中z是十进制的终端号码。例如“//MCHP_EP1

DWORD

列表

指明终端的路径,用MP_READ代替MPUSBReadMPUSBReadInt,用MP_WRITE代替MPUSBWrite

DWORD

保留字节

 

 

4.       DWORD *MPUSBRead(handle, pData, dwLen, pLength, dwMilliseconds )

该函数的参数如下表所示:

HANDLE handle

输入

识别将要读取的终端管道,管道句柄必须具有MP_READ的属性

PVOID pData

输出

指向接收管道数据缓冲区的指针

DWORD dwLen

输入

指定从管道中读入的字节的长度

PDWORD pLenght

输出

指向字节长度的指针,在进行错误检查之前,MPUSBread函数将该值赋为0

DWORD dwMilliseconds

输入

指定暂停间隔,单位为毫秒。如果间隔过去,即使是操作不完整,该函数也有返回值,如果参数dwMilliseconds是无限的,那么暂停间隔将永不消失。

 

5.       DWORD *MPUSBWrite(handle, pData, dwLen, pLength, dwMilliseconds )

HANDLE handle

输入

识别将要写入的终端管道。管道句柄必须具有MP_WRITE的属性。

PVOID pData

输入

指向写入管道数据缓冲区的指针

DWORD dwLen

输入

指定写入管道数据的字节长度

PDWORD pLength

输出

指向写入字节长度的指针。在进行错误检查之前,MPUSBWrite函数将该值设置为0

DWORD dwMilliseconds

输入

指定暂停间隔,单位为毫秒。如果间隔过去,即使是操作不完整,该函数也有返回值,如果参数dwMilliseconds是无限的,那么暂停间隔将永不消失。

 

6.       DWORD *MPUSBReadInt(handle, pData, dwLen, pLength, dwMilliseconds )

HANDLE handle

输入

识别将要读入的终端管道。管道句柄必须具有MP_READ的属性。

PVOID pData

输出

指向接收管道数据的缓冲区的指针。

DWORD dwLen

输入

指定从管道中读取的字节长度。

PDWORD pLength

pLength

指向读入字节的长度的指针。在进行错误检查之前,MPUSBRead函数将该值设置为0

DWORD

dwMilliseconds

指定暂停间隔,单位为毫秒。如果间隔过去,即使是操作不完整,该函数也有返回值,如果参数dwMilliseconds是无限的,那么暂停间隔将永不消失。

 

7.       BOOL *MPUSBClose(handle)

关闭一个已经给出的句柄

 

转让类型用法的总结

转变类型                                                函数                          是否能中止连接

中断输入(Interrupt-IN)         MPUSBRead/MPUSBReadInt                  

中断输出(Interrupt-OUT)                   MPUSBWrite                              

批量输入(Bulk-IN)                           MPUSBRead                                

批量输出(Bulk-OUT)                       MPUSBWrite                               

同步输入(Isochronous-IN)                MPUSBRead                                

同步输出(Isochronous-OUT)            MPUSBWrite                                

 

以下内容非翻译:

实例

下面这段代码驱动电机的旋转:

DWORD selection = 0;

fflush(stdin);

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 || myInPipe == INVALID_HANDLE_VALUE)

{

printf("Failed to open data pipes./r/n");

        return;

 }//end if

UpdateData(TRUE);

BYTE send_buf[6],receive_buf[6];

memset(send_buf, 0, 6*sizeof(BYTE));

memset(receive_buf, 0, 6*sizeof(BYTE));

DWORD RecvLength=m_dwRecvLength;

#define READ_VERSION    0x33

    send_buf[0] = 0x43;      // Command

       send_buf[1] = 0x01;

if (SendReceivePacket(send_buf,6,receive_buf,&RecvLength,1000,1000) == 1)

{

              ;

}

 

// Let's close the data pipes since we have nothing left to do..

MPUSBClose(myOutPipe);

MPUSBClose(myInPipe);

myOutPipe = myInPipe = INVALID_HANDLE_VALUE;

UpdateData(FALSE);

 

下面这段代码使电机停止转动:

DWORD selection = 0;

fflush(stdin);

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 || myInPipe == INVALID_HANDLE_VALUE)

{

    printf("Failed to open data pipes./r/n");

    return;

}//end if

UpdateData(TRUE);

BYTE send_buf[6],receive_buf[6];

memset(send_buf, 0, 6*sizeof(BYTE));

memset(receive_buf, 0, 6*sizeof(BYTE));

DWORD RecvLength=m_dwRecvLength;

#define READ_VERSION    0x33

    send_buf[0] = 0x34;      // Command

       send_buf[1] = 0x0;

if (SendReceivePacket(send_buf,6,receive_buf,&RecvLength,1000,1000) == 1)

{

       ;

}

// Let's close the data pipes since we have nothing left to do..

  MPUSBClose(myOutPipe);

  MPUSBClose(myInPipe);

  myOutPipe = myInPipe = INVALID_HANDLE_VALUE;

UpdateData(FALSE);