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協議棧實現。這個項目展示了如何用純軟件方法實現復雜的硬件協議,是嵌入式系統中軟件模擬硬件的經典案例。