打印

【已解决】cyrf69213与PC机的通信

[复制链接]
8931|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baoyansheng|  楼主 | 2009-11-24 18:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 baoyansheng 于 2009-12-1 14:06 编辑

经过这些日子以来对usb模块使用的反复阅读,终于解决了与pc通信的问题,供想学习改芯片的人提供参考,程序很粗略,但对于入门应该有些许帮组。下面的程序都已修改
这是我修改后上位机程序,用MFC编写的:
//全局变量
CCyUSBDevice *USBDevice = new CCyUSBDevice();
CCyControlEndPoint *ept = USBDevice->ControlEndPt;
CCyInterruptEndPoint *IntOut =  USBDevice->InterruptOutEndPt;   
CCyInterruptEndPoint *IntIn =  USBDevice->InterruptInEndPt;     
int  epCnt = USBDevice->EndPointCount();

void CWirelessDlg::OnButtonCheck()  //按下“设备检测”的程序响应
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_EDIT_RECV,"");
if(USBDevice->IsOpen())
{
  bool bBulk, bIn;
  int  blkInCnt = 0;
  int vID,pID;
  CString str,temp;
  str = "USB设备已经连接!";
  vID = USBDevice->VendorID;
  pID = USBDevice->ProductID;
  temp.Format("VendorID = 0x%x",vID);
  str = str + "\r\n";
  str = str + temp;
  temp.Format("ProductID = 0x%x",pID);
  str = str + "\r\n";
  str = str + temp;
  PCHAR dn = new CHAR[256];
  dn = USBDevice->DeviceName;
  temp.Format("设备名称:%s",dn);
  str = str + "\r\n";
  str = str + temp;
  SetDlgItemText(IDC_EDIT_RECV,str);
  temp.Format("%s",dn);
  SetDlgItemText(IDC_COMBO_SET,temp);
  
  for  (int  e=0;  e<epCnt; e++) {
   bBulk = USBDevice->EndPoints[e]->Attributes  == 3;
   bIn   = USBDevice->EndPoints[e]->Address & 0x80;
  if (bBulk && bIn)
  {
   MessageBox("检测到输入终端");
  }
  if (bBulk && !bIn)
  {
   MessageBox("检测到输出终端");
  }
  }
}
else
{
  SetDlgItemText(IDC_EDIT_RECV,"USB设备连接失败!");
}
}
void CWirelessDlg::OnButtonRevclear()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_EDIT_RECV,"");
}
void CWirelessDlg::OnButtonMansend()  //按下“手动放松”的程序响应
{
// TODO: Add your control notification handler code here
  unsigned char buf[4];  
  ZeroMemory(buf, 4);  
  LONG buflen =  4;  
  buf[0] = 0x05;
  buf[1] = 0xc0;
  buf[2] = 0x05;
  buf[3] = 0xc0;
  if(IntOut)
   MessageBox("找到输出设备") ;
  if((IntOut->XferData(buf,buflen))==TRUE&&USBDevice->IsOpen())
   MessageBox("传输成功");
  else
   MessageBox("传输失败");
}
void CWirelessDlg::OnButtonRecv()        //按下“开始接收”的程序响应
{
// TODO: Add your control notification handler code here
CString temp;
unsigned char buf[6];
LONG buflen =  6;
if(IntIn->XferData(buf,buflen)==TRUE)
{
  temp.Format("传输数据:%s",buf);
  MessageBox(temp);      //检测收到的数据,并显示
}
}
固件程序如下:
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#include "psocgpioint.h"
void SoftDelay50msec(void);
void SoftDelay1000msec(void);
#define  RED_LED_Data_ADDR  P0DATA
#define  GREEN_LED_Data_ADDR  P0DATA
#define GREEN_LED_ON {GREEN_LED_Data_ADDR &= ~GREEN_LED_MASK;}
#define GREEN_LED_OFF {GREEN_LED_Data_ADDR |= GREEN_LED_MASK;}
#define GREEN_LED_BLINK {GREEN_LED_Data_ADDR &= ~GREEN_LED_MASK;SoftDelay50msec();GREEN_LED_Data_ADDR |= GREEN_LED_MASK;}
#define RED_LED_OFF {RED_LED_Data_ADDR |= RED_LED_MASK;}
#define RED_LED_ON {RED_LED_Data_ADDR &= ~RED_LED_MASK;}
#define RED_LED_BLINK {RED_LED_Data_ADDR &= ~RED_LED_MASK;SoftDelay50msec();RED_LED_Data_ADDR |= RED_LED_MASK;}
unsigned char unch[6]="Hello";
//--------------------------------------
// Register Definitions
//--------------------------------------
#pragma  ioport   EP2_DR0:    0x060  // Endpoint 2 Data  Register 0
BYTE              EP2_DR0;
#pragma  ioport   EP2_DR1:    0x061  // Endpoint 2 Data  Register 1
BYTE              EP2_DR1;
#pragma  ioport   EP2_DR2:    0x062  // Endpoint 2 Data  Register 2
BYTE              EP2_DR2;
#pragma  ioport   EP2_DR3:    0x063  // Endpoint 2 Data  Register 3
BYTE              EP2_DR3;
#pragma  ioport   EP2_DR4:    0x064  // Endpoint 2 Data  Register 4
BYTE              EP2_DR4;
#pragma  ioport   EP2_DR5:    0x065  // Endpoint 2 Data  Register 5
BYTE              EP2_DR5;
#pragma  ioport   EP2_DR6:    0x066  // Endpoint 2 Data  Register 6
BYTE              EP2_DR6;
#pragma  ioport   EP2_DR7:    0x067  // Endpoint 2 Data  Register 7
BYTE              EP2_DR7;
void main()
{
    // Insert your main routine code here.
    USB_Start(0);   
    M8C_EnableGInt;    //Start USB
    GREEN_LED_OFF;
    RED_LED_OFF;    //Initial light off
    while(USB_bGetConfiguration()==0)
    {
     GREEN_LED_ON;
     RED_LED_ON;
    }       //Waiting until usb configuration complete
        GREEN_LED_OFF;
     RED_LED_ON;    //usb complete
    while(1)
    {
     USB_EnableEP(2);  //allow pc to trasfer datas to device
     if(0x05==EP2_DR0)
     {
      if(0xc0==EP2_DR1)
      {
       if(0x05==EP2_DR2)
       {
        if(0xc0==EP2_DR3)
        {
         GREEN_LED_ON;
         RED_LED_OFF; //Check the data recevied from pc,Green led on if correct
        }
       }
      }
     }
     USB_LoadEP(1,unch,6); //Allow device to trasfer data to pc
    }
}
void SoftDelay50msec(void)
{
unsigned int i;
for(i=0;i<23100;i++)
asm("NOP");
}
void SoftDelay1000msec(void)
{
unsigned int i,j;
for(j=0;j<20;j++)
for(i=0;i<23100;i++)
asm("NOP");
}
附上我的工程,供大家学习!

usb固件程序.rar

223.52 KB

usb上位机程序.rar

3.58 MB

沙发
贾君鹏子| | 2009-11-24 18:47 | 只看该作者
与PC机的通信这种问题很麻烦,我最近也遇到了

使用特权

评论回复
板凳
baoyansheng|  楼主 | 2009-11-25 15:13 | 只看该作者
EZ-USB FX2系列的CY7C68013在fw.c有SetupCommand()函数来响应各类请求也可以自定义请求,那么cyrf69213又是如何响应各类请求的?

使用特权

评论回复
地板
jxin| | 2009-11-26 13:21 | 只看该作者
在固件程序中只看到你USB配置好后驱动LED,没看到你怎么传输数据啊

使用特权

评论回复
5
baoyansheng|  楼主 | 2009-11-26 15:16 | 只看该作者
在上位机上我写了从PC->Device的程序,我也写了判断传输是否成功的语句,一直是“传输失败”,是否与固件没写相应的数据处理函数有关?另外,固件如何知道有数据传输,怎么编写相应的数据处理函数?

使用特权

评论回复
6
午夜粪车| | 2009-11-28 16:28 | 只看该作者
学习了

使用特权

评论回复
7
baoyansheng|  楼主 | 2009-12-1 14:10 | 只看该作者
在上位机上我写了从PC->Device的程序,我也写了判断传输是否成功的语句,一直是“传输失败”,是否与固件没写相应的数据处理函数有关?另外,固件如何知道有数据传输,怎么编写相应的数据处理函数? ...
baoyansheng 发表于 2009-11-26 15:16

  一直显示传输失败 是因为在固件程序中没有启用指定的断点用于OUT传输 用该API函数:USB_EnableEP(2)就解决问题

使用特权

评论回复
8
jxin| | 2009-12-1 15:47 | 只看该作者
我觉得你要用USB_bGetEPState判断有没有数据传输,参照USB User module datasheet

使用特权

评论回复
9
jxin| | 2009-12-1 15:50 | 只看该作者
学习了

使用特权

评论回复
10
god_like| | 2009-12-1 20:40 | 只看该作者
学习了

使用特权

评论回复
11
wuzx-61| | 2009-12-1 20:51 | 只看该作者
以后借鉴.

使用特权

评论回复
12
love_life| | 2009-12-1 21:46 | 只看该作者
学习了

使用特权

评论回复
13
godlike| | 2012-4-28 14:18 | 只看该作者
值得借鉴

使用特权

评论回复
14
godlike| | 2012-4-28 14:18 | 只看该作者
值得借鉴

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

24

帖子

0

粉丝