FX2L-USB2.0高速控制器IO操作入门

来源:互联网 发布:武汉农村商业银行网络 编辑:程序博客网 时间:2024/05/18 20:06
 

FX2L.mini USB2.0 Starterboard入门

献给热爱技术的朋友

作  者: jinms

QQ交流群:  95502691

概要:

本开发板小巧玲珑,简洁实用,整个大小5CMX5CM。板子通电能工作。芯片所有IO都被引出,并标记。

本开发板及教程遵循简洁,实用的原则,帮助有兴趣的朋友掌握学习的方法,快速上手。

主要资源:

1、主芯片CY7C68013-100AXC USB2.0高速控制器

2、24LC128 EEPROM 16K BYTE

3、24MHZ 晶振

4、2个贴片按钮 接到PORTB

5、8个LED 接到 PORTC

FX2L-USB2.0高速控制器IO操作入门

概要:

通过此教程的学习,你可以立马体验到操作CYC768013 带来的乐趣。这里我通过控制CY7C68013单片机的PORTC输出来控制8个LED的现实。以及读入PORTB的输入信号,到电脑上。

开发环境:VC++6.0、KEIL C

系统要求:Windows-XP

软件要求: FX2L_IO固件、Suite USB 3.4、VC++FX2L-IO测试客户端

硬件要求:mini USB Startboard

其他要求:

1、EZ-USB Advanced Development Kit Users Guide (包含了EZ-USB开发的框架)

2、Device Descriptor Table Data(USB设备描述符知识)

3、CY7C68013 单片机各种资源的掌握

4、会使用KEIL C VC++6.0

如果你很多还不了解没关系,下面这个例子,先体验一下。

 这是模型结构

这个顺便告诉你:FX2L 可以工作在多种模式下:

1、IO模式

2、GPIF 模式

3、SLAV FIFO模式

这里只讲IO模式,如果你想了解其他的,就看这个资料吧,不过是全英文的。不要害怕,搞软件电子,学好英文是必须得。

EZ USB TRM

下面简单介绍下这个例子

这个图是IO的结构模型

这个例子涉及到的寄存器:

§  OEB – PORT B的输出使能寄存器

§  OEC – PORT C的输出使能寄存器

§  EP2CFG – EP2 配置寄存器

§  EP6CFG – EP6 配置寄存器

§  EP6CS – EP6控制和状态寄存器

§  EP2468STAT – EP 2\4\6\8标志

如果这些不清楚,就看 EZ USB TRM,这是芯片的手册。

发送数据驱动8个LED:  

1. 通过EP2CFG配置EP2为输出

2. 读取EP2468STAT寄存器的EP2标志,如果不空,则读取端点寄存器   

3. 把读取到的数值通过LED来显示出来

接收数据:

在软件上来显示从PORTB读取到的数据

1. 通过EP6CFG  配置EP6为输入 

2. 通过读取 EP6CS 可以知道之前的数据是否被电脑读取了,然后传送新的数据

3. 电脑上软件会显示读取到的数据

贴上关键代码:

void TD_Init(void)             // Called once at startup

{

   // set the CPU clock to 48MHz

   CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;

   IFCONFIG |= 0x40; // set ports to work in port io mode of FX2LP

   OEB=0x00;  // make all pins of Port B as input

   OEC=0xFF;  // make PC as output (Refer EZ USB TRM Rev. 1.2 Chapter 13 Input/Output 

   

  // Registers which require a synchronization delay, see section 15.14

  // FIFORESET        FIFOPINPOLAR

  // INPKTEND         OUTPKTEND

  // EPxBCH:L         REVCTL

  // GPIFTCB3         GPIFTCB2

  // GPIFTCB1         GPIFTCB0

  // EPxFIFOPFH:L     EPxAUTOINLENH:L

  // EPxFIFOCFG       EPxGPIFFLGSEL

  // PINFLAGSxx       EPxFIFOIRQ

  // EPxFIFOIE        GPIFIRQ

  // GPIFIE           GPIFADRH:L

  // UDMACRCH:L       EPxGPIFTRIG

  // GPIFTRIG

  

  // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well...

  //      ...these have been replaced by GPIFTC[B3:B0] registers

  // default: all endpoints have their VALID bit set

  // default: TYPE1 = 1 and TYPE0 = 0 --> BULK  

  // default: EP2 and EP4 DIR bits are 0 (OUT direction)

  // default: EP6 and EP8 DIR bits are 1 (IN direction)

  // default: EP2, EP4, EP6, and EP8 are double buffered

  // we are just using the default values, yes this is not necessary...

                   

  EP2CFG = 0xA0;  //EP2 as OUT Endpoint, quad buffered of buffer size 512

  SYNCDELAY;                               

  EP6CFG = 0xE0; //EP6 as IN Endpoint, quad buffered of buffer size 512

  SYNCDELAY;                    

  EP4CFG &= 0x7F; //Not Used

  SYNCDELAY;

  EP8CFG &=0x7F; //Not Used

  SYNCDELAY; 

  // out endpoints do not come up armed

  

  // since the defaults are double buffered we must write dummy byte counts twice

                      

  EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.

  SYNCDELAY;                    

  EP2BCL = 0x80;

  SYNCDELAY;

  EP2BCL = 0x80;               

  SYNCDELAY;                    

  EP2BCL = 0x80;

  SYNCDELAY;

}

void TD_Poll(void)              // Called repeatedly while the device is idle

{

//For Port C  configured as output

  if(!(EP2468STAT & bmEP2EMPTY)) //Used to free out endpoint buffer as soon as it is read by CPU

  {   

     temp=EP2FIFOBUF[0]; 

      SYNCDELAY; 

      EP2BCL = 0x80;

   }            

    IOC = temp; // control LED  

//For Port B configured as input port

if((EP6CS & 0x10)) // Used to arm in endpoint only when previous value is read by host (See NPAK bits EZ USB TRM Rev. 1.2 ,15.12.11)

return;

EP6FIFOBUF[0]=IOB;

EP6BCH=0;

SYNCDELAY;

EP6BCL=1;

SYNCDELAY;

}

这就是关键代码,其实对FX2L开发是比较容易的,主要需要开发的地方就这么两个地方。你现在不懂,以后你就会知道。

下面就测试一下

1、安装 SuiteUSB 3.4 

2、把mini开发板上得短接冒拔掉

3、 插上电脑,然后提示安装驱动,自动搜索

4、下载FX2L_IO.hex文件到mini开发板

5、测试输出

6、测试输入

发送AA

 

接收输入   

 

下面展示VC++客户

附上重要的VC代码

USBDevice = new CCyUSBDevice(m_hWnd);   // Create an instance of CCyUSBDevice

XferThread = AfxBeginThread(XferFindDV, this);

UINT CFX2L_IODlg::XferFindDV(LPVOID pParam)

{

CFX2L_IODlg* pdlg=(CFX2L_IODlg*)pParam;

pdlg->SetWindowText( "FX2L-IO-DeviceSearching !");

UINT n,i,unfind=0;

 

while(!unfind)

{

n=pdlg->USBDevice->DeviceCount();

for(i=0;i<n;i++)

{

if(CString(pdlg->USBDevice->DeviceName)=="FX2L-IO") {

pdlg->USBDevice-> Open(i);

pdlg->SetWindowText( "FX2L-IO-DeviceFinded !");

pdlg->OutEndpt = pdlg->USBDevice->EndPoints[1];

pdlg->InEndpt  = pdlg->USBDevice->EndPoints[3];

unfind=1;break;

}

}

}

 if(pdlg->USBDevice->IsOpen());

 else {AfxMessageBox("打开失败!");return 0;}

 OVERLAPPED outOvLap, inOvLap; 

 outOvLap.hEvent  = CreateEvent(NULL, false, false, "CYUSB_OUT"); 

 inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN"); 

 PUCHAR  InBuffer =new UCHAR[1];ZeroMemory(InBuffer,  1);

 PUCHAR  OutBuffer=new UCHAR[1];ZeroMemory(OutBuffer, 1);

 while(pdlg->going){

 OutBuffer[0]=0xff;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK1))OutBuffer[0]|=0x01;else OutBuffer[0]&=0xfe;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK2))OutBuffer[0]|=0x02;else OutBuffer[0]&=0xfd;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK3))OutBuffer[0]|=0x04;else OutBuffer[0]&=0xfb;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK4))OutBuffer[0]|=0x08;else OutBuffer[0]&=0xf7;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK5))OutBuffer[0]|=0x10;else OutBuffer[0]&=0xef;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK6))OutBuffer[0]|=0x20;else OutBuffer[0]&=0xdf;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK7))OutBuffer[0]|=0x40;else OutBuffer[0]&=0xbf;

 if(pdlg->IsDlgButtonChecked(IDC_CHECK8))OutBuffer[0]|=0x80;else OutBuffer[0]&=0x7f;

 LONG len1=1,len2=1;

     UCHAR  *outContext = pdlg->OutEndpt->BeginDataXfer(OutBuffer,len1,&outOvLap);

 UCHAR  *inContext =  pdlg->InEndpt ->BeginDataXfer(InBuffer ,len2,&inOvLap );

     pdlg->OutEndpt->WaitForXfer(&outOvLap,2000); 

     pdlg->InEndpt->WaitForXfer(&inOvLap,2000); 

 pdlg->OutEndpt->FinishDataXfer((PUCHAR)OutBuffer, len1, &outOvLap,outContext); 

 pdlg->InEndpt->FinishDataXfer((PUCHAR)InBuffer, len2, &inOvLap,inContext);

 

 pdlg->CheckDlgButton( IDC_CHECK9,InBuffer[0]&0x01);

 pdlg->CheckDlgButton(IDC_CHECK10,InBuffer[0]&0x02);

 pdlg->CheckDlgButton(IDC_CHECK11,InBuffer[0]&0x04);

 pdlg->CheckDlgButton(IDC_CHECK12,InBuffer[0]&0x08);

 pdlg->CheckDlgButton(IDC_CHECK13,InBuffer[0]&0x10);

 pdlg->CheckDlgButton(IDC_CHECK14,InBuffer[0]&0x20);

 pdlg->CheckDlgButton(IDC_CHECK15,InBuffer[0]&0x40);

 pdlg->CheckDlgButton(IDC_CHECK16,InBuffer[0]&0x80);

 Sleep(100);

 }

 CloseHandle(outOvLap.hEvent); 

 CloseHandle(inOvLap.hEvent); 

 delete [] OutBuffer;

 delete [] InBuffer;

 pdlg->XferThread = NULL;

 pdlg->USBDevice->Close();

return 0;

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 快手实验室没有k歌怎么办 皮肤一到冬天就会起皮脱落怎么办 嘴上的皮撕破了怎么办 身体皮肤干燥起皮怎么办 把公司数据库弄宕机了怎么办 地铁上临时变站怎么办 大学实践课挂了怎么办 军训的人长得矮怎么办 军训脸被晒黑了怎么办 晚上吃了油炸的怎么办 楼梯又陡又窄怎么办 小孩不认真做作业怎么办 水厂出水水质不达标怎么办 野猪铁夹子夹到怎么办 燃气灶开孔尺寸大了怎么办 苹果电脑视频显示缺少插件怎么办 安装拼多多显示校验失败怎么办 中央庭黑盒被抢怎么办 lab值a值偏高怎么办 橱房管道堵死了怎么办 微信被别的手机同步登录怎么办 计算机机房空调坏了怎么办 被蝎子蛰了怎么办怎么处理? 月嫂走了孩子闹怎么办 转业军人自建房有困难怎么办 转业军人没配偶想异地安置怎么办 转业军人档案和身份证不符怎么办 转业军人个人资被单位遗失怎么办 空军飞行学员停飞后怎么办 2020年不脱贫的农户怎么办 马自达8停产后配件怎么办 钢铁雄心3没将领怎么办 江苏低于二本线怎么办 电工证快过期了怎么办 天正建筑打不开高版本的图纸怎么办 打开天正只显示cad怎么办 天正软件显示过期了怎么办 四岁宝宝经常吐怎么办 穿越火线登陆不上去怎么办 猫猫呕吐带血怎么办 狗又吐又拉稀怎么办