USB小白学习之路(3) 通过自定义请求存取外部RAM 通过自定义请求存取外部RAM

1. 实验简述

此实验是对自定义的供应商特殊命令(vendor specific command bRequest = 0xA3)进行解析,程序中的read me说明如下:

a3 load is 8051 firmware that can be used for uploading or downloading to EZ-USB RAM (internal or external).  It implements the vendor specific command bRequest = 0xA3.  The address to download/upload to/from is specified in the wValue field of the SETUP packet and the length of the transfer in the wLength field.  The actual upload/download data is transferred during the DATA stage of the SETUP transfer.  This firmware will function on all EZ-USB chips (EZ-USB, EZ-USB FX, FX2, FX2LP, FX1).

2. 实验操作

首先将a3load中的代码编译,下载到CY7C68013A中,在EZ_USB interface中的设置如 1所示,其中Req处就是我们的自定义代码A3Value处为要写入RAM的地址;Length处的8对应Hex Bytes中的数字的个数;

USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM

1 EZ_USB interface中的配置

点击 1中的Vend Req后,就会向CY7C68013A中传输数据,传输的数据通过BUS Hound抓取如 2所示:

2中第一行的CTL8 byte setup packet of a USB control transfer)可以看出,第二位a3即为我们自定义的代码;第一位的40代表host为输出(OUT);从第二行的OUT可以看出,这8位即为我们要写入RAM中的数据。

3中第一行的CTL8 byte setup packet of a USB control transfer)可以看出,第二位a3即为我们自定义的代码;第一位的C0代表host为输入(IN);从第二行的IN可以看出,这8位即为我们在上一步中写入RAM中的数据。

USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM 

2 BUS Hound抓取数据传输(OUT

USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM 

3 BUS Hound抓取数据传输(IN

如果我们把EZ_USB interface中的配置设为 4所示,则得到的数据如 5所示,这里不多解释,在后面的代码解析中会提到。

USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM

4 EZ_USB interface中的配置

USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM 

5 BUS Hound抓取数据传输(IN

3. 代码解析

令牌包使用的是端口0进行通信。

代码中的主要部分就是SetUpCommand_FX2() 函数,这个函数对上位机SetUp令牌包的数据解析,执行相应的操作。

函数中首先对控制传输的令牌包的第二位进行判断,如 6中的①和 7中的⑤所示,由 8可以得出, 6中的①判断CTL中的第二位是否为0xA3, 7中的⑤判断CTL中的第二位是否为0xAC,然后进行相应的操作。

6中的②为获得上位机要写入RAM中的地址(CTL的第2位(L)和第3位(H))和数据长度(CTL的第6位(L)和第7位(H)),这里的这个“地址”和“数据长度”分别对应 1中的Value”和“Length”,

注意:Value中的要按照正常顺序书写,如果Value值为0x0001,则对应的地址为0x0001,上位机发送的时候,会自动调整顺序。

6中的③和 7中的④表示SetUpCommand_FX2()函数检测host是输出(OUT)还是输入(IN),如果是输出(VR_DOWNLOAD),则将EP0BUF_FX2中的数据依次存入RAM中,如果是输入(VR_UPLOAD),则将RAM中的数据依次放入EP0BUF_FX2中,实现对RAM的读取。

7中的⑤是当检测到CTL中的第二位为0xAC时,需要作出的响应,这里是回一位数据1,这里的数据长度和数据值都可以由用户自己定义,实现自己的提示功能。读取时,按照 4配置EZ_USB interface即可。 

USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM 

令牌包解析代码 a

USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM

令牌包解析代码 b

 USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM

令牌包解析代码 c