CH549G 在win11下程序下载后不征程运行

我用WCHISPStudio通过USB下载程序后,程序不会正常运行。ff8e95de385c4072ba4316beb8c5787d.png

我没有焊接2.4G和FLASH。PCB这是PCB图。


我是修改官网的示例代码CompositeKM。在win10下我直接下载CompositeKM.hex,电脑可以识别到鼠标和键盘。但在win11上下载我改过的代码或者原示例代码CompositeKM电脑就识别不到鼠标和键盘好像程序就没有运行。哪位大神帮我看看问题出在哪

image.pngimage.png

这是我焊接后的板子。

从CfgFsys就没有往下再执行。下面的是我的代码:


/********************************** (C) COPYRIGHT *******************************

* File Name? ? ? ? ? : CompositeKM.C

* Author? ? ? ? ? ? ?: WCH

* Version? ? ? ? ? ? : V1.0?

* Date? ? ? ? ? ? ? ?: 2018/08/15

* Description? ? ? ? : CH549模拟USB键鼠复合设备,支持类命令,支持唤醒

? ? ? ? ? ? ? ? ? ? ? ?演示键盘鼠标简单操作。其他键值,参考 HID USAGE TABLE协议文档

? ?串口0接收字符:

? ?‘L’:鼠标左键??

? ?‘R’: 鼠标右键

? ?‘A’: 键盘‘A’键

? ?‘Q’: 键盘‘Caps’键

任意字符:主机睡眠状态下,设备远程唤醒主机(注意设备一般需自供电,因为主机休眠可能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? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //键盘端点数据包大小

#define EP2_IN_SIZE? ? ? ? ? ? ?4? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //鼠标端点数据包大小


UINT8X? Ep0Buffer[ THIS_ENDP0_SIZE+2 ] _at_ 0x0000;? ? ? ? ? ? ? ? ? ? ? ? ? ? //端点0 OUT&IN缓冲区,必须是偶地址

UINT8X? Ep1Buffer[ EP1_IN_SIZE+2 ]? ? ?_at_ THIS_ENDP0_SIZE+2;? ? ? ? ? ? ? ? ?//端点1 IN缓冲区,必须是偶地址

UINT8X? Ep2Buffer[ EP2_IN_SIZE+2 ]? ? ?_at_ THIS_ENDP0_SIZE+EP1_IN_SIZE+4;? ? ?//端点2 IN缓冲区,必须是偶地址

UINT8? ?SetupReq,Ready,UsbConfig;

UINT16? SetupLen;

PUINT8? pDescr;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USB配置标志

USB_SETUP_REQ? ?SetupReqBuf;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//暂存Setup包

#define UsbSetupBuf? ? ?((PUSB_SETUP_REQ)Ep0Buffer)


#pragma? NOAREGS

/*设备描述符*/

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 };? ? ? ? ?// 产品信息? ? ? ? ? ? ? ? ? ? ? ??


/*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,? ? ? ? ? ? ? ? ? ? //接口描述符,鼠标

? ? 0x09,0x21,0x10,0x01,0x00,0x01,0x22,sizeof(MouseRepDesc)&0xFF,sizeof(MouseRepDesc)>>8,//HID类描述符

? ? 0x07,0x05,0x82,0x03,EP2_IN_SIZE,0x00,0x0a? ? ? ? ? ? ? ? ? ? ? ? //端点描述符

};


/*键盘数据*/

UINT8 HIDKey[EP1_IN_SIZE];

/*鼠标数据*/

UINT8 HIDMouse[EP2_IN_SIZE];


UINT8 Endp1Busy = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//传输完成控制标志位

UINT8 Endp2Busy = 0;


UINT8 WakeUpEnFlag = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //远程唤醒使能标志


UINT8 i = 0;

/*******************************************************************************

* Function Name? : CH554USBDevWakeup()

* Description? ? : CH554设备模式唤醒主机,发送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设备模式配置,设备模式启动,收发端点配置,中断开启

* Input? ? ? ? ? : None

* Output? ? ? ? ?: None

* Return? ? ? ? ?: None

*******************************************************************************/

void USBDeviceInit()

{

IE_USB = 0;

USB_CTRL = 0x00;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 先设定USB设备模式

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模式,默认方式

? ? USB_CTRL &= ~bUC_LOW_SPEED;

#endif

? ? UEP1_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //预使用发送长度一定要清空

? ? UEP2_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //预使用发送长度一定要清空

? ? UEP2_DMA = Ep2Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端点2数据传输地址

? ? UEP2_3_MOD = UEP2_3_MOD & ~bUEP2_BUF_MOD | bUEP2_TX_EN;? ? ? ? ? ? ? ? ? ? //端点2发送使能 64字节缓冲区

? ? UEP2_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端点2自动翻转同步标志位,IN事务返回NAK

? ? UEP0_DMA = Ep0Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端点0数据传输地址

? ? UEP4_1_MOD &= ~(bUEP4_RX_EN | bUEP4_TX_EN);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端点0单64字节收发缓冲区

? ? UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//OUT事务返回ACK,IN事务返回NAK

? ? UEP1_DMA = Ep1Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端点1数据传输地址

? ? UEP4_1_MOD = UEP4_1_MOD & ~bUEP1_BUF_MOD | bUEP1_TX_EN;? ? ? ? ? ? ? ? ? ? //端点1发送使能 64字节缓冲区

? ? UEP1_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端点1自动翻转同步标志位,IN事务返回NAK

USB_DEV_AD = 0x00;

USB_CTRL |= bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN;? ? ? ? ? ? ? ? ? ? ?// 启动USB设备及DMA,在中断期间中断标志未清除前自动返回NAK

UDEV_CTRL |= bUD_PORT_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 允许USB端口

USB_INT_FG = 0xFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 清中断标志

USB_INT_EN = bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST;

IE_USB = 1;

}

/*******************************************************************************

* Function Name? : Enp1IntIn

* Description? ? : USB设备模式端点1的中断上传

* Input? ? ? ? ? : None

* Output? ? ? ? ?: None

* Return? ? ? ? ?: None

*******************************************************************************/

void Enp1IntIn( UINT8 *buf,UINT8 len )

{

? ? memcpy( Ep1Buffer, buf, len );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加载上传数据

? ? UEP1_T_LEN = len;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//上传数据长度

? ? UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK;? ? ? ? ? ? ? ? ?//有数据时上传数据并应答ACK

}

/*******************************************************************************

* Function Name? : Enp2IntIn()

* Description? ? : USB设备模式端点2的中断上传

* Input? ? ? ? ? : None

* Output? ? ? ? ?: None

* Return? ? ? ? ?: None

*******************************************************************************/

void Enp2IntIn( UINT8 *buf,UINT8 len )

{

? ? memcpy( Ep2Buffer, buf, len);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加载上传数据

? ? UEP2_T_LEN = len;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //上传数据长度

? ? UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK;? ? ? ? ? ? ? ? ? //有数据时上传数据并应答ACK

}

/*******************************************************************************

* Function Name? : DeviceInterrupt()

* Description? ? : CH559USB中断处理函数

*******************************************************************************/

void? ? DeviceInterrupt( void ) interrupt INT_NO_USB using 1? ? ? ? ? ? ? ? ? ? //USB中断服务程序,使用寄存器组1

{

? ? UINT16 len = 0;

? ? if(UIF_TRANSFER)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //USB传输完成标志

? ? {

? ? ? ? switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))

? ? ? ? {

? ? ? ? case UIS_TOKEN_IN | 2:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //endpoint 2# 中断端点上传

? ? ? ? ? ? UEP2_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//预使用发送长度一定要清空

//? ? ? ? ? ? UEP1_CTRL ^= bUEP_T_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果不设置自动翻转则需要手动翻转

? ? ? ? ? ? Endp2Busy = 0;

UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;? ? ? ? ? ?//默认应答NAK

? ? ? ? ? ? break;

? ? ? ? case UIS_TOKEN_IN | 1:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //endpoint 1# 中断端点上传

? ? ? ? ? ? UEP1_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//预使用发送长度一定要清空

//? ? ? ? ? ? UEP2_CTRL ^= bUEP_T_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果不设置自动翻转则需要手动翻转

? ? ? ? ? ? Endp1Busy = 0;

UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;? ? ? ? ? ?//默认应答NAK

? ? ? ? ? ? break;

? ? ? ? case UIS_TOKEN_SETUP | 0:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//SETUP事务

UEP0_CTRL = UEP0_CTRL & (~MASK_UEP_T_RES )| UEP_T_RES_NAK;? ? ? ? ? //预置NAK,防止stall之后不及时清除响应方式

? ? ? ? ? ? len = USB_RX_LEN;

? ? ? ? ? ? if(len == (sizeof(USB_SETUP_REQ)))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? SetupLen = ((UINT16)UsbSetupBuf->wLengthH<<8) usbsetupbuf-="">wLengthL;

? ? ? ? ? ? ? ? len = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 默认为成功并且上传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

? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//标准请求

? ? ? ? ? ? ? ? ? ? switch(SetupReq)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //请求码

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? case USB_GET_DESCRIPTOR:

? ? ? ? ? ? ? ? ? ? ? ? switch(UsbSetupBuf->wValueH)

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? case 1:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设备描述符

? ? ? ? ? ? ? ? ? ? ? ? ? ? pDescr = DevDesc;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//把设备描述符送到要发送的缓冲区

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = sizeof(DevDesc);

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? case 2:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//配置描述符

? ? ? ? ? ? ? ? ? ? ? ? ? ? pDescr = CfgDesc;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//把设备描述符送到要发送的缓冲区

? ? ? ? ? ? ? ? ? ? ? ? ? ? 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;? ? ? ? ? ? ? ? ? ? ? ? //数据准备上传

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = sizeof(KeyRepDesc);

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else if(UsbSetupBuf->wIndexL == 1)? ? ? ? ? ? ? //接口1报表描述符

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pDescr = MouseRepDesc;? ? ? ? ? ? ? ? ? ? ? //数据准备上传

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = sizeof(MouseRepDesc);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//本程序只有2个接口,这句话正常不可能执行

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//不支持的命令或者出错

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? if ( SetupLen > len )

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? SetupLen = len;? ? //限制总长度

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度

? ? ? ? ? ? ? ? ? ? ? ? memcpy(Ep0Buffer,pDescr,len);? ? ? ? ? ? ? ? ? ? ? ? //加载上传数据

? ? ? ? ? ? ? ? ? ? ? ? SetupLen -= len;

? ? ? ? ? ? ? ? ? ? ? ? pDescr += len;

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case USB_SET_ADDRESS:

? ? ? ? ? ? ? ? ? ? ? ? SetupLen = UsbSetupBuf->wValueL;? ? ? ? ? ? ? ? ? ? ?//暂存USB设备地址

? ? ? ? ? ? ? ? ? ? ? ? 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枚举完成的标志

}

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 )// 设备

? ? ? ? ? ? ? ? ? ? ? ? {

WakeUpEnFlag = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

printf("Wake up\n");

break;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不是端点不支持

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? case USB_SET_FEATURE:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Set Feature */

? ? ? ? ? ? ? ? ? ? ? ? if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x00 )? ? ? ? ? ? ? /* 设置设备 */

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? if( ( ( ( UINT16 )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x01 )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if( CfgDesc[ 7 ] & 0x20 )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {

WakeUpEnFlag = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 设置唤醒使能标志 */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? printf("Enable Remote Wakeup.\n");

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 操作失败 */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = 0xFFFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 操作失败 */

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x02 )? ? ? ? /* 设置端点 */

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? 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;/* 设置端点2 IN STALL */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x02:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL;/* 设置端点2 OUT Stall */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x81:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 设置端点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)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //上传数据或者状态阶段返回0长度包

? ? ? ? ? ? {

? ? ? ? ? ? ? ? UEP0_T_LEN = len;

? ? ? ? ? ? ? ? UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默认数据包是DATA1,返回应答ACK

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? UEP0_T_LEN = 0;? //虽然尚未到状态阶段,但是提前预置上传0长度数据包以防主机提前进入状态阶段

? ? ? ? ? ? ? ? UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默认数据包是DATA1,返回应答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 );? ? ? ? ? ? ? ? ? ? ? ? ? ? //加载上传数据

? ? ? ? ? ? ? ? SetupLen -= len;

? ? ? ? ? ? ? ? pDescr += len;

? ? ? ? ? ? ? ? UEP0_T_LEN = len;

? ? ? ? ? ? ? ? UEP0_CTRL ^= bUEP_T_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//同步标志位翻转

? ? ? ? ? ? ? ? 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;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //状态阶段完成中断或者是强制上传0长度数据包结束控制传输

? ? ? ? ? ? ? ? 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;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //同步标志位翻转

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? UIF_TRANSFER = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//写0清空中断

? ? }

? ? else if(UIF_BUS_RST)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //设备模式USB总线复位中断

? ? {

? ? ? ? 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;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//清中断标志

? ? }

? ? else if (UIF_SUSPEND)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//USB总线挂起/唤醒完成

? ? {

? ? ? ? UIF_SUSPEND = 0;

? ? ? ? if ( USB_MIS_ST & bUMS_SUSPEND )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //挂起

? ? ? ? {

#ifdef DE_PRINTF

? ? ? ? ? ? printf( "z" );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //睡眠状态

#endif

//? ? ? ? ? ? ?while ( XBUS_AUX & bUART0_TX )

//? ? ? ? ? ? ?{

//? ? ? ? ? ? ? ? ?;? ? //等待发送完成

//? ? ? ? ? ? ?}

//? ? ? ? ? ? ?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 {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //意外的中断,不可能发生的情况

? ? ? ? USB_INT_FG = 0xFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清中断标志

#ifdef DE_PRINTF

? ? ? printf("UnknownInt? \n");

#endif

? ? }

}

void HIDValueHandle()

{

? ? UINT8 i;

i = getkey( );

printf( "%c", (UINT8)i );

if( WakeUpEnFlag )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//主机已休眠

{

CH554USBDevWakeup();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//唤醒主机

}

else

{

switch(i)

{

//鼠标数据上传示例

case 'L':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //左键

HIDMouse[0] = 0x01;

while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp2IntIn(HIDMouse,sizeof(HIDMouse));

HIDMouse[0] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//抬起

while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp2IntIn(HIDMouse,sizeof(HIDMouse));

break;

case 'R':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //右键

HIDMouse[0] = 0x02;

while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp2IntIn(HIDMouse,sizeof(HIDMouse));

HIDMouse[0] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//抬起

while( Endp2Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp2Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp2IntIn(HIDMouse,sizeof(HIDMouse));

break;

//键盘数据上传示例

case 'A':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//A键

HIDKey[2] = 0x04;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//按键开始

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按键结束

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

break;

case 'Q':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//CAP键

HIDKey[2] = 0x39;

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按键结束

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

break;

default:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //其他

break;

}

}

}

void my_method(){

//A键

HIDKey[2] = 0x04;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//按键开始

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按键结束

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

//CAP键

HIDKey[2] = 0x39;

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

HIDKey[2] = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //按键结束

while( Endp1Busy );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果忙(上一包数据没有传上去),则等待。

Endp1Busy = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//设置为忙状态

Enp1IntIn(HIDKey,sizeof(HIDKey));

}



void main()

{?


CfgFsys( );??

mDelaymS(5);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //修改主频等待内部晶振稳定,必加

while(1) {

LED1 = 1;

LED1 = 0;

}

//SetPWM1Dat(0); //LED2(蓝)初始占空比配置

//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设备模式初始化

EA = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//允许单片机中断


memset(HIDKey,0,sizeof(HIDKey));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清空缓冲区

memset(HIDMouse,0,sizeof(HIDMouse));

while(1)

{

if(Ready)

{

//HIDValueHandle();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//串口0,程序会停在getkey函数等待接收一个字符

my_method();

}

mDelaymS(4);??

}

}


您好

例程测试没有问题,说明是程序部分内容书写有问题,可以找一些抓包工具看下枚举通讯流程,卡在了那一条数据传输,对比正常的进行修改,另外,可以直接附上.C文件。


不行啊image.png附件只能传图片。官方的hex下载没问题,我用一样的代码,编译后,下载,就不识别。我看看是什么问题。谢谢你


还有就是,我用的是keil 5 编译后就不行


可以打包成压缩包一起发送哦,可以将问题和代码发送至邮箱dxy@wch.cn


可以发一个CH5490GHID鼠标移动的相对移动和绝对移动的代码,鼠标的上下左右移动


暂时没有这样的例程哦,前面提到的程序下载异常问题解决了吗


解决了,image.png要点这里。官方文档没有这步



可以实现鼠标相对移动和绝对移动的示例代码,不管什么芯片,随便一个只要能实现的代码,能给发一下吗个人信息保护,已隐藏。谢谢


只有登录才能回复,可以选择微信账号登录