V-USB USB设备模拟原理分析

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, argPtrL
    mov     ptrH, argPtrH
    ldi     resCrcL, 0xFF
    ldi     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协议栈实现。这个项目展示了如何用纯软件方法实现复杂的硬件协议,是嵌入式系统中软件模拟硬件的经典案例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值