CH549G 在win11下程序下載后不征程運行

我用WCHISPStudio通過USB下載程序后,程序不會正常運行。ff8e95de385c4072ba4316beb8c5787d.png

我沒有焊接2.4G和FLASH。PCB這是PCB圖。


我是修改官網(wǎng)的示例代碼CompositeKM。在win10下我直接下載CompositeKM.hex,電腦可以識別到鼠標(biāo)和鍵盤。但在win11上下載我改過的代碼或者原示例代碼CompositeKM,電腦就識別不到鼠標(biāo)和鍵盤好像程序就沒有運行。哪位大神幫我看看問題出在哪

image.pngimage.png

這是我焊接后的板子。

從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);??

}

}


您好

例程測試沒有問題,說明是程序部分內(nèi)容書寫有問題,可以找一些抓包工具看下枚舉通訊流程,卡在了那一條數(shù)據(jù)傳輸,對比正常的進(jìn)行修改,另外,可以直接附上.C文件。


不行啊image.png附件只能傳圖片。官方的hex下載沒問題,我用一樣的代碼,編譯后,下載,就不識別。我看看是什么問題。謝謝你


還有就是,我用的是keil 5 編譯后就不行


可以打包成壓縮包一起發(fā)送哦,可以將問題和代碼發(fā)送至郵箱dxy@wch.cn


可以發(fā)一個CH5490GHID鼠標(biāo)移動的相對移動和絕對移動的代碼,鼠標(biāo)的上下左右移動


暫時沒有這樣的例程哦,前面提到的程序下載異常問題解決了嗎


解決了,image.png要點這里。官方文檔沒有這步



可以實現(xiàn)鼠標(biāo)相對移動和絕對移動的示例代碼,不管什么芯片,隨便一個只要能實現(xiàn)的代碼,能給發(fā)一下嗎個人信息保護(hù),已隱藏。謝謝


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频