Endpoint Interrupts 操作入门

来源:互联网 发布:重庆简米网络培训骗局 编辑:程序博客网 时间:2024/06/09 15:54

 

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高速控制器 

Endpoint Interrupts 操作入门

概要:

通过此教程的学习,你可以立马体验到操作CYC768013 带来的乐趣。这里我通过使用CY7C68013单片机的中断机制,来实现数据回传。数据传输使用了一个BULK OUT 和一个 BULK IN 端点。通过这篇的学习,可以掌握8051单片机中断机制。

开发环境: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

下面简单介绍下这个例子

这个图是中断结构模型

这是自动向量的工作原理

具体可以阅读:EZ USB TRM

以EP0 IN 为例:

void ISR_Ep0in(void) interrupt 0 

   //The code to execute within the ISR; 

当中断产生的时候会自动执行。中断程序不能被直接调用。

固件在TD_Init()中:

EPIE |= bmBIT3 |bmBIT4 | bmBIT5; // Enable EP2, EP4 and EP1 OUT Endpoint interrupts 

EPIE |= bmBIT6 |bmBIT7 | bmBIT2; // Enable EP6, EP8 and EP1 IN Endpoint interrupts 

上面两行展示了如何使能端点的中断使能。

主程序调用TD_Init()之后回到主程序,在这里使能USB中断。EZUSB_IRQ_ENABLE() 被调用使能USB中断。当USB中断使能后,自动向量就使能了。下面是USB中断使能代码:

INTSETUP |= (bmAV2EN | bmAV4EN); 

Bulkloop 程序在每个端点中断程序中执行,下面展示了在EP1端点中断程序。其他端点具体看Bulkloop源码。

void ISR_Ep1out(void) interrupt 0 

 

  BYTE count; 

  BYTE i; 

count = EP1OUTBC; 

  if(!(EP1INCS & bmBIT1)) 

  { 

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

    { 

      EP1INBUF[i]=EP1OUTBUF[i]; //Copies data from EP1OUT to EP1IN 

    } 

    EP1INBC =count;  // Commits IN endpoint 

  } 

 

  EZUSB_IRQ_CLEAR(); // Clears the USB interrupt 

  EPIRQ = bmBIT3; //Clears EP1 OUT interrupt request   

}

void ISR_Ep1in(void) interrupt 0 

  EP1OUTBC = 64;  // Arms EP1 OUT 

 

  EZUSB_IRQ_CLEAR(); 

  EPIRQ = bmBIT2; 

下载代码:

块传输输出:

块传输输入:

VC++客户端:

VC++重要源码:

void CFX2L_INIDlg::OnBtnSend() 

{

// TODO: Add your control notification handler code here

if(USBDevice->IsOpen());

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

CString str;

GetDlgItemText(IDC_EDIT_SEND,str);

if(str!="")

{

LONG len=512;

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

strcpy((char*)OutBuffer,str);

OVERLAPPED outOvLap; 

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

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

OutEndpt->WaitForXfer(&outOvLap,1000); 

if(OutEndpt->FinishDataXfer(OutBuffer, len, &outOvLap,outContext));

else AfxMessageBox("发送失败!");

CloseHandle(outOvLap.hEvent); 

delete [] OutBuffer;

}

}

void CFX2L_INIDlg::OnBtnRead() 

{

// TODO: Add your control notification handler code here

if(USBDevice->IsOpen());

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

OVERLAPPED inOvLap; 

LONG len=512;

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

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

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

InEndpt->WaitForXfer(&inOvLap,2000); 

if(InEndpt->FinishDataXfer(InBuffer , len, &inOvLap ,inContext));

else AfxMessageBox("读取传输失败!");

SetDlgItemText(IDC_EDIT_READ,CString(InBuffer));

CloseHandle(inOvLap.hEvent); 

delete [] InBuffer;

// TODO: Add your control notification handler code here

}

原创粉丝点击