找回密码
 立即注册
楼主: ercircle

USB拓展库及使用示例 | 本贴 咨询 USB,基本帮您把USB程序开发完成

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:255
  • 最近打卡:2026-04-02 11:11:40

0

主题

64

回帖

1006

积分

金牌会员

积分
1006
发表于 2025-12-14 21:52:32 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:255
  • 最近打卡:2026-04-02 11:11:40

0

主题

64

回帖

1006

积分

金牌会员

积分
1006
发表于 2025-12-14 21:52:59 | 显示全部楼层
能不能识别键盘鼠标的操作?

点评

当然例程里就有,也可以看下这个应用 谁的 Win10 跑到了我的【Ai8051U】实验箱上 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯人工智能技术交流网站 - AI32位8051交流  详情 回复 发表于 2025-12-14 22:08
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2026-04-02 08:56:15
已绑定手机

104

主题

4229

回帖

9395

积分

荣誉版主

无情的代码机器

积分
9395
发表于 2025-12-14 22:08:30 | 显示全部楼层
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-01-16 19:43:06

1

主题

9

回帖

222

积分

中级会员

积分
222
发表于 2025-12-20 12:01:40 | 显示全部楼层
erci*** 发表于 2025-12-12 19:26
附件已更新MIDI通讯例程demo

太感谢了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2026-02-25 13:14:26

3

主题

18

回帖

307

积分

中级会员

积分
307
发表于 2025-12-20 13:27:07 | 显示全部楼层
使用STC8H8K64U制作的复合USB鼠标键盘,刚开始正常,时间一长有概率重启进USB下载模式.求解决办法! 重启也就罢了,但进下载模式相当不靠谱!

点评

P32上接信号了?P32拉常高就进不了下载模式~  详情 回复 发表于 2025-12-20 13:32
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2026-04-02 08:56:15
已绑定手机

104

主题

4229

回帖

9395

积分

荣誉版主

无情的代码机器

积分
9395
发表于 2025-12-20 13:32:03 | 显示全部楼层
jiaox*** 发表于 2025-12-20 13:27
使用STC8H8K64U制作的复合USB鼠标键盘,刚开始正常,时间一长有概率重启进USB下载模式.求解决办法! 重启也就 ...

P32上接信号了?P32拉常高就进不了下载模式~
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2026-02-25 13:14:26

3

主题

18

回帖

307

积分

中级会员

积分
307
发表于 2025-12-20 13:58:15 | 显示全部楼层
erci*** 发表于 2025-12-20 13:32
P32上接信号了?P32拉常高就进不了下载模式~

确定P3.2用10K拉到VCC上了(P3.3有接其它信号),也没有操作IAP_CONTR寄存器.但是有概率进下载模式非常费解.

点评

大概多久复现一次呢?使用核心板是否可复现 另外跑例程包里键鼠例程是否可复现 可以上传下工程和原理图看看  详情 回复 发表于 2025-12-20 14:24
用的是1L附件还是官网UBS库 还有个途径进入下载模式是下载口令,默认的口令是@STCISP#。USB报文刚好包含这个? 可以通过set_usb_ispcmd自定义更长的口令  详情 回复 发表于 2025-12-20 14:21
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2026-04-02 08:56:15
已绑定手机

104

主题

4229

回帖

9395

积分

荣誉版主

无情的代码机器

积分
9395
发表于 2025-12-20 14:21:38 | 显示全部楼层
jiaox*** 发表于 2025-12-20 13:58
确定P3.2用10K拉到VCC上了(P3.3有接其它信号),也没有操作IAP_CONTR寄存器.但是有概率进下载模式非常费解. ...

用的是1L附件还是官网UBS库


还有个途径进入下载模式是下载口令,默认的口令是@STCISP#。USB报文刚好包含这个?

可以通过set_usb_ispcmd自定义更长的口令
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2026-04-02 08:56:15
已绑定手机

104

主题

4229

回帖

9395

积分

荣誉版主

无情的代码机器

积分
9395
发表于 2025-12-20 14:24:18 | 显示全部楼层
jiaox*** 发表于 2025-12-20 13:58
确定P3.2用10K拉到VCC上了(P3.3有接其它信号),也没有操作IAP_CONTR寄存器.但是有概率进下载模式非常费解. ...

大概多久复现一次呢?使用核心板是否可复现


另外跑例程包里键鼠例程是否可复现

可以上传下工程和原理图看看
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2026-02-25 13:14:26

3

主题

18

回帖

307

积分

中级会员

积分
307
发表于 2025-12-20 14:41:12 | 显示全部楼层
erci*** 发表于 2025-12-20 14:24
大概多久复现一次呢?使用核心板是否可复现

用的AiCube-ISP->资料下载->试验箱演示程序  有的时候一整天都没问题 有的时候一小会就进下载模式了.

char code CONFIGDESC[9+9+9+7+9+9+7] =
{
    0x09,                   //bLength(9);
    0x02,                   //bDescriptorType(Configuration);
    sizeof(CONFIGDESC) & 0xff,
                sizeof(CONFIGDESC) >> 8 & 0xff,        
    0x02,                    // bNumInterfaces = 2(键盘 + 鼠标)
    0x01,                   //bConfigurationValue(1);
    0x00,                   //iConfiguration(0);
    0x80,                   //bmAttributes(BUSPower);
    0x32,                   //MaxPower(100mA);
// -------- Interface 0:鼠标 --------
    0x09,                   //bLength(9);
    0x04,                   //bDescriptorType(Interface);
    0x00,                   //bInterfaceNumber(0);
    0x00,                   //bAlternateSetting(0);
    0x01,                   //bNumEndpoints(1);
    0x03,                   //bInterfaceClass(HID);
    0x01,                   //bInterfaceSubClass(Boot);
    0x02,                   //bInterfaceProtocol(Mouse);
    0x00,                   //iInterface(0);

    0x09,                   //bLength(9);
    0x21,                   //bDescriptorType(HID);
    0x01,0x01,              //bcdHID(1.01);
    0x00,                   //bCountryCode(0);
    0x01,                   //bNumDescriptors(1);
    0x22,                   //bDescriptorType(HID Report);
                0x3E,0x00,              //wDescriptorLength(62);

    0x07,                   //bLength(7);
    0x05,                   //bDescriptorType(Endpoint);
    0x81,                   //bEndpointAddress(EndPoint1 as IN);
    0x03,                   //bmAttributes(Interrupt);
    0x04,0x00,              //wMaxPacketSize(4);
    0x0a,                   //bInterval(10ms);
               
                // -------- Interface 1:键盘 --------
    0x09, 0x04,              // bLength, bDescriptorType = INTERFACE
    0x01,                    // bInterfaceNumber = 1
    0x00,                    // bAlternateSetting
    0x01,                    // bNumEndpoints = 1(键盘只需要 IN)
    0x03,                    // bInterfaceClass = HID
    0x01,                    // bInterfaceSubClass = Boot
    0x01,                    // bInterfaceProtocol = Keyboard
    0x00,                    // iInterface

    // HID descriptor
    0x09, 0x21,              // HID
    0x01, 0x01,              // HID v1.01
    0x00,                    // country code
    0x01,                    // num reports
    0x22,                    // report desc type
                0x41,0x00,              //wDescriptorLength(65);

    // Endpoint (IN)
    0x07, 0x05,              // Endpoint descriptor
    0x82,                    // EP2 IN
    0x03,                    // Interrupt
    0x08, 0x00,              // MaxPacketSize = 8
    0x0A                    // polling = 10 ms
};


char code HID_MOUSE_REPORTDESC[62] =
{
        
/***3键鼠标有滚轮 Mouse (Buttons + X + Y + Wheel) - 4 bytes ***/
0x05,0x01,        // Usage Page (Generic Desktop)
0x09,0x02,        // Usage (Mouse)
0xA1,0x01,        // Collection (Application)
0x09,0x01,        //   Usage (Pointer)
0xA1,0x00,        //   Collection (Physical)

0x05,0x09,        //     Usage Page (Buttons)
0x19,0x01,        //     Usage Minimum (1)
0x29,0x03,        //     Usage Maximum (3)
0x15,0x00,        //     Logical Minimum (0)
0x25,0x01,        //     Logical Maximum (1)
0x95,0x03,        //     Report Count (3)
0x75,0x01,        //     Report Size (1)
0x81,0x02,        //     Input (Data,Var,Abs)

0x95,0x01,        //     Report Count (1)
0x75,0x05,        //     Report Size (5)
0x81,0x03,        //     Input (Const,Var,Abs)   ; padding for buttons

0x05,0x01,        //     Usage Page (Generic Desktop)
0x09,0x30,        //     Usage (X)
0x09,0x31,        //     Usage (Y)
0x15,0x81,        //     Logical Minimum (-127)
0x25,0x7F,        //     Logical Maximum (127)
0x75,0x08,        //     Report Size (8)
0x95,0x02,        //     Report Count (2)
0x81,0x06,        //     Input (Data,Var,Rel)  ; X, Y

0x09,0x38,        //     Usage (Wheel)
0x15,0x81,        //     Logical Minimum (-127)
0x25,0x7F,        //     Logical Maximum (127)
0x75,0x08,        //     Report Size (8)
0x95,0x01,        //     Report Count (1)
0x81,0x06,        //     Input (Data,Var,Rel)  ; Wheel

0xC0,             //   End Collection (Physical)
0xC0              // End Collection (Application)
};  



char code HID_KEB_REPORTDESC[65] =
{
    0x05,0x01,              //USAGE_PAGE(Generic Desktop);
    0x09,0x06,              //USAGE(Keyboard);
    0xa1,0x01,              //COLLECTION(Application);
    0x05,0x07,              //  USAGE_PAGE(Keyboard);
    0x19,0xe0,              //  USAGE_MINIMUM(224);
    0x29,0xe7,              //  USAGE_MAXIMUM(255);
    0x15,0x00,              //  LOGICAL_MINIMUM(0);
    0x25,0x01,              //  LOGICAL_MAXIMUM(1);
    0x75,0x01,              //  REPORT_SIZE(1);
    0x95,0x08,              //  REPORT_COUNT(8);
    0x81,0x02,              //  INPUT(Data,Variable,Absolute);
    0x75,0x08,              //  REPORT_SIZE(8);
    0x95,0x01,              //  REPORT_COUNT(1);
    0x81,0x01,              //  INPUT(Constant);
    0x19,0x00,              //  USAGE_MINIMUM(0);
    0x29,0x65,              //  USAGE_MAXIMUM(101);
    0x15,0x00,              //  LOGICAL_MINIMUM(0);
    0x25,0x65,              //  LOGICAL_MAXIMUM(101);
    0x75,0x08,              //  REPORT_SIZE(8);
    0x95,0x06,              //  REPORT_COUNT(6);
    0x81,0x00,              //  INPUT(Data,Array);
    0x05,0x08,              //  USAGE_PAGE(LEDs);
    0x19,0x01,              //  USAGE_MINIMUM(1);
    0x29,0x03,              //  USAGE_MAXIMUM(3);
    0x15,0x00,              //  LOGICAL_MINIMUM(0);
    0x25,0x01,              //  LOGICAL_MAXIMUM(1);
    0x75,0x01,              //  REPORT_SIZE(1);
    0x95,0x03,              //  REPORT_COUNT(3);
    0x91,0x02,              //  OUTPUT(Data,Variable,Absolute);
    0x75,0x05,              //  REPORT_SIZE(5);
    0x95,0x01,              //  REPORT_COUNT(1);
    0x91,0x01,              //  OUTPUT(Constant);
    0xc0,                   //END_COLLECTION;
};



void usb_class_out1()
{
    BYTE idata led;
   
    if (usb_bulk_intr_out(UsbBuffer, 1) == 1)
    {      
        led = UsbBuffer[0];
        //LED_NUM = !(led & 0x01);
        //LED_CAPS = !(led & 0x02);
        //LED_SCROLL = !(led & 0x04);
    }
}
void usb_class_in1()
{
  BYTE idata button[5]={0};
  BYTE idata i;

  if(DeviceState != DEVSTATE_CONFIGURED)return;   //如果USB配置没有完成,就直接退出

  if(UsbIn1Busy)return;   //判断USB是否空闲,以及是否有按键按下
        
  if(MouseCode & 0x08)button[0] |= 1;
  else  button[0] &= 0xFE;

  if((MouseCode & 0x14) == 0x10)button[1] = 1;
  else if((MouseCode & 0x14) == 0x04)button[1] = -1;
  else button[1] = 0;

  if((MouseCode & 0x03) == 0x02)button[2] = -1;
  else if((MouseCode & 0x03) == 0x01)button[2] = 1;
  else button[2] = 0;

  IE2 &= ~0x80;   //EUSB = 0;
  UsbIn1Busy = 1;
  usb_write_reg(INDEX, 1);
  for(i = 0; i < 4; i++)
  {
    usb_write_reg(FIFO1, button\[i\]);
  }
  usb_write_reg(INCSR1, INIPRDY);
  IE2 |= 0x80;    //EUSB = 1;

}

void usb_class_in2()
{
  BYTE idata key[8] = {0};
  BYTE idata i;
  //static idata BYTE KeyboardCodeTemp=0;
  if(DeviceState != DEVSTATE_CONFIGURED)return;   //如果USB配置没有完成,就直接退出

  if(UsbIn2Busy)return;   //判断USB是否空闲,以及是否有按键按下
  //KeyboardCodeTemp=KeyboardCode;
  if(KeyboardCode != 8 || KeyboardCode != 0x18 || KeyboardCode != 0x5A || KeyboardCode != 0x52 || KeyboardCode != 0x1C)
  {
    if(KeyboardCode == 0x45)key[7] = 0x1E; //1
    if(KeyboardCode == 0x46)key[7] = 0x1F; //2
    if(KeyboardCode == 0x47)key[7] = 0x20; //3
    if(KeyboardCode == 0x44)key[7] = 0x21; //4
    if(KeyboardCode == 0x40)key[7] = 0x22; //5
    if(KeyboardCode == 0x43)key[7] = 0x23; //6
    if(KeyboardCode == 0x07)key[7] = 0x24; //7
    if(KeyboardCode == 0x15)key[7] = 0x25; //8
    if(KeyboardCode == 0x09)key[7] = 0x26; //9
    if(KeyboardCode == 0x19)key[7] = 0x27; //0
    if(KeyboardCode==0x16)key[7]=0x63;//.
    if(KeyboardCode==0x0D)key[7]=0x2A;//backspace
  }

  IE2 &= ~0x80;   //EUSB = 0;
  UsbIn2Busy = 1;
  usb_write_reg(INDEX, 2);
  for(i = 0; i < 8; i++)
  {
    usb_write_reg(FIFO2, key
\[i\]);
  }
  usb_write_reg(INCSR1, INIPRDY);
  IE2 |= 0x80;    //EUSB = 1;

}


截图202512201453355953.jpg

点评

J4是跳线帽吗?接了没  详情 回复 发表于 2025-12-20 15:12
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-2 22:54 , Processed in 0.129253 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表