一、FX2LP DVK及Suite USB的安装
二、绑定cyusb.sys至已连接的FX2LPDVK
当FX2LP DVK第一次连接至PC时,须安装FX2LP DVK Windows驱动程序。其各个步骤如下:
1. 当使用某个USB 2.0线缆将FX2LP DVK连接至PC时, 它将枚举供应商ID(VID) 0x04B4和产品ID(PID)0x8613 。打开DeviceManager(设备管理器),并寻找新的设备。如图1所示。
图1 设备管理器
2. 如果首次连接FX2LPDVK,FX2LP设备将显示在Other Devices(其他设备)列表中。
3. 右击FX2LP设备并选择UpdateDriver(更新驱动程序)。
4. 指示FX2LP DVK 安装文件夹附带的cyusb.inf文件的位置( 即C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK
\1.0\Drivers\cyusbfx1_fx2lp\wxp\x86)。下面各步骤介绍了如何绑定FX2LP设备的cyusb.sys驱动程序文件。
图2 更新FX2LP的驱动程序
5. 选中No, notthis time并点击Next,如图2所示。
图3 更新FX2LP的驱动程序
6. 选中Installfrom a list or specific location 并点击Next,如图3所示。
图4 “cyusb.inf”文件的位置
7. 浏览“cyusb.inf”文件的位置(C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Drivers\cyusbfx1_fx2lp\wxp\x86)并点击Next,如图4所示。
8. Windows识别了cyusb.inf 文件中的FX2LP设备后,则已连接的FX2LP器件被绑定到由赛普拉斯提供的USB驱动程序,并可在Device Manager找到它,如图5所示。
图5 FX2LP 被绑定到CyUSB.sys后的器件管理程序
一、使用Cypress Suite USBControlCenter下载
1. 点击StartAll ProgramsCypress Cypress Suite USBControl Center来打开“ControlCenter”(控制中心)。如果FX2LP DVK电路板被插上电脑,它会显示在控制中心的左侧面板。
图6 控制中心罗列了已连接的FX2LP器件
2. 使用ControlCenter窗口中的 Program 选项来下载“.hex”文件到FX2LP RAM内;请查看图7。
图7 Control Center窗口中的Program选项
3. 选择Program FX RAM,在C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Firmware\Bulkloop 浏览“Bulkloop.hex”文件。 现在FX2LP重新枚举在Bulkloop示例项目中所提供的VID(0x4B4)和PID(0x1004)。Windows Device Manager目前已经确定了“新”的USB器件(带有批量循环软件的FX2LP DVK电路板已安装好),如图8所示。
图8 在cyusb.inf中带有已给名称的FX2LP器件
二、使用CypressSuite USB Console下载
在弹出的EZ-USB Interface窗口中点击download和lg EEPROM分别进行.hex和.iic固件下载。
在Bulkloop示例使用的VID 0x4B和PID 0x1004已经添加到安装FX2LPDVK时出现的cyusb.inf文件中(C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Drivers\cyusbfx1_fx2lp\wxp\x86)。但是,如果修改了FX2LP固件项目中的VID和PID值,并且没有将这些值罗列在cyusb.inf文件中,则需要将这些值添加到cyusb.in文件中,这样赛普拉斯的开发工具(USB控制中心)才可识别所使用的设备。下面各步说明如何将自定义VID和PID值添加到cyusb.inf文件内。
1. 打开C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.0\Drivers\cyusbfx1_fx2lp\wxp\x86路径下的cyusb.inf文件。
2. 添加您的自定义VID和PID,如图9和图10所示。假设自定义VID为0x4B4和PID为0x1005。
图9 向Cyusb.inf添加了自定义VID和PID
图10 向Cyusb.inf添加了自定义VID和PID
4. 更改cyusb.inf文件后,连接FX2LP DVK到PC,然后下载具有VID 0x4B4和PID 0x1005的固件映射图(.hex文件)。现在,指向更改后的cyusb.inf 文件(如绑定cyusb.sys至已连接的FX2LP DVK),以便绑定该文件到CyUSB.sys。FX2LP器件绑定到CyUSB.sys时,它将出现在Control Center的左侧面板,如图11所示。可以使用Control Center窗口来执行数据传输。
图11 Control Center窗口中所罗列的自定义FX2LP器件
Bulkloop程序使用OUT和IN 端点:它接收从主机PC的OUT数据,并通过IN将同样的数据传输到PC。Bulkloop示例项目使用四个端点。端点2和端点4被配置为BULK OUT端点。端点6和端点8被配置为BULK IN端点。数据将从端点OUT 2和OUT 4分别回送到端点IN 6 和IN 8。
图12显示的是通过使用“ControlCenter”中的“Data Transfers”选项卡将10字节的数据传输到端点2。Transfer Data-OUT按键被用于执行在所选数据管上的数据批量传输(在这种情况下,选择“Bulk out endpoint (0x02)”)。从0至9的数值被传输到EP2。可在“Control Center”的信息窗口中查看到BULK OUT的传输结果。图12显示的是该传送操作的结果。
图12 BULK OUT传输结果
现在,在端点6上执行BULK IN传输操作,以读回刚刚从PC传送到FX2LP的OUT数据。选择Bulk in endpoint (0x86),然后点击Transfer Data-IN按键。可看见从端点6 IN返回的数据。图13显示了通过端点6接收到的数据。也可使用端点4和8来进行同样的操作。即使Bytes to Transfer字段过大(为512个字节),USB仍传输正确的字节数(10个字节)。
图13 使用“Control Center”中的“TransferData-IN”按键传输BULK IN
当开发USB 2.0高速设备的硬件时,电路板布局和设计会决定项目的成功。AN1168和AN15456应用手册给出了FX2LP的设计指南。此外,FX2LP DVK安装的hardware(硬件)子目录中还包含FX2LP开发套件原理图、物料清单(BOM)(用于开发电路板)以及开发电路板布局和设计文件。
表1 FX2LP 固件示例的说明
序号 |
固件示例 |
说明 |
1 |
hid_kb |
是指示例固件。该示例固件通过使用DVK电路板上各按键和7段显示来仿真HID级键盘。 |
2 |
Bulkloop |
包含一个批量回送测试操作,该操作执行EZ-USB批量端点。它将EP2OUT和EP4OUT分别回送到EP6IN和EP8IN。 |
3 |
Bulkext |
包含一个批量回送测试操作,该操作执行EZ-USB批量端点。使用外部自动指针来执行回送功能。将数据从OUT端点缓冲区复制到DVK电路板上的外部RAM内,然后再返回到IN端点缓冲区。它将EP2OUT和EP4OUT分别回送到EP6IN和EP8IN。 |
4 |
Bulksrc |
包含了BULK数据的无限提供者和消费者,用于测试。使用CyConsole或CyBulk来驱动它。EP2OUT和EP4OUT接收所有BULK数据包。在高速传输时,EP6IN始终返回一个大小为512字节的数据包,但在全速运行时返回大小为64个字节的数据包。根据EP8IN中缓冲区的可用性,将EP4OUT的最新数据包写入到EP8IN内。 |
5 |
dev_io |
包含各源文件,用于创建简单的开发电路板I/O 的示例。该软件说明了如何使用EZ-USB开发套件中的按键和LED。 |
6 |
EP_Interrupts |
描绘端点中断的使用的批量回送固件。 |
7 |
extr_intr |
是指表示外部中断处理INT0、INT1、INT4、INT5和INT6的固件。 |
8 |
Ibn |
包含了一个固件。该固件使用IBN(In Bulk NAK)中断将EP2OUT和EP4OUT分别批量回送到EP6IN和EP8IN,以启动传输操作。 |
9 |
LEDCycle |
是指表示使用DVK上的通用指示器LED(D2、D3、D4、D5)的简单固件示例。 |
10 |
Pingnak |
包含一个固件。该固件使用PING NAK中断来将EP2OUT和EP4OUT分别批量回送到EP6IN和EP8IN,以启动传输操作。 |
11 |
iMemtest |
是指存储器测试固件示例。测试片上的RAM。 |
12 |
vend_ax |
包含创建供应商特定指令示例的源文件。该示例说明了如何实现不同的供应商指令。 |
TD_poll ()函数在固件中的功能是定期的检查按键十分有按下。按键的功能表如下:
表2 按键功能描述
开发板上的按键 |
功能 |
F1 |
Shift |
F2 |
Send ‘a’ |
F3 |
Send ‘b’ |
F4 |
Send ‘c’ |
接收从主机传来的块数据并回送到主机,四个端点的配置在TD_init()中,两个输出端点和两个输入端点。同时四个端点还需在描述符文件配置中有定义。
EP2CFG = 0xA2; //Endpoint2 - OUT, Bulk, double buffered
SYNCDELAY;
EP4CFG = 0xA0; //Endpoint 4 - OUT, Bulk,double buffered
SYNCDELAY;
EP6CFG = 0xE2; //Endpoint 6 - IN, Bulk,double buffered
SYNCDELAY;
EP8CFG = 0xE0; //Endpoint 8 - IN, Bulk,double buffered
数据回送在TD_Poll函数中实现。端点2和端点4被配置为接收主机传来的数据。这些数据然后被传送到端点6和8。为实现这个功能,端点2首先需要检查是否已有数据,这可通过读取端点2状态寄存器空标志查看。如果端点2有从主机传来的数据,则可检查端点6是否可以接收数据。这可以通过读取端点状态寄存器中端点6的满标志位。如果端点6不满,可以传输数据。
if(!(EP2468STAT &bmEP2EMPTY)) //如果端点2有数据不为空时(即bmEP2EMPTY为0),端点6可以接//收数据
{ // check EP2 EMPTY(busy)bit in EP2468STAT (SFR), core set's this bit when FIFO is empty
if(!(EP2468STAT &bmEP6FULL)) //如果端点6数据不满时(即bmEP6FULL为0),端点6才接收数据
{ // check EP6 FULL(busy) bit in EP2468STAT(SFR), core set's this bit when FIFO is full
数据指针初始化相应的缓冲。第一个自动指针初始化为端点2FIFO缓冲的第一个字节。第二个自动指针初始化为端点6FIFO缓冲的第一个指针。被传输的字节数是从端点2的字节计数寄存中读取的。EP2BCL, EP2BCH寄存器包含着从主机写入到FIFO缓冲的字节数。这两个寄存器会一直给输出事务的FIFO进行数据传输计数,只要数据还没有被发送到外围设备。
APTR1H = MSB( &EP2FIFOBUF ); // Initializing the first datapointer
APTR1L = LSB( &EP2FIFOBUF );
AUTOPTRH2 = MSB( &EP6FIFOBUF ); // Initializing the second datapointer
AUTOPTRL2 = LSB( &EP6FIFOBUF );
count = (EP2BCH << 8) + EP2BCL; // The count value is loadedfrom the byte count registers
以下为数据回送
for( i = 0x0000; i < count; i++ )
{
// setup to transfer EP2OUT buffer to EP6IN buffer usingAUTOPOINTER(s)
EXTAUTODAT2 = EXTAUTODAT1;
}
因为已经使能自动指针,指针会自动加计数,EXTAUTODAT2 = EXTAUTODAT1;这个语句会传输数据从端点2到端点6。每执行一次以上语句,自动指针加1,上述语句会重复执行来传输字节从端点2到端点6。数据传输完成后,端点2会再一次被配置来接收从主机发来的新包。端点6也会使FIFO缓冲对主机的读取有效。
测试固件功能使用的软件有:
Ø Cyconsole ,如图14
选择EP2 OUT作为块输出数据传输管道,且键入长度为512字节0x5实际数据。然后点击BulkTrans按键传输。同理选择EP6 IN回送在EP2中的数据。
图14 EP2 OUT Data Transfer使用CyConsole
Ø CyBulk,在C:\Cypress\Cypress Suite USB3.4.7\CyAPI\examples\cybulk\x64\Release软件如图15
图15 Bulkloop 使用CyBulk Application
Ø Bulkloop,位于Windows Start->All programs->Cypress->Cypress SuiteUSB3.4.7->Bulkloop,如图16
图16 Bulkloop 使用Bulkloop C#Application
Bulksrc固件程序描述的是配置USB设备为接收主机传来的数据并回送到主机。打开bulksrc.Uv2工程可以查看代码。 TD_init()函数有5个端点来处理块传输:两个输出端点EP2/EP4和两个输出端点EP6/EP8都被配置为双重缓冲。第五个端点EP1为64字节缓冲输入和输出端点。这些要被定义在描述符文件中。端点配置是在TD_init()函数中。
唯一的区别在于Bulkloop和Bulkext的来源和目的缓冲区的存储地址不同。在bulkloop中端点FIFO直接作为源和目标缓冲区。这些都是内部RAM缓冲区存储在EZ-USB设备。在TD_Poll函数中端点 2数据缓冲区的目的定义在外部RAM存储地址address-0x2800中,同时存储地址也被定义为EP6输入端点的源缓冲区,且数据是通过AUTOPTR来复制的。
这个例子演示了不同供应商的命令的使用。用供应商的命令来完成独特的任务,如EZ-USB复位,RAM的下载,为实现I2C接口设置不同的频率,与一个外部SRAM内存进行通信,等。供应商的命令被定义在vend_ax C例子源文件中。通过点击vend_ax.uv2打开项目。
序号 |
厂商命令及宏定义 |
功能 |
1 |
0xA2/VR_EEPROM |
下载数据到小的EEPROM |
2 |
0xA3/ VR_RAM |
下载数据到内部或外部RAM存储中 |
3 |
0xA6/ VR_GET_CHIP_REV |
获得EZ-USB当前的版本号 |
4 |
0xA8/VR_RENUM |
EZ-USB设备的断开和重连 |
5 |
0xA9/VR_DB_FX |
此命令选择双字节寻址的大的EEPROM-U5且内容可上传和下载到EEPROM |
6 |
0xAA/VR_I2C_100 |
设置I2C接口为100kHZ |
7 |
0xAB/VR_I2C_400 |
设置I2C接口为400kHZ |
图14 USB模块原理图
图15 USB模块PCB板
图16 USB模块3D效果