kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2841回复:15

USB应用程序求救!怎么和固件配合不起来啊,一定给分

楼主#
更多 发布于:2004-06-29 17:43
用CYPRESS的控制面板就可以和自己写的固件程序配合起来,但自己写的应用程序和自己的固件配合不起来,这是怎么回事啊?我想用端点0传输数据(只想传输一两个数据),写了三个函数试了之后,都不行,郁闷啊!!!
第一个函数:
BOOL  writedata( BYTE  data)
{
    BOOL                                    Success ;
    VENDOR_OR_CLASS_REQUEST_CONTROL         VR;
    unsigned long                           nBytes;

    if (hDevice != INVALID_HANDLE_VALUE )
    {
      VR.direction = 0;
      VR.requestType = 2;
      VR.recepient = 0;
      VR.request = VR_WRITEDATA;
      VR.requestTypeReservedBits = 0;
      VR.value = data;

      Success = DeviceIoControl (hDevice,
                    IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST,
                    &VR,
                    sizeof(VENDOR_OR_CLASS_REQUEST_CONTROL),
                    NULL,
                    0,
                    &nBytes,
                    NULL);
    }

    return Success;
}

第二个函数是:
BOOL     WRITEDATA( )
{
   BOOL                                    Success ;
   VENDOR_REQUEST_IN                       VR;
   unsigned long                           nBytes;

  if (hDevice != INVALID_HANDLE_VALUE )
  {
      VR.direction =0X00 ;
 VR.bRequest=0xb6;
 VR.wLength=0x00;
 VR.wValue=0x5555;
 VR.wIndex=0x0000;
            Success = DeviceIoControl (hDevice,
                   IOCTL_Ezusb_VENDOR_REQUEST ,
                    &VR,
                  sizeof(VENDOR_REQUEST_IN),
                NULL,
                  0,
                &nBytes,
                   NULL);
  }

 return Success;
}

第三个函数是:
BOOL  writedata( BYTE  data)
{
    BOOL                                    Success ;
    VENDOR_OR_CLASS_REQUEST_CONTROL         VR;
    unsigned long                           nBytes;

    if (hDevice != INVALID_HANDLE_VALUE )
    {
      VR.direction = 0;
      VR.requestType = 2;
      VR.recepient = 0;
      VR.request = VR_WRITEDATA;
      VR.requestTypeReservedBits = 0;


      Success = DeviceIoControl (hDevice,
                    IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST,
                    &VR,
                    sizeof(VENDOR_OR_CLASS_REQUEST_CONTROL),
                   &data,
                    1,
                    &nBytes,
                    NULL);
    }

    return Success;
}
望高人指点啊!!

最新喜欢:

lhaihlhaih
kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-29 17:45
救命啊!
flyhye
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2012-01-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-29 18:56
先用bushound查看你发的数据下去了没
或者直接用bushound向端点0发厂商请求看看USB底层有什么返回先
千载奇逢,无如好书良友 一生清福,只在碗茗炉烟
kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-30 10:02
分我给过了,我再试试!
kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-30 15:11
我顶!!
flyhye
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2012-01-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-30 19:37
先用bushound查看你发的数据下去了没
或者直接用bushound向端点0发厂商请求看看USB底层有什么返回先

不行吗?先说说试过后的现象吧
千载奇逢,无如好书良友 一生清福,只在碗茗炉烟
kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-30 21:47
还是不行啊?
kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-01 10:53
我再顶!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-01 15:29
你光顶有什么用?把下面这段代码加到deviceiocontrol函数后面,看看有什么现象
LPVOID lpMsgBuf;
FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL
);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
AfxMessageBox((LPCTSTR)lpMsgBuf,MB_OK | B_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-01 16:04
任兄,我都快崩溃了,导师这两天出差,一旦他回来。。。。。。。。我死定了!!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-01 16:58
你按下面的程序试一试,前提是你必须能正确打开设备并获得句柄!

应用程序中:
VENDOR_REQUEST_IN MyRequest;
HANDLE hDevice = INVALID_HANDLE_VALUE;
ULONG nBytes = 0;
UCHAR ucData = 0;
if(!bOpenDevice(&hDevice))//打开设备,换成你的代码,cy提供了这个函数
{
AfxMessageBox("无法打开设备!", MB_OK);
return;
}
MyRequest.direction = 0x01;//要求设备回传数据
MyRequest.wLength = 0x01;//回传数据长度为1
MyRequest.wValue = 0x01;//这个参数是传给设备的
MyRequest.bRequest = 0xC0;//请求号是c0,设备固件程序中要求处理这个请求的程序段,后面我会说明
bResult = DeviceIoControl (hDevice,
   IOCTL_Ezusb_VENDOR_REQUEST,
  &MyRequest,
  sizeof(VENDOR_REQUEST_IN),
  &ucData,
  sizeof(ucData),
  &nBytes,
  NULL);

if(!bResult)
{
AfxMessageBox("发送请求失败!");
CloseHandle(hDevice);
return FALSE;
}

固件程序:
你把下面的代码放到SetupCommand函数里的
switch(SETUPDAT[1])的最上一层,如下:
void SetupCommand(void)
{
    switch(SETUPDAT[1])
   {
      case SC_GET_DESCRIPTOR:     // *** Get Descriptor
            .....
            .....
      case 0xC0:
         EP0BUF[0] = 0xC0;
         EP0BCH = 0;
         EP0BCL = 1;
         break;
    }
}


应用程序里发送命令了之后,固件程序就会执行case 0xc0:
此时Setup包里的wValue域应该是1,固件程序执行后应用程序中的ucData里面应该是0xC0,

你可以先在开发板里试,我的这段程序可是验证过的!    


除非你的固件程序根本就下的不对,也就是说你的程序根本就没有执行!你可以作如下的实验,将下面这段程序中的if限制去掉,看设备是否进行了重枚举,也就是在设备管理器的设备列表里面会先卸掉设备然后再加载一次

   if(!(USBCS & bmRENUM))
   {
       EZUSB_Discon(TRUE);   // renumerate
   }
或者在下面函数里加上让某个IO口输出方波的代码,这样就能判定你的程序运行了没有。  
while(TRUE)               // Main Loop
   {
}
 

如果发现没有运行,可能你的固件程序下到外部了,检查option for target里的bl51 locate选项卡里的code:和xdata域你设置的是多少,应该是0x80-0x0FFF和0x1000-0x1FFF才对,如果超出了0x2000,说明你的程序下到内部SRAM外了,当然程序不能正常执行了!
kobebasket
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-01 17:39
任兄,感激你的热情和才华,我晚上好好试一下,有机会的话想请你吃饭!!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-02 11:34
解决问题是最重要的,其它的都是次要的
可惜的是我不是专门做技术支持的,
如果能现场调试一下也许很快就能解决
现在只能靠你自己努力了
arthurcao
驱动小牛
驱动小牛
  • 注册日期2003-10-12
  • 最后登录2012-07-08
  • 粉丝0
  • 关注0
  • 积分92分
  • 威望20点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-03 12:29
jinghuiren:
真是佩服你佩服的不行了!!
热心和才华横溢!!!
arthurcao喜欢开源。
arthurcao
驱动小牛
驱动小牛
  • 注册日期2003-10-12
  • 最后登录2012-07-08
  • 粉丝0
  • 关注0
  • 积分92分
  • 威望20点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-07-03 12:33
极具人格魅力!!!!
对我极有刺激,很有影响。
arthurcao喜欢开源。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-07-03 16:56
呵呵,过奖过奖!
助人乃快乐之本
更何况当初我也曾受过别人这样的帮助。
游客

返回顶部