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
以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
}