fuyu1212 发表于 2019-5-7 16:22:15

关于苹果笔记本WIN10下面USB连接出错的问题

在STM32L151CBU6的单片机碰到一个问题,在苹果笔记本WIN10上STM32的HID不识别或识别不稳定,设备管理器中没有出现感叹号,或出现感叹号,都存在有时连不上设备,发64字节命令发送不成功。请问如何解决,需要什么资料。我在一个组装台式机上面也装了WIN10 64位系统,但不会出现这样的问题。硬件连接后会显示这样一个设备

wenyangzeng 发表于 2019-5-7 16:43:32

判断应该是笔记本USB口硬件连接问题,

fuyu1212 发表于 2019-5-7 16:55:02

wenyangzeng 发表于 2019-5-7 16:43
判断应该是笔记本USB口硬件连接问题,

当初也怀疑过这样的问题,但是换了几台苹果笔记本都是这样的问题。只要是苹果电脑装WIN10就会碰到这样的问题。别的品牌电脑在WIN10下面还没有碰到这样的问题。

wenyangzeng 发表于 2019-5-7 17:30:55

fuyu1212 发表于 2019-5-7 16:55
当初也怀疑过这样的问题,但是换了几台苹果笔记本都是这样的问题。只要是苹果电脑装WIN10就会碰到这样的 ...

可能是苹果笔记本的IOS操作系统需要另行下载针对ST-LINK的驱动。

fuyu1212 发表于 2019-5-7 18:09:04

wenyangzeng 发表于 2019-5-7 17:30
可能是苹果笔记本的IOS操作系统需要另行下载针对ST-LINK的驱动。

不是苹果的系统,是改装的WIN10系统

maxtch 发表于 2019-5-7 19:35:23

这是你的 USB HID 报告描述符有问题。

maxtch 发表于 2019-5-7 19:36:59

wenyangzeng 发表于 2019-5-7 17:30
可能是苹果笔记本的IOS操作系统需要另行下载针对ST-LINK的驱动。

USB HID 是跨平台通用的,不过苹果的 BIOS 的确对于 USB 描述符的规范度要求非常高,因此说软件里面少许问题都会被无限放大。

fuyu1212 发表于 2019-5-8 16:30:33

maxtch 发表于 2019-5-7 19:36
USB HID 是跨平台通用的,不过苹果的 BIOS 的确对于 USB 描述符的规范度要求非常高,因此说软件里面少许 ...

现在是在苹果电脑装的WIN10下面,用工具打开显示这样的,但HID发送为负1字节



fuyu1212 发表于 2019-5-8 16:32:37

本帖最后由 fuyu1212 于 2019-5-8 16:35 编辑

maxtch 发表于 2019-5-7 19:36
USB HID 是跨平台通用的,不过苹果的 BIOS 的确对于 USB 描述符的规范度要求非常高,因此说软件里面少许 ...
下面是设备描述符代码,能帮忙看下什么问题。谢谢!现在是有时可以正常连接。但连接不上的次数占大多数。
/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
* File Name          : usb_desc.c
* Author             : MCD Application Team
* Version            : V3.2.1
* Date               : 07/05/2010
* Description      : Descriptors for Joystick Mouse Demo
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "usb_lib.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/* USB Standard Device Descriptor */
//usb标准设备描述符
const u8 DinkUsbDeviceDescriptor = {

      USB_DEVICE_DESC_SIZE,                     //bLength字段。设备描述符的长度为18(0x12)字节
      USB_DEVICE_DESCRIPTOR_TYPE,                //bDescriptorType字段。设备描述符的编号为0x01
      WBVAL(0x0200),                                                //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
      0x00,                                     //bDeviceClass字段。我们不在设备描述符中定义设备类,
      0x00,                                    //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
      0x00,                                    //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
      0x40,                                                 //bMaxPacketSize0字段。端点0的最大包长度。
      WBVAL(0x0483),                            //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
      WBVAL(0x5750),                            //idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。\。
      WBVAL(0x0100),                                           // 设备的版本
      0x01,                                     //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理
      0x02,                                     //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
      0x03,                                    //iSerialNumber字段。设备的序列号字符串索引值。
      0x01                                    //bNumConfigurations字段。该设备所具有的配置数。
};

//USB报告描述符的定义
const u8 HID_ReportDescriptor[]=
{
      0x05, 0x8c, /* USAGE_PAGE用法页 (ST Page) */
      0x09, 0x01, /* USAGE 用法(Demo Kit) */
      0xa1, 0x01, /* COLLECTION 集合开始(Application) */
      
      // The Input report 输入报告
      0x09,0x03, // USAGE ID 用法- Vendor defined
      0x15,0x00, // LOGICAL_MINIMUM 逻辑最小值(0)
      0x26,0x00, 0xFF, // LOGICAL_MAXIMUM 逻辑最大值(255)
      0x75,0x08, // REPORT_SIZE 报告长度(8bit)
      0x95,REPORT_COUNT,// REPORT_COUNT 报告总计(64Byte)
      0x81,0x02, // INPUT 输入(Data,Var,Abs)

      // The Output report
      0x09,0x04, // USAGE ID 用法- Vendor defined
      0x15,0x00, // LOGICAL_MINIMUM 逻辑最小值(0)
      0x26,0x00,0xFF, // LOGICAL_MAXIMUM 逻辑最大值(255)
      0x75,0x08, // REPORT_SIZE 报告长度(8bit)
      0x95,REPORT_COUNT,// REPORT_COUNT 报告总计(64Byte)
      0x91,0x02, // OUTPUT输出(Data,Var,Abs)

      0xc0 /* END_COLLECTION 集合结束*/
};
//通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。
//输出报告也有32字节。至于这32字节的数据是干什么用的,就要由用户
//自己来决定了。
///////////////////////////报告描述符完毕////////////////////////////

/* USB Configuration Descriptor */
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
//usb配置描述符
const u8 DinkUsbConfigDescriptor = {
      /***************配置描述符***********************/
      USB_CONFIGUARTION_DESC_SIZE,       //bLength字段。配置描述符的长度为9字节。
      USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType字段。配置描述符编号为0x02。
      //wTotalLength字段。配置描述符集合的总长度,
      //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
      WBVAL(
      USB_CONFIGUARTION_DESC_SIZE +                        //配置描述符
      USB_INTERFACE_DESC_SIZE   +                        //接口1描述符
      9                                                      +                        //hid描述符
      USB_ENDPOINT_DESC_SIZE                +                        //端点描述符1
      USB_ENDPOINT_DESC_SIZE                +                        //端点描述符2
      USB_INTERFACE_DESC_SIZE                +                        //接口2描述符
      USB_ENDPOINT_DESC_SIZE                +                        //端点描述符1
      USB_ENDPOINT_DESC_SIZE                                        //端点描述符2
      ),
      0x02,                                              //bNumInterfaces字段。该配置包含的接口数,复合设备,两个接口。
      0x01,                                              //bConfiguration字段。该配置的值为1。
      0x00,                                             //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
      USB_CONFIG_BUS_POWERED ,                              //bmAttributes字段,该设备的属性
      USB_CONFIG_POWER_MA(500),                        //bMaxPower字段,该设备需要的最大电流量

      /*********************第一个接口描述符,hid设备**********************/
      USB_INTERFACE_DESC_SIZE,                         //bLength字段。接口描述符的长度为9字节。
      USB_INTERFACE_DESCRIPTOR_TYPE,                  //bDescriptorType字段。接口描述符的编号为0x04。
      0x00,                                             //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
      0x00,                                          //bAlternateSetting字段。该接口的备用编号,为0。
      0x02,                                                                        //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点

      USB_DEVICE_CLASS_HUMAN_INTERFACE,               //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。,
      
      0x00,                                                                        //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,
                                                                                        //只规定了一种子类:支持BIOS引导启动的子类。
                                                                                        //USB键盘、鼠标属于该子类,子类代码为0x01。
                                                                                        //但这里我们是自定义的HID设备,所以不使用子类。
      
      0x00,                                                                        //bInterfaceProtocol字段。如果子类为支持引导启动的子类,
                                                                                        //则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。
                                                                                        //自定义的HID设备,也不使用协议。

      0x00,                                                                        //iConfiguration字段。该接口的字符串索引值。这里没有,为0。

      /*********************HID报告描述符*************************/
      //bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。
         0x09,
         
         //bDescriptorType字段。HID描述符的编号为0x21。
         0x21,
         
         //bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。
         0x10,
         0x01,
         
         //bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。
         0x00,
         
         //bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。
         0x01,
         
         //bDescriptorType字段。下级描述符的类型,为报告描述符,编号为0x22。
         0x22,
         
         //bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。
         sizeof(HID_ReportDescriptor)&0xFF,
         (sizeof(HID_ReportDescriptor)>>8)&0xFF,
      /*********************端点1描述符**********************************/
      /* 端点描述符 */
      USB_ENDPOINT_DESC_SIZE,                           //bLength字段。端点描述符长度为7字节。
      USB_ENDPOINT_DESCRIPTOR_TYPE,                     //bDescriptorType字段。端点描述符编号为0x05。
      USB_ENDPOINT_IN(1),                              //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
      USB_ENDPOINT_TYPE_INTERRUPT,                      //bmAttributes字段。D1~D0为端点传输类型选择。
      WBVAL(0x0040),                                     //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。
      0x02,                                                               //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。
      /*********************端点2描述符**********************************/
      /* 端点描述符 */
      USB_ENDPOINT_DESC_SIZE,                           //bLength字段。端点描述符长度为7字节。
      USB_ENDPOINT_DESCRIPTOR_TYPE,                     //bDescriptorType字段。端点描述符编号为0x05。
      USB_ENDPOINT_OUT(1),                              //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
      USB_ENDPOINT_TYPE_INTERRUPT,                      //bmAttributes字段。D1~D0为端点传输类型选择。
      WBVAL(0x0040),                                     //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。
      0x02,                                                               //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。
      /*******************第二个接口描述符 存储设备*********************/
      USB_INTERFACE_DESC_SIZE,                         //bLength字段。接口描述符的长度为9字节。
      USB_INTERFACE_DESCRIPTOR_TYPE,                  //bDescriptorType字段。接口描述符的编号为0x04。
      0x01,                                             //bInterfaceNumber字段。该接口的编号,第二个接口,编号为1。
      0x00,                                          //bAlternateSetting字段。该接口的备用编号,为0。
      0x02,                                                                        //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点

      USB_DEVICE_CLASS_STORAGE,                                 //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。,
      MSC_SUBCLASS_SCSI,                                 //bInterfaceSubClass字段。SCSI透明命令集的子类代码为0x06。
      MSC_PROTOCOL_BULK_ONLY,               //bInterfaceProtocol字段。协议为仅批量传输,代码为0x50。
      0x04,                                          //iConfiguration字段。该接口的字符串索引值

      /************************************* 端点描述符 1*********************************************/
      USB_ENDPOINT_DESC_SIZE,                           //bLength字段。端点描述符长度为7字节。
      USB_ENDPOINT_DESCRIPTOR_TYPE,                     //bDescriptorType字段。端点描述符编号为0x05。
      USB_ENDPOINT_IN(2),                              //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
      USB_ENDPOINT_TYPE_BULK,                              //bmAttributes字段。D1~D0为端点传输类型选择。
      WBVAL(0x0040),                                     //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。
      0x00,                                                               //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。
      
      /************************************端点描述符 2********************************************************/
      USB_ENDPOINT_DESC_SIZE,                           //bLength字段。端点描述符长度为7字节。
      USB_ENDPOINT_DESCRIPTOR_TYPE,                     //bDescriptorType字段。端点描述符编号为0x05。
      USB_ENDPOINT_OUT(2),                              //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
      USB_ENDPOINT_TYPE_BULK,                              //bmAttributes字段。D1~D0为端点传输类型选择。
      WBVAL(0x0040),                                     //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。
      0x00,                                                               //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。
};


/************************语言ID的定义********************/
const u8 DinkUsbLanguageId=
{
    0x04, //本描述符的长度
    0x03, //字符串描述符
    //0x0409为美式英语的ID
    0x09,
    0x04
};


////////////////////////语言ID完毕//////////////////////////////////

//Unicode 字符串描述符
//邓小俊的usb鼠标
const u8 DinkUsbManufacturerStringDescriptor=
{
    32,         //该描述符的长度为32字节
      0x03,       //字符串描述符的类型编码为0x03
      0x44, 0x00, //D
      0x49, 0x00, //I
      0x4e, 0x00, //N
      0x4b, 0x00, //K
      0x5f, 0x00, //_
      0x48, 0x00, //H
      0x49, 0x00, //I
      0x44, 0x00, //D
      0x5f, 0x00, //_
      0x44, 0x00, //D
      0x45, 0x00, //E
      0x56, 0x00, //V
      0x49, 0x00, //I
      0x43, 0x00, //C
      0x45, 0x00//E

};
/////////////////////////厂商字符串结束/////////////////////////////


//产品字符串描述符
const u8 DinkUsbProductStringDescriptor=
{
    32,         //该描述符的长度为32字节
      0x03,       //字符串描述符的类型编码为0x03
      0x44, 0x00, //0x5A, 0x00, //D(0x44)==>Z
      0x49, 0x00, //0x4D, 0x00, //I(0x49)==>M
      0x4E, 0x00, //0x5A, 0x00, //N(0x4E)==>Z
      0x4B, 0x00, //0x38, 0x00, //K(0x4B)==>8
      0x5f, 0x00, //_
      0x48, 0x00, //H
      0x49, 0x00, //I
      0x44, 0x00, //D
      0x5f, 0x00, //_
      0x44, 0x00, //D
      0x45, 0x00, //E
      0x56, 0x00, //V
      0x49, 0x00, //I
      0x43, 0x00, //C
      0x45, 0x00//E
};
////////////////////////产品字符串结束////////////////////////////

//字符串“2008-07-07”的Unicode编码
//8位小端格式
const u8 DinkUsbSerialNumberStringDescriptor={
    22,         //该描述符的长度为22字节
      0x03,       //字符串描述符的类型编码为0x03
      0x32, 0x00, //2
      0x30, 0x00, //0
      0x31, 0x00, //1
      0x35, 0x00, //5
      0x2d, 0x00, //-
      0x30, 0x00, //0
      0x33, 0x00, //3
      0x2d, 0x00, //-
      0x32, 0x00, //2
      0x31, 0x00//1
};
//////////////////////产品序列号字符串结束/////////////////////////

//产品序列号
u8 DinkUsbStringSerialUniqueId =
{
    DINK_USB_SIZ_STRING_SERIAL_UNIQUE_ID,      //描述符长度
    0x03                                                      //描述符类型编码
    /* Serial number该编码将会在程序运行的时候用芯片唯一unique id进行填充*/
};




/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

页: [1]
查看完整版本: 关于苹果笔记本WIN10下面USB连接出错的问题