V-USB USB设备模拟原理分析
通过分析V-USB项目的核心文件,详细解释这个项目是如何在AVR微控制器上模拟USB设备的:
1. 整体架构
V-USB是一个纯软件实现的USB低速设备驱动,主要由以下几个核心文件组成:
usbdrv.c
: USB协议栈的C语言实现usbdrvasm.S
: 时序关键的汇编代码实现oddebug.c
: 调试功能main.c
: HID数据传输示例应用
2. 硬件接口模拟
USB信号线连接
从 usbconfig.h
可以看到:
#define USB_CFG_IOPORTNAME D
#define USB_CFG_DMINUS_BIT 4 // D-连接到PD4
#define USB_CFG_DPLUS_BIT 2 // D+连接到PD2 (也是INT0)
中断驱动机制
- D+线连接到硬件中断INT0,用于检测USB数据包的开始
- 使用外部中断触发USB数据包的接收和处理
- 通过精确的时序控制来模拟USB协议的电气特性
3. 软件协议栈实现
USB描述符定义
在 usbdrv.c
中定义了标准的USB描述符:
// 设备描述符
PROGMEM const char usbDescriptorDevice[] = {18, /* 描述符长度 */USBDESCR_DEVICE, /* 描述符类型 */0x10, 0x01, /* USB版本 */// ... 其他字段
};// 配置描述符
PROGMEM const char usbDescriptorConfiguration[] = {// 配置描述符内容
};
HID报告描述符
在 main.c
中定义了HID设备的报告描述符:
PROGMEM const char usbHidReportDescriptor[22] = {0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop)0x09, 0x01, // USAGE (Vendor Usage 1)0xa1, 0x01, // COLLECTION (Application)// ... 定义128字节的特征报告
};
4. 时序关键的汇编实现
CRC计算
usbdrvasm.S
包含了高效的CRC16计算实现:
usbCrc16:mov ptrL, argPtrLmov ptrH, argPtrHldi resCrcL, 0xFFldi resCrcH, 0xFF// ... CRC计算循环
时钟频率适配
根据不同的时钟频率包含相应的汇编实现:
#if USB_CFG_CLOCK_KHZ == 12000
# include "usbdrvasm12.inc"
#elif USB_CFG_CLOCK_KHZ == 16000
# include "usbdrvasm16.inc"
// ... 其他频率
5. USB协议处理
Setup请求处理
函数处理USB控制传输:
usbMsgLen_t usbFunctionSetup(uchar data[8])
{usbRequest_t *rq = (void *)data;if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){if(rq->bRequest == USBRQ_HID_GET_REPORT){// 处理HID GET_REPORT请求bytesRemaining = 128;currentAddress = 0;return USB_NO_MSG; // 使用usbFunctionRead()获取数据}// ... 其他HID请求处理}return 0;
}
数据传输函数
- : 从EEPROM读取数据发送给主机
- : 接收主机数据写入EEPROM
6. 调试支持
oddebug.c
提供了串口调试功能:
void odDebug(uchar prefix, uchar *data, uchar len)
{printHex(prefix);uartPutc(':');while(len--){uartPutc(' ');printHex(*data++);}// 输出调试信息到串口
}
7. 关键技术特点
精确时序控制
- 必须在7个位时间内开始回复USB请求
- 使用汇编代码确保关键路径的时序精度
- 支持12MHz、15MHz、16MHz、20MHz等时钟频率
低速USB实现
- 仅支持USB低速模式(1.5 Mbps)
- 使用1.5kΩ上拉电阻连接D-到3.3V标识为低速设备
- 通过软件位填充和解填充处理USB数据
中断驱动架构
- 整个USB通信在中断服务程序中处理
- 中断延迟不能超过25个时钟周期
- 支持端点0(控制传输)和可选的中断端点
总结
V-USB通过巧妙的软硬件结合,在没有专用USB硬件的AVR微控制器上实现了完整的USB设备功能。它使用GPIO引脚模拟USB信号线,通过外部中断检测数据包,用精确的汇编代码处理时序关键的USB协议,并提供了完整的USB协议栈实现。这个项目展示了如何用纯软件方法实现复杂的硬件协议,是嵌入式系统中软件模拟硬件的经典案例。