以下是使用EZ-USB FX2LP CY7C68013A开发大容量存储设备的逐步指南:
1. 理解基础架构
- FX2LP核心特点:
- 支持USB 2.0全速(12 Mbps)和高速(480 Mbps)。
- 包含8051微控制器内核,需编写固件实现设备逻辑。
- 提供GPIF(通用可编程接口)和Slave FIFO模式,适合与外部存储介质通信。
2. 准备开发环境
- 所需工具:
- Keil C51编译器:用于编译8051固件。
- Cypress SDK:下载Cypress FX2LP SDK中的开发包。
- Cypress Control Center/ CyConsole:用于固件下载和调试。
- USB协议分析工具(如Wireshark或USBlyzer):用于调试USB通信。
3. 配置USB描述符
修改固件中的USB描述符以匹配Mass Storage Class (MSC):
// 设备描述符(部分示例)
code USB_DEVICE_DESCRIPTOR device_descriptor = {
0x12, // bLength
0x01, // bDescriptorType (DEVICE)
0x0200, // bcdUSB (USB 2.0)
0x00, // bDeviceClass (由接口描述符定义)
0x00, // bDeviceSubClass
0x00, // bDeviceProtocol
0x40, // bMaxPacketSize0 (64 bytes)
0x1234, // idVendor (自定义VID)
0x5678, // idProduct (自定义PID)
0x0000, // bcdDevice
0x01, // iManufacturer
0x02, // iProduct
0x03, // iSerialNumber
0x01 // bNumConfigurations
};
// 接口描述符
code USB_INTERFACE_DESCRIPTOR interface_descriptor = {
0x09, // bLength
0x04, // bDescriptorType (INTERFACE)
0x00, // bInterfaceNumber
0x00, // bAlternateSetting
0x02, // bNumEndpoints (Bulk-IN和Bulk-OUT)
0x08, // bInterfaceClass (MSC)
0x06, // bInterfaceSubClass (SCSI)
0x50, // bInterfaceProtocol (Bulk-Only Transport)
0x00 // iInterface
};
// 端点描述符(Bulk-IN和Bulk-OUT)
code USB_ENDPOINT_DESCRIPTOR endpoints[] = {
{0x07, 0x05, 0x82, 0x02, 0x0200, 0x00}, // EP2 IN (Bulk, 512 bytes)
{0x07, 0x05, 0x02, 0x02, 0x0200, 0x00} // EP2 OUT (Bulk, 512 bytes)
};
4. 实现BOT协议和SCSI命令
Bulk-Only Transport (BOT)流程:
- 主机发送CBW(Command Block Wrapper)。
- 设备执行命令(如读/写)。
- 设备返回CSW(Command Status Wrapper)。
关键SCSI命令处理:
void handle_scsi_command(void) {
switch (cbw.CB[0]) {
case SCSI_INQUIRY:
// 返回设备信息(厂商、产品名等)
send_inquiry_data();
break;
case SCSI_READ_CAPACITY:
// 返回存储容量(如512字节/扇区,总扇区数)
send_capacity_data();
break;
case SCSI_READ_10:
// 从存储介质读取数据
read_sectors(cbw.CB[2], cbw.CB[7] << 8 | cbw.CB[8]);
break;
case SCSI_WRITE_10:
// 写入数据到存储介质
write_sectors(cbw.CB[2], cbw.CB[7] << 8 | cbw.CB[8]);
break;
default:
// 返回错误状态
send_csw(CSW_FAILED);
break;
}
}
5. 存储介质接口
6. 调试与测试
枚举测试:
- 使用USBlyzer查看设备是否正确识别为MSC设备。
- 检查描述符是否匹配(类代码0x08,子类0x06,协议0x50)。
命令测试:
- 发送
READ_CAPACITY命令,确认返回的容量数据正确。
- 使用
dd(Linux)或WinHex(Windows)执行读写测试。
性能优化:
- 调整GPIF波形以提高传输速度。
- 使用双缓冲或多块传输减少延迟。
7. 参考资料
- 文档:
- 示例代码:
- 参考Cypress SDK中的
fw/bulkloop示例,修改为MSC逻辑。
通过以上步骤,您可以将FX2LP配置为一个大容量存储设备。如果遇到具体问题(如命令超时或数据错误),请进一步分析USB日志或检查存储介质的底层驱动!