我用WCHISPStudio通过USB下载程序后,程序不会正常运行。
我没有焊接2.4G和FLASH。PCB这是PCB图。
我是修改官网的示例代码CompositeKM。在win10下我直接下载CompositeKM.hex,电脑可以识别到鼠标和键盘。但在win11上下载我改过的代码或者原示例代码CompositeKM,电脑就识别不到鼠标和键盘好像程序就没有运行。哪位大神帮我看看问题出在哪
这是我焊接后的板子。
从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);??
}
}