你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

显示为此设备

显示为此设备
收藏 评论8 发布时间:2019-5-7 16:22

举报

8个回答
wenyangzeng 回答时间:2019-5-7 16:43:32
判断应该是笔记本USB口硬件连接问题,

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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 报告描述符有问题。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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字节



QQ截图20190508161902.png
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[DINK_USB_SIZ_DEVICE_DESC] = {

        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[DINK_USB_SIZ_CONFIG_DESC] = {
        /***************配置描述符***********************/
        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[DINK_USB_SIZ_STRING_LANGID]=
{
    0x04, //本描述符的长度
    0x03, //字符串描述符
    //0x0409为美式英语的ID
    0x09,
    0x04
};


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

//Unicode 字符串描述符
//邓小俊的usb鼠标
const u8 DinkUsbManufacturerStringDescriptor[DINK_USB_SIZ_STRING_VENDOR]=
{
    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[DINK_USB_SIZ_STRING_PRODUCT]=
{
    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[DINK_USB_SIZ_STRING_SERIAL]={
    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] =
{
    DINK_USB_SIZ_STRING_SERIAL_UNIQUE_ID,        //描述符长度
    0x03                                                      //描述符类型编码
    /* Serial number该编码将会在程序运行的时候用芯片唯一unique id进行填充*/
};




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

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版