我用WCHISPStudio通過USB下載程序后,程序不會正常運行。
我沒有焊接2.4G和FLASH。PCB這是PCB圖。
我是修改官網(wǎng)的示例代碼CompositeKM。在win10下我直接下載CompositeKM.hex,電腦可以識別到鼠標(biāo)和鍵盤。但在win11上下載我改過的代碼或者原示例代碼CompositeKM,電腦就識別不到鼠標(biāo)和鍵盤好像程序就沒有運行。哪位大神幫我看看問題出在哪
這是我焊接后的板子。
從CfgFsys就沒有往下再執(zhí)行。下面的是我的代碼:
/********************************** (C) COPYRIGHT *******************************
* File Name? ? ? ? ? : CompositeKM.C
* Author? ? ? ? ? ? ?: WCH
* Version? ? ? ? ? ? : V1.0?
* Date? ? ? ? ? ? ? ?: 2018/08/15
* Description? ? ? ? : CH549模擬USB鍵鼠復(fù)合設(shè)備,支持類命令,支持喚醒
? ? ? ? ? ? ? ? ? ? ? ?演示鍵盤鼠標(biāo)簡單操作。其他鍵值,參考 HID USAGE TABLE協(xié)議文檔
? ?串口0接收字符:
? ?‘L’:鼠標(biāo)左鍵??
? ?‘R’: 鼠標(biāo)右鍵
? ?‘A’: 鍵盤‘A’鍵
? ?‘Q’: 鍵盤‘Caps’鍵
任意字符:主機(jī)睡眠狀態(tài)下,設(shè)備遠(yuǎn)程喚醒主機(jī)(注意設(shè)備一般需自供電,因為主機(jī)休眠可能USB口也會掉電)
*******************************************************************************/
#include
#include
#include "PWM.H"
//#define Fullspeed
#define LED1 P2_2
#define LED2 P2_4
//#ifdef? Fullspeed
//#define THIS_ENDP0_SIZE? ? ? ? ?64
//#else
#define THIS_ENDP0_SIZE? ? ? ? ?8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //低速USB,中斷傳輸、控制傳輸最大包長度為8
//#endif
#define EP1_IN_SIZE? ? ? ? ? ? ?8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //鍵盤端點數(shù)據(jù)包大小
#define EP2_IN_SIZE? ? ? ? ? ? ?4? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //鼠標(biāo)端點數(shù)據(jù)包大小
UINT8X? Ep0Buffer[ THIS_ENDP0_SIZE+2 ] _at_ 0x0000;? ? ? ? ? ? ? ? ? ? ? ? ? ? //端點0 OUT&IN緩沖區(qū),必須是偶地址
UINT8X? Ep1Buffer[ EP1_IN_SIZE+2 ]? ? ?_at_ THIS_ENDP0_SIZE+2;? ? ? ? ? ? ? ? ?//端點1 IN緩沖區(qū),必須是偶地址
UINT8X? Ep2Buffer[ EP2_IN_SIZE+2 ]? ? ?_at_ THIS_ENDP0_SIZE+EP1_IN_SIZE+4;? ? ?//端點2 IN緩沖區(qū),必須是偶地址
UINT8? ?SetupReq,Ready,UsbConfig;
UINT16? SetupLen;
PUINT8? pDescr;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USB配置標(biāo)志
USB_SETUP_REQ? ?SetupReqBuf;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//暫存Setup包
#define UsbSetupBuf? ? ?((PUSB_SETUP_REQ)Ep0Buffer)
#pragma? NOAREGS
/*設(shè)備描述符*/
UINT8C DevDesc[] = { 0x12,0x01,0x10,0x01,0x00,0x00,0x00,THIS_ENDP0_SIZE,
? ? ? ? ? ? ? ? ? ? ?0x86,0x1a,0xe1,0xe6,0x00,0x01,0x01,0x02,
? ? ? ? ? ? ? ? ? ? ?0x00,0x01
? ? ? ? ? ? ? ? ? ?};
/*字符串描述符*/
UINT8C MyLangDescr[] = { 0x04, 0x03, 0x09, 0x04 };? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 語言描述符
UINT8C MyManuInfo[] = { 0x0E, 0x03, 'w', 0, 'c', 0, 'h', 0, '.', 0, 'c', 0, 'n', 0 }; // 廠家信息
UINT8C MyProdInfo[] = { 0x0C, 0x03, 'C', 0, 'H', 0, '5', 0, '4', 0, '9', 0 };? ? ? ? ?// 產(chǎn)品信息? ? ? ? ? ? ? ? ? ? ? ??
/*HID類報表描述符*/
UINT8C KeyRepDesc[] =
{
? ? 0x05,0x01,0x09,0x06,0xA1,0x01,0x05,0x07,
? ? 0x19,0xe0,0x29,0xe7,0x15,0x00,0x25,0x01,
? ? 0x75,0x01,0x95,0x08,0x81,0x02,0x95,0x01,
? ? 0x75,0x08,0x81,0x01,0x95,0x03,0x75,0x01,
? ? 0x05,0x08,0x19,0x01,0x29,0x03,0x91,0x02,
? ? 0x95,0x05,0x75,0x01,0x91,0x01,0x95,0x06,
? ? 0x75,0x08,0x26,0xff,0x00,0x05,0x07,0x19,
? ? 0x00,0x29,0x91,0x81,0x00,0xC0
};
UINT8C MouseRepDesc[] =
{
? ? 0x05,0x01,0x09,0x02,0xA1,0x01,0x09,0x01,
? ? 0xA1,0x00,0x05,0x09,0x19,0x01,0x29,0x03,
? ? 0x15,0x00,0x25,0x01,0x75,0x01,0x95,0x03,
? ? 0x81,0x02,0x75,0x05,0x95,0x01,0x81,0x01,
? ? 0x05,0x01,0x09,0x30,0x09,0x31,0x09,0x38,
? ? 0x15,0x81,0x25,0x7f,0x75,0x08,0x95,0x03,
? ? 0x81,0x06,0xC0,0xC0
};
/*配置描述符*/
UINT8C CfgDesc[] =
{
? ? 0x09,0x02,0x3b,0x00,0x02,0x01,0x00,0xA0,0x32,? ? ? ? ? ? ? ? ? ? //配置描述符
? ? 0x09,0x04,0x00,0x00,0x01,0x03,0x01,0x01,0x00,? ? ? ? ? ? ? ? ? ? //接口描述符,鍵盤
? ? 0x09,0x21,0x11,0x01,0x00,0x01,0x22,sizeof(KeyRepDesc)&0xFF,sizeof(KeyRepDesc)>>8,//HID類描述符
? ? 0x07,0x05,0x81,0x03,EP1_IN_SIZE,0x00,0x0a,? ? ? ? ? ? ? ? ? ? ? ?//端點描述符
? ? 0x09,0x04,0x01,0x00,0x01,0x03,0x01,0x02,0x00,? ? ? ? ? ? ? ? ? ? //接口描述符,鼠標(biāo)
? ? 0x09,0x21,0x10,0x01,0x00,0x01,0x22,sizeof(MouseRepDesc)&0xFF,sizeof(MouseRepDesc)>>8,//HID類描述符
? ? 0x07,0x05,0x82,0x03,EP2_IN_SIZE,0x00,0x0a? ? ? ? ? ? ? ? ? ? ? ? //端點描述符
};
/*鍵盤數(shù)據(jù)*/
UINT8 HIDKey[EP1_IN_SIZE];
/*鼠標(biāo)數(shù)據(jù)*/
UINT8 HIDMouse[EP2_IN_SIZE];
UINT8 Endp1Busy = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//傳輸完成控制標(biāo)志位
UINT8 Endp2Busy = 0;
UINT8 WakeUpEnFlag = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //遠(yuǎn)程喚醒使能標(biāo)志
UINT8 i = 0;
/*******************************************************************************
* Function Name? : CH554USBDevWakeup()
* Description? ? : CH554設(shè)備模式喚醒主機(jī),發(fā)送K信號
* Input? ? ? ? ? : None
* Output? ? ? ? ?: None
* Return? ? ? ? ?: None
*******************************************************************************/
void CH554USBDevWakeup( )
{
#ifdef Fullspeed
UDEV_CTRL |= bUD_LOW_SPEED;
mDelaymS(2);
UDEV_CTRL &= ~bUD_LOW_SPEED;
#else
UDEV_CTRL &= ~bUD_LOW_SPEED;
mDelaymS(2);
UDEV_CTRL |= bUD_LOW_SPEED;
#endif
}
/*******************************************************************************
* Function Name? : USBDeviceInit()
* Description? ? : USB設(shè)備模式配置,設(shè)備模式啟動,收發(fā)端點配置,中斷開啟
* Input? ? ? ? ? : None
* Output? ? ? ? ?: None
* Return? ? ? ? ?: None
*******************************************************************************/
void USBDeviceInit()
{
IE_USB = 0;
USB_CTRL = 0x00;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 先設(shè)定USB設(shè)備模式
UDEV_CTRL = bUD_PD_DIS;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 禁止DP/DM下拉電阻
#ifndef Fullspeed
? ? UDEV_CTRL |= bUD_LOW_SPEED;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //選擇低速1.5M模式
? ? USB_CTRL |= bUC_LOW_SPEED;
#else
? ? UDEV_CTRL &= ~bUD_LOW_SPEED;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//選擇全速12M模式,默認(rèn)方式
? ? USB_CTRL &= ~bUC_LOW_SPEED;
#endif
? ? UEP1_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //預(yù)使用發(fā)送長度一定要清空
? ? UEP2_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //預(yù)使用發(fā)送長度一定要清空
? ? UEP2_DMA = Ep2Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端點2數(shù)據(jù)傳輸?shù)刂?/p>
? ? UEP2_3_MOD = UEP2_3_MOD & ~bUEP2_BUF_MOD | bUEP2_TX_EN;? ? ? ? ? ? ? ? ? ? //端點2發(fā)送使能 64字節(jié)緩沖區(qū)
? ? UEP2_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端點2自動翻轉(zhuǎn)同步標(biāo)志位,IN事務(wù)返回NAK
? ? UEP0_DMA = Ep0Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端點0數(shù)據(jù)傳輸?shù)刂?/p>
? ? UEP4_1_MOD &= ~(bUEP4_RX_EN | bUEP4_TX_EN);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端點0單64字節(jié)收發(fā)緩沖區(qū)
? ? UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//OUT事務(wù)返回ACK,IN事務(wù)返回NAK
? ? UEP1_DMA = Ep1Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端點1數(shù)據(jù)傳輸?shù)刂?/p>
? ? UEP4_1_MOD = UEP4_1_MOD & ~bUEP1_BUF_MOD | bUEP1_TX_EN;? ? ? ? ? ? ? ? ? ? //端點1發(fā)送使能 64字節(jié)緩沖區(qū)
? ? UEP1_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端點1自動翻轉(zhuǎn)同步標(biāo)志位,IN事務(wù)返回NAK
USB_DEV_AD = 0x00;
USB_CTRL |= bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN;? ? ? ? ? ? ? ? ? ? ?// 啟動USB設(shè)備及DMA,在中斷期間中斷標(biāo)志未清除前自動返回NAK
UDEV_CTRL |= bUD_PORT_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 允許USB端口
USB_INT_FG = 0xFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 清中斷標(biāo)志
USB_INT_EN = bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST;
IE_USB = 1;
}
/*******************************************************************************
* Function Name? : Enp1IntIn
* Description? ? : USB設(shè)備模式端點1的中斷上傳
* Input? ? ? ? ? : None
* Output? ? ? ? ?: None
* Return? ? ? ? ?: None
*******************************************************************************/
void Enp1IntIn( UINT8 *buf,UINT8 len )
{
? ? memcpy( Ep1Buffer, buf, len );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加載上傳數(shù)據(jù)
? ? UEP1_T_LEN = len;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//上傳數(shù)據(jù)長度
? ? UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK;? ? ? ? ? ? ? ? ?//有數(shù)據(jù)時上傳數(shù)據(jù)并應(yīng)答ACK
}
/*******************************************************************************
* Function Name? : Enp2IntIn()
* Description? ? : USB設(shè)備模式端點2的中斷上傳
* Input? ? ? ? ? : None
* Output? ? ? ? ?: None
* Return? ? ? ? ?: None
*******************************************************************************/
void Enp2IntIn( UINT8 *buf,UINT8 len )
{
? ? memcpy( Ep2Buffer, buf, len);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加載上傳數(shù)據(jù)
? ? UEP2_T_LEN = len;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //上傳數(shù)據(jù)長度
? ? UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK;? ? ? ? ? ? ? ? ? //有數(shù)據(jù)時上傳數(shù)據(jù)并應(yīng)答ACK
}
/*******************************************************************************
* Function Name? : DeviceInterrupt()
* Description? ? : CH559USB中斷處理函數(shù)
*******************************************************************************/
void? ? DeviceInterrupt( void ) interrupt INT_NO_USB using 1? ? ? ? ? ? ? ? ? ? //USB中斷服務(wù)程序,使用寄存器組1
{
? ? UINT16 len = 0;
? ? if(UIF_TRANSFER)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USB傳輸完成標(biāo)志
? ? {
? ? ? ? switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))
? ? ? ? {
? ? ? ? case UIS_TOKEN_IN | 2:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //endpoint 2# 中斷端點上傳
? ? ? ? ? ? UEP2_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//預(yù)使用發(fā)送長度一定要清空
//? ? ? ? ? ? UEP1_CTRL ^= bUEP_T_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果不設(shè)置自動翻轉(zhuǎn)則需要手動翻轉(zhuǎn)
? ? ? ? ? ? Endp2Busy = 0;
UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;? ? ? ? ? ?//默認(rèn)應(yīng)答NAK
? ? ? ? ? ? break;
? ? ? ? case UIS_TOKEN_IN | 1:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //endpoint 1# 中斷端點上傳
? ? ? ? ? ? UEP1_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//預(yù)使用發(fā)送長度一定要清空
//? ? ? ? ? ? UEP2_CTRL ^= bUEP_T_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果不設(shè)置自動翻轉(zhuǎn)則需要手動翻轉(zhuǎn)
? ? ? ? ? ? Endp1Busy = 0;
UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;? ? ? ? ? ?//默認(rèn)應(yīng)答NAK
? ? ? ? ? ? break;
? ? ? ? case UIS_TOKEN_SETUP | 0:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//SETUP事務(wù)
UEP0_CTRL = UEP0_CTRL & (~MASK_UEP_T_RES )| UEP_T_RES_NAK;? ? ? ? ? //預(yù)置NAK,防止stall之后不及時清除響應(yīng)方式
? ? ? ? ? ? len = USB_RX_LEN;
? ? ? ? ? ? if(len == (sizeof(USB_SETUP_REQ)))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? SetupLen = ((UINT16)UsbSetupBuf->wLengthH<<8) usbsetupbuf-="">wLengthL;
? ? ? ? ? ? ? ? len = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 默認(rèn)為成功并且上傳0長度
? ? ? ? ? ? ? ? SetupReq = UsbSetupBuf->bRequest;
? ? ? ? ? ? ? ? if ( ( UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD )/* HID類命令 */
? ? ? ? ? ? ? ? {
switch( SetupReq )?
{
case 0x01://GetReport
break;
case 0x02://GetIdle
break;
case 0x03://GetProtocol
break;
case 0x09://SetReport
break;
case 0x0A://SetIdle
break;
case 0x0B://SetProtocol
break;
default:
len = 0xFFFF;? ? ?/*命令不支持*/
break;
}
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//標(biāo)準(zhǔn)請求
? ? ? ? ? ? ? ? ? ? switch(SetupReq)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //請求碼
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? case USB_GET_DESCRIPTOR:
? ? ? ? ? ? ? ? ? ? ? ? switch(UsbSetupBuf->wValueH)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? case 1:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)備描述符
? ? ? ? ? ? ? ? ? ? ? ? ? ? pDescr = DevDesc;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//把設(shè)備描述符送到要發(fā)送的緩沖區(qū)
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = sizeof(DevDesc);
? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? case 2:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//配置描述符
? ? ? ? ? ? ? ? ? ? ? ? ? ? pDescr = CfgDesc;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//把設(shè)備描述符送到要發(fā)送的緩沖區(qū)
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = sizeof(CfgDesc);
? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
case 3:
switch( UsbSetupBuf->wValueL ) {
case 1:
pDescr = (PUINT8)( &MyManuInfo[0] );
len = sizeof( MyManuInfo );
break;
case 2:
pDescr = (PUINT8)( &MyProdInfo[0] );
len = sizeof( MyProdInfo );
break;
case 0:
pDescr = (PUINT8)( &MyLangDescr[0] );
len = sizeof( MyLangDescr );
break;
default:
len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ?// 不支持的字符串描述符
break;
}
break;
? ? ? ? ? ? ? ? ? ? ? ? case 0x22:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //報表描述符
? ? ? ? ? ? ? ? ? ? ? ? ? ? if(UsbSetupBuf->wIndexL == 0)? ? ? ? ? ? ? ? ? ?//接口0報表描述符
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pDescr = KeyRepDesc;? ? ? ? ? ? ? ? ? ? ? ? //數(shù)據(jù)準(zhǔn)備上傳
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = sizeof(KeyRepDesc);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? else if(UsbSetupBuf->wIndexL == 1)? ? ? ? ? ? ? //接口1報表描述符
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pDescr = MouseRepDesc;? ? ? ? ? ? ? ? ? ? ? //數(shù)據(jù)準(zhǔn)備上傳
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = sizeof(MouseRepDesc);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//本程序只有2個接口,這句話正常不可能執(zhí)行
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//不支持的命令或者出錯
? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? if ( SetupLen > len )
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? SetupLen = len;? ? //限制總長度
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次傳輸長度
? ? ? ? ? ? ? ? ? ? ? ? memcpy(Ep0Buffer,pDescr,len);? ? ? ? ? ? ? ? ? ? ? ? //加載上傳數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ? ? SetupLen -= len;
? ? ? ? ? ? ? ? ? ? ? ? pDescr += len;
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case USB_SET_ADDRESS:
? ? ? ? ? ? ? ? ? ? ? ? SetupLen = UsbSetupBuf->wValueL;? ? ? ? ? ? ? ? ? ? ?//暫存USB設(shè)備地址
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case USB_GET_CONFIGURATION:
? ? ? ? ? ? ? ? ? ? ? ? Ep0Buffer[0] = UsbConfig;
? ? ? ? ? ? ? ? ? ? ? ? if ( SetupLen >= 1 )
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 1;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case USB_SET_CONFIGURATION:
? ? ? ? ? ? ? ? ? ? ? ? UsbConfig = UsbSetupBuf->wValueL;
if(UsbConfig)
{
#ifdef DE_PRINTF
printf("SET CONFIG.\n");
#endif
Ready = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//set config命令一般代表usb枚舉完成的標(biāo)志
}
break;
? ? ? ? ? ? ? ? ? ? case 0x0A:
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case USB_CLEAR_FEATURE:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //Clear Feature
? ? ? ? ? ? ? ? ? ? ? ? if ( ( UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )// 端點
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? switch( UsbSetupBuf->wIndexL )
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x82:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP2_CTRL = UEP2_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x81:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x01:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_R_TOG | MASK_UEP_R_RES ) | UEP_R_RES_ACK;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不支持的端點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? if ( ( UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_DEVICE )// 設(shè)備
? ? ? ? ? ? ? ? ? ? ? ? {
WakeUpEnFlag = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
printf("Wake up\n");
break;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不是端點不支持
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case USB_SET_FEATURE:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Set Feature */
? ? ? ? ? ? ? ? ? ? ? ? if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x00 )? ? ? ? ? ? ? /* 設(shè)置設(shè)備 */
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? if( ( ( ( UINT16 )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x01 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if( CfgDesc[ 7 ] & 0x20 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
WakeUpEnFlag = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置喚醒使能標(biāo)志 */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? printf("Enable Remote Wakeup.\n");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 操作失敗 */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 操作失敗 */
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x02 )? ? ? ? /* 設(shè)置端點 */
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? if( ( ( ( UINT16 )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x00 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? switch( ( ( UINT16 )UsbSetupBuf->wIndexH << 8 ) | UsbSetupBuf->wIndexL )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x82:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 設(shè)置端點2 IN STALL */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x02:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL;/* 設(shè)置端點2 OUT Stall */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x81:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 設(shè)置端點1 IN STALL */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//操作失敗
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//操作失敗
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //操作失敗
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case USB_GET_STATUS:
? ? ? ? ? ? ? ? ? ? ? ? Ep0Buffer[0] = 0x00;
? ? ? ? ? ? ? ? ? ? ? ? Ep0Buffer[1] = 0x00;
? ? ? ? ? ? ? ? ? ? ? ? if ( SetupLen >= 2 )
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 2;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? len = SetupLen;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//操作失敗
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//包長度錯誤
? ? ? ? ? ? }
? ? ? ? ? ? if(len == 0xFFFF)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? SetupReq = 0xFF;
? ? ? ? ? ? ? ? UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL;//STALL
? ? ? ? ? ? }
? ? ? ? ? ? else if(len)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //上傳數(shù)據(jù)或者狀態(tài)階段返回0長度包
? ? ? ? ? ? {
? ? ? ? ? ? ? ? UEP0_T_LEN = len;
? ? ? ? ? ? ? ? UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默認(rèn)數(shù)據(jù)包是DATA1,返回應(yīng)答ACK
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? UEP0_T_LEN = 0;? //雖然尚未到狀態(tài)階段,但是提前預(yù)置上傳0長度數(shù)據(jù)包以防主機(jī)提前進(jìn)入狀態(tài)階段
? ? ? ? ? ? ? ? UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默認(rèn)數(shù)據(jù)包是DATA1,返回應(yīng)答ACK
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case UIS_TOKEN_IN | 0:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//endpoint0 IN
? ? ? ? ? ? switch(SetupReq)
? ? ? ? ? ? {
? ? ? ? ? ? case USB_GET_DESCRIPTOR:
? ? ? ? ? ? ? ? len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen;? ? //本次傳輸長度
? ? ? ? ? ? ? ? memcpy( Ep0Buffer, pDescr, len );? ? ? ? ? ? ? ? ? ? ? ? ? ? //加載上傳數(shù)據(jù)
? ? ? ? ? ? ? ? SetupLen -= len;
? ? ? ? ? ? ? ? pDescr += len;
? ? ? ? ? ? ? ? UEP0_T_LEN = len;
? ? ? ? ? ? ? ? UEP0_CTRL ^= bUEP_T_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//同步標(biāo)志位翻轉(zhuǎn)
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case USB_SET_ADDRESS:
? ? ? ? ? ? ? ? USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen;
? ? ? ? ? ? ? ? UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? UEP0_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //狀態(tài)階段完成中斷或者是強(qiáng)制上傳0長度數(shù)據(jù)包結(jié)束控制傳輸
? ? ? ? ? ? ? ? UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case UIS_TOKEN_OUT | 0:? // endpoint0 OUT
? ? ? ? ? ? len = USB_RX_LEN;
? ? ? ? ? ? if(SetupReq == 0x09)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(Ep0Buffer[0])
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? printf("Light on Num Lock LED!\n");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else if(Ep0Buffer[0] == 0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? printf("Light off Num Lock LED!\n");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? UEP0_CTRL ^= bUEP_R_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //同步標(biāo)志位翻轉(zhuǎn)
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? UIF_TRANSFER = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//寫0清空中斷
? ? }
? ? else if(UIF_BUS_RST)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //設(shè)備模式USB總線復(fù)位中斷
? ? {
? ? ? ? UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
? ? ? ? UEP1_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK;
? ? ? ? UEP2_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK;
? ? ? ? USB_DEV_AD = 0x00;
? ? ? ? UIF_SUSPEND = 0;
? ? ? ? UIF_TRANSFER = 0;
Ready = 0;
? ? ? ? UIF_BUS_RST = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//清中斷標(biāo)志
? ? }
? ? else if (UIF_SUSPEND)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//USB總線掛起/喚醒完成
? ? {
? ? ? ? UIF_SUSPEND = 0;
? ? ? ? if ( USB_MIS_ST & bUMS_SUSPEND )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //掛起
? ? ? ? {
#ifdef DE_PRINTF
? ? ? ? ? ? printf( "z" );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //睡眠狀態(tài)
#endif
//? ? ? ? ? ? ?while ( XBUS_AUX & bUART0_TX )
//? ? ? ? ? ? ?{
//? ? ? ? ? ? ? ? ?;? ? //等待發(fā)送完成
//? ? ? ? ? ? ?}
//? ? ? ? ? ? ?SAFE_MOD = 0x55;
//? ? ? ? ? ? ?SAFE_MOD = 0xAA;
//? ? ? ? ? ? ?WAKE_CTRL = bWAK_BY_USB | bWAK_RXD0_LO;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USB或者RXD0有信號時可被喚醒
//? ? ? ? ? ? ?PCON |= PD;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //睡眠
//? ? ? ? ? ? ?SAFE_MOD = 0x55;
//? ? ? ? ? ? ?SAFE_MOD = 0xAA;
//? ? ? ? ? ? ?WAKE_CTRL = 0x00;
? ? ? ? }
else {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 喚醒
#ifdef DE_PRINTF
? ? ? ? ? ? printf( "w" );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
#endif
}
? ? }
? ? else {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //意外的中斷,不可能發(fā)生的情況
? ? ? ? USB_INT_FG = 0xFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清中斷標(biāo)志
#ifdef DE_PRINTF
? ? ? printf("UnknownInt? \n");
#endif
? ? }
}
void HIDValueHandle()
{
? ? UINT8 i;
i = getkey( );
printf( "%c", (UINT8)i );
if( WakeUpEnFlag )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//主機(jī)已休眠
{
CH554USBDevWakeup();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//喚醒主機(jī)
}
else
{
switch(i)
{
//鼠標(biāo)數(shù)據(jù)上傳示例
case 'L':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //左鍵
HIDMouse[0] = 0x01;
while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp2IntIn(HIDMouse,sizeof(HIDMouse));
HIDMouse[0] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//抬起
while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp2IntIn(HIDMouse,sizeof(HIDMouse));
break;
case 'R':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //右鍵
HIDMouse[0] = 0x02;
while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp2IntIn(HIDMouse,sizeof(HIDMouse));
HIDMouse[0] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//抬起
while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp2IntIn(HIDMouse,sizeof(HIDMouse));
break;
//鍵盤數(shù)據(jù)上傳示例
case 'A':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//A鍵
HIDKey[2] = 0x04;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//按鍵開始
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按鍵結(jié)束
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
break;
case 'Q':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//CAP鍵
HIDKey[2] = 0x39;
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按鍵結(jié)束
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
break;
default:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //其他
break;
}
}
}
void my_method(){
//A鍵
HIDKey[2] = 0x04;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//按鍵開始
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按鍵結(jié)束
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
//CAP鍵
HIDKey[2] = 0x39;
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按鍵結(jié)束
while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置為忙狀態(tài)
Enp1IntIn(HIDKey,sizeof(HIDKey));
}
void main()
{?
CfgFsys( );??
mDelaymS(5);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //修改主頻等待內(nèi)部晶振穩(wěn)定,必加
while(1) {
LED1 = 1;
LED1 = 0;
}
//SetPWM1Dat(0); //LED2(藍(lán))初始占空比配置
//SetPWM3Dat(0); //LED1(綠)初始占空比配置
//PWM_SEL_CHANNEL(PWM_CH1, Enable); //啟動通道1輸出使能并配置推挽
//PWM_SEL_CHANNEL(PWM_CH3, Enable); //啟動通道3輸出使能并配置推挽
//mInitSTDIO( );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //串口0初始化
//printf("KM Device start ...\n");
USBDeviceInit();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USB設(shè)備模式初始化
EA = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//允許單片機(jī)中斷
memset(HIDKey,0,sizeof(HIDKey));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清空緩沖區(qū)
memset(HIDMouse,0,sizeof(HIDMouse));
while(1)
{
if(Ready)
{
//HIDValueHandle();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//串口0,程序會停在getkey函數(shù)等待接收一個字符
my_method();
}
mDelaymS(4);??
}
}