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;
}
- FX2L-USB2.0高速控制器IO操作入门
- 安装USB2.0驱动,获取极端高速
- 基于FPGA的USB2.0控制器设计
- USB2.0的高速、全速及低速设备的检测
- USB2.0速度识别--区分低速-高速-全速
- USB2.0的高速、全速及低速设备的检测
- 实现USB2.0高速数据传输的问题探讨
- USB2.0 速度识别--区分低速-高速-全速
- STM32F4高速USB2.0项目i开发记录 四川自贡
- 基于USB2.0与FPGA技术的高速数据采集系统的设计
- 关于USB2.0和USB高速传输模式的一点说明
- ti dsp(tms320VC5502)+isp1581 usb2.0高速数据采集方案(1)
- ti dsp(tms320VC5502)+isp1581 usb2.0高速数据采集方案(2)
- ti dsp(tms320VC5502)+isp1581 usb2.0高速数据采集方案(3)
- Window XP驱动开发(十一) USB2.0 芯片CY7C68013A+FPGA实现的高速传输系统设计(软件及硬件)
- Window XP驱动开发(十一) USB2.0 芯片CY7C68013A+FPGA实现的高速传输系统设计(软件及硬件)
- Window XP驱动开发(十一) USB2.0 芯片CY7C68013A+FPGA实现的高速传输系统设计(软件及硬件)
- Unity入门操作_ 角色控制器_015
- start()和run()方法的区别
- jquery如何取得text,areatext,radio,checkbox,select的值,以及其他一些操作
- uC/OS-II内核架构解析---uC/OS-II系统核心
- HDU 4068 模拟
- Qt多线程编程总结(一)
- FX2L-USB2.0高速控制器IO操作入门
- C8650精简可删除应用程序对应表
- SQL 之面试宝典
- 自己删除电信软件,C8650 Root超简单教程
- JAVA文件IO流的理解(二)
- 序列化类型为XX的对象时检测到循环引用。
- 游标简介
- c++ linux 如何把 char* 里面的中文 insert进入mysql(相应的字段为varchar类型)
- Endpoint Interrupts 操作入门