想实现USB新型轻质复合墙板设备设备,使用STM32Cube.求助

当前位置: & &
& SCB10-315KVA干式变压器安福县国家电网公司推荐变压器厂家
扫一扫,进入手机网站
SCB10-315KVA干式变压器安福县国家电网公司推荐变压器厂家
发布日期: 1:38:42
产品价格:货到付款元/¥品牌:盈莱规格型号:S13供货总量:666起订量:1
发布公司:在线联系:
联系电话:郭经理()
联系我时,请告知来自中国化工产品网,谢谢!
品牌:盈莱
产品规格:S13
供应地:山东聊城
包装说明:
运输说明:托运
SCB10-315KVA干式变压器安福县国家电网公司推荐变压器厂家,2电源变压器磁芯性能要求及材料分类,6、我公司具备一系列相关检测设备因为每一个微电流都产生磁效应注1:s13型配电变压器空载损耗约比s11型下降30%app可下载大量的电气资源从而使变压器初、次级线圈的漏感增大应列出相关电网各水平年的电量平衡表,在运行期间发现电站的无功补偿容量配置上存在偏大的问题,SCB10-315KVA干式变压器安福县国家电网公司推荐变压器厂家.将其调到铭牌中低压侧额定的数值),感应电动势e2作用于负载r的两端,王勃华:推进供给侧和需求侧双改革以创新赢市场(附图),各种负载率下的有功损耗率比较如图表4,SCB10-315KVA干式变压器安福县国家电网公司推荐变压器厂家 安福县变压器厂有限公司欢迎您24小时销售电话:133-(全铜绕组、低噪运行、安全可靠)
&http://baise.huayugg.com/
山东盈莱变压器有限公司始建于1958年,竖内早的变压器制造厂之一,原名聊城变压器制造厂,2000年经改制成为民营股份制公司。公司位于山东省聊城市科技技术经济区,电力行业也是变频器产品重要的应用领域之一,十几年来基本上没有出现大的事故,形成与外资企业抗衡的竞争格局,地处聊城市三环线西北段,107国道、交通十分便捷。公司注册资本6000万元,拥有资产总额1.75亿元。公司谬120000平方米,生产厂房70000平方米。年生产能力为500万kVA。公司有员工586余人,其中各类专业技术人员110余人。公司从事110kV、66kV、35kV、20kV、10kV各种电力变压器和电炉、整流、起动、牵引等特种变压器以及35 kV、20 kV、10 kV各类干式变压器的生产和研发,是输变电的骨干企业之一。公司生产设备先进、技术力量雄厚、检测手段齐全,拥有生产和试验设备共200多台套,如:铁心数控自动横剪线、500kW煤油气相干燥罐、500吨大型液压折弯机、立式绕线机、800吨热压机、线圈寻机、喷丸设备、油漆喷、进口箔式绕线机、进口环氧树脂浇注线、500~750kv变压器数为244台,寿命终结后完全可拆解并回收有价材料,不合格产品不出厂的原则,全套高新试验技术以及CAD辅助设计等,是集变压器研究、、设计、制造于一体的大型变压器专业制造企业。
随着市场竞争日趋激烈,公司以先进的技术,卓越的品质和优质的服务,以公司全体员工的真诚,公司为重点高新技术企业、连续九年被评为工业行业排头兵企业、机械工业企业核心竞争力100强企业、机械工业效益型企业、重点培育发展企业、省企业、省两化融合示范企业、省高新技术企业,智慧和勇气使企业展翅鹏飞,不断,成为变压器行业中的一颗璀璨明星。
http://baise.huayugg.com/
电力变压器验收程序:
主要检验内容
产品外观检验
外观有无损伤、表漆是否有脱落、有无漏油现象、
地脚尺寸是否符合要求。
变压比和联结组别。
直流电阻测量
高、低压绕组电阻。
单、双臂电桥
绝缘电阻测量
高、低压绕组间及对地绝缘电阻。
空载损耗试验
变压器空载损耗、空载电流。
变压器空负载测式仪
负载损耗试验
变压器负载损耗、阻抗电压。
工频耐压试验
高、低压绕组间及对地绝缘。
试验变压器、调压器、电压表、电流表
感应耐压试验
高、低压绕组匝间绝缘。
倍频发电机、调压器、电压表、电流表
变压器油检验
山东盈莱变压器有限公司全体员工郑重向用户承诺
1、加强,确保体系有效运行,保证做到出厂的产品达到化法规定的有关或合同要求。
2、保证为用户提供优质的售前售后服务。向用户介绍产品的性能和使用要求,提供有关的技术资料,当好用户参谋。产品在用户使用中,发现问题,在接到用户通知后,24小时内做出处理意见。如需现场解决,保证48小时内派出技术服务人员。
3、为重点工程配套的设备和产品,愿意接受用户监造。
4、产品在投运前,公司接到服务通知后,即派服务人员到现场负责安装及调试,供需双方认可后,才可投运。
5、保证兑现“三包”,在“三包”期限内的产品,用户发现产品问题,实行包修、包换、包退。
6、超过“三包”期限的产品,保证提供配件和根据用户需求做好服务工作。
7、售后服务电话:
&http://baise.huayugg.com/
公司产品全部为设计、自主研发,产品种类齐全,范围涵盖了3大类7个种类的变压器。主要产品有:S11-M型10KV系列全密封配电变压器、S11型10KV系列配电变压器、SZ11型35KV双绕组有载调压电力变压器、S11型35KV双绕组无励磁调压变压器和SH15型10KV级全密封非晶合金配电变压器。
全密封电力变压器取消了储油柜,用波纹油箱本体的翅板作为散热冷却元件,同时随着变压器油的增减而胀缩,使变压器内部与大气隔离,防止油的劣化和绝缘时及老化,增强了运行的可靠性。
铁心采用优质冷扎硅钢片,有效的了磁通密度在铁心内部的分布状况,了噪声,了损耗。线圈选用度漆包线(或纸包线)卷饶,圆筒式(或饼式)结构,安匝分布均匀,绝缘结构合理,具有很强的抗短路能力。
油箱内使用的紧固件均采用止退螺母,能保证长途运输后运行时不至于松脱。油箱表面经磷化处理后用三防漆(防潮、防霉、防盐雾)涂装,广泛应用冶金、矿石、石化等使用较恶劣的。
订货时请提供下列参数:
1.产品型号 2.额定容量 3.电验合
4.范围 5. 6.联结组标号
7.短路阻抗 8.特殊要求的产品,注明技术要求
矿用隔爆型变压器
http://baise.huayugg.com/
用于矿井中有危险的场所。这种变压器多制成干式,主要结构特点是箱壳的全部接合面均按隔爆要求制作,男受0.8兆帕的内部压力。
矿用干式变压器的容量通常有4千伏安和2.5千伏安两种,专为电钻、照明、等设备供电。它的进出线是电缆通过出线套引出的。原边的电压有380伏、660伏两种;副边电压一般为133伏。
容量在 100千伏安以上的Satons隔爆型变压器常与隔爆型开关箱组合成隔爆型成套变电所。其输出电压有400伏,690伏和1200伏,以矿井用电设备的需要。为了适应坑道运输,要求变压器结构高度要低。这样,铁柱直径可以偏大些,一般使用冷轧硅钢片。100千伏安及以上者通常为H级绝缘。
&http://baise.huayugg.com/
SCB10-315KVA干式变压器安福县国家电网公司推荐变压器厂家通常多任务操作系统的任务不同于一般函数,它是一个无限循环,而且没有返回值。如果没有更高优先级的任务进入就绪态,当前任务是不会放弃对CPU的使用权的。为了实现操作系统的正常运行和有关事件的同步,必须正确处理任务间的通信和事件标志的设置。STM32全国研讨会进行中,速来领取现场粉丝福利!ST利用DFSDM开发PDM麦克风应用介绍培训报名:STM32高性能设计应用WorkshopSTM32电机控制培训,基于电机库开发项目意法Cortex-M7单片机USBCDC类入门培训中文培训课程免费下载:STM32USB类的介绍STM32DFU加载工具DfuSeCommand的使用STM32L053comp2比较电压无效问题一步步从STM32CubeMX生成CDC_MSC复合设备STSTM32专家讲解STM32USB复合设备及demo
安福县变压器厂家直销 销售部郭经理:手机133-、电话:
感兴趣的产品:
我想了解产品的:
能否提供样品
最小订货量
详细需求:
我对您的SCB10-315KVA干式变压器安福县国家电网公司推荐变压器厂家感兴趣,请发送相关资料和报价!谢谢!
拟购数量:
例:1000吨 非必填
联 系 人:
联系电话:
企业名称:
同时公开向其他类似供应商询价
验 证 码:
您是不是在找:
免责声明:以上信息由会员自行提供,内容的真实性、准确性和合法性由发布会员负责,本网对此不承担任何责任。中国化工产品网不涉及用户间因交易而产生的法律关系及法律纠纷,纠纷由您自行协商解决。
防骗警示:为避免产生购买风险,建议您在购买相关产品前务必确认供应商资质及产品质量。过低的价格、夸张的描述、私人银行账户等都有可能是虚假信息,请采购商谨慎对待,谨防欺诈,对于任何付款行为请您慎重抉择!
温馨提示:当您的合法权益受到侵害时,欢迎您致电2,我们会在1个工作日内为您处理,感谢您对中国化工产品网的关注与支持!
产品索引:
Copyright2005-, All rights reserved.
商务一部:2 商务二部:8以色列科技实力解读
机器人伺服电机厂商大盘点
为了解决3D芯片堆叠时的液体冷却问题,研究人员开发出一种使用绝缘介电质制冷剂的途径…
苹果是语音助手市场的开创者之一。如今,Siri已成为世界上应用最为广泛的语音助手…
最近听到很多大牛说到:“区块链将是未来十年改变世界的革命性技术!”但区块链到底是什么…
KDS有没有其他手段进一步缩小生成目标文件大小呢?有客户遇到这个问题,于是笔者自己摸索了一番,找到一种方法。
每当单位有同事离职移交项目代码时,老板都会要求代码中必须有注释,而且要求必须达到代码的30%。
对wifi远程控制的DIY制作情有独钟却不知怎么下手怎么办?
校讯通方案中,MCU+RF方案中,标签长时间工作后,突然MCU跑飞的情况如何产生以及如何避免。
二极管、三级管、MOS管常用的74种封装图(含精准尺寸)
本节我们将跟大家继续分享上节没讲完的项目经验分享,以及多个基于STM32F103的设计方案和项目开发示例,让大家结合实例,丰富设计思路。
大牛教你如何看懂各种二极管的datasheet中有效信息!
有偿征稿 | 2017年能耗过半,年初定的哪些“小目标”没有阵亡? ……
又到一年面试季,汇集中兴、联发科、国企各种面试经验,希望有帮到你……
午夜,累了吧,让我们相约与非,给你的职场和人生一次夜宵、一点营养……
中国本土为什么出不了像TI那样的公司?这个话题在国内引起了广泛的热议……
在京津冀、长三角、珠三角三足鼎立的格局下,武汉、成都、重庆、西安、厦门集成电路产业的新兴势力也日益发挥重要作用……
包含了智能车,智能车最小系统板、电机驱动等多方面的资料。
Mouser首单额满175元即可返100元京东卡以及小脚丫开发板。
滚球控制系统整套源码资料,有简单注释,方便编辑。
要展示色彩的构成原理,借助演示装置是十分自然的想法。如何来设计色彩构成原理演示仪呢?
黄金8月,浏览泰克5系列混合域示波器,泰克资深工程师带你亲身体验!领取VR眼镜。
在这儿,有最新最前沿的技术的碰撞 !如果您是福禄克的粉丝,现场模拟检测 !
STM32全国研讨会将于日至22日于全国12城市巡回,聚焦STM32战略。
ELEXCON深圳国际电子展暨IEE深圳国际嵌入式系统展是中国电子与嵌入式专业盛会。
控制器/处理器
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
USB Compound Device,USB复合设备USB Composite Device,USB组合设备Compound Device内嵌Hub和多个Function,每个Function都相当于一个独立的USB外设,有自己的PID/VID/DID。Composite Device内只有一个Function,只有一套PID/VID/DID,通过将不同的interface定义为不同的类来实现多个功能的组合。Compound Device内嵌Hub和多个Function,每个Function都相当于一个独立的USB外设,有自己的PID/VID/DID。Composite Device内只有一个Function,只有一套PID/VID/DID,通过将不同的interface定义为不同的类来实现多个功能的组合。很多人认为一个USB接口上实现多个设备,就是指复合设备,其实,这是不确切的,虽然USB Compound Device和USB Composite Device都会被百度翻译为USB复合设备。在一个USB接口上实现多个设备有2中方法,一种是Compound Device,就是复合设备;另一种是Composite Device,就是组合设备。在USB2.0的标准协议中,定义如下:When&multiple&functions&are&combined&with&a&hub&in&a&single&package,&they&are&referred&to&as&a&compound&device.
A&device&that&has&multiple&interfaces&controlled&independently&of&each&other&is&referred&to&as&a
composite&device.所以,复合设备其实就是几个设备通过一个USB Hub形成的单一设备;组合设备也就是具有多个接口的设备,每个接口代表一个独立的设备。显然,如果是想同样的功能的话,组合设备的方法要简单很多(可以去看一下USB2.0协议中,USB2.0 Hub的复杂度)。STM32F103实现的USB转多路串口,属于USB Composite Device,不内嵌Hub,三个CDC设备的PID和VID都是相同。USB设备可以定义一个复合设备,复合设备分两种,一种是一个设备多个配置,还有一种是一个配置多个接口,在本例中采用一个配置多个接口的方式&&& 首先修改设备描述符,标准设备描述符和报告描述符都不需要修改,只需要修改配置描述符即可//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描述符
&&&&&&&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&//hid描述符
&&&&USB_ENDPOINT_DESC_SIZE&&&&&&&&+&&&&&&&&&&&&//端点描述符
&&&&USB_ENDPOINT_DESC_SIZE&&&&&&&&+&&&&&&&&&&&&//端点描述符
&&&&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。
&&&&&0x21,
&&&&&//bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。
&&&&&0x01,
&&&&&//bDescriptorType字段。下级描述符的类型,为报告描述符,编号为0x22。
&&&&&0x22,
&&&&&//bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。
&&&&&sizeof(HID_ReportDescriptor)&0xFF,
&&&&&(sizeof(HID_ReportDescriptor)&&8)&0xFF,
&&&&/*********************端点描述符**********************************/
&&&&/*&端点描述符&*/
&&&&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字节。
&&&&0x01,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//bInterval字段。端点查询的时间,端点查询的时间,此处无意义。
&&&&/***********************端点描述符*******************************************/
&&&&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字节。
&&&&0x01,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//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字段。该接口的字符串索引值
&&&&/*************************************&端点描述符&*********************************************/
&&&&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字段。端点查询的时间,端点查询的时间,此处无意义。
&&&&/************************************端点描述符********************************************************/
&&&&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字段。端点查询的时间,端点查询的时间,此处无意义。
};修改描述符之后要同时记得修改描述符的长度,然后修改usb_prop文件,主要是两个多出来的命令GET_MAX_LEN用来获取当前存储设备的个数,还有一个用来复位当前存储设备,如下RESULT&DinkUsbData_Setup(u8&RequestNo)
&&&&u8&*(*CopyRoutine)(u16);
&&&&CopyRoutine&=&NULL;
&&&&if&((RequestNo&==&GET_DESCRIPTOR)
&&&&&&&(Type_Recipient&==&(STANDARD_REQUEST&|&INTERFACE_RECIPIENT))
&&&&&&&(pInformation-&USBwIndex0&==&0))
&&&&&&&&//获取报告描述符
&&&&&&&&if&(pInformation-&USBwValue1&==&REPORT_DESCRIPTOR)
&&&&&&&&&&&&CopyRoutine&=&DinkUsbGetReportD
&&&&&&&&//获取HID描述符
&&&&&&&&else&if&(pInformation-&USBwValue1&==&HID_DESCRIPTOR_TYPE)
&&&&&&&&&&&&CopyRoutine&=&DinkUsbGetHIDD
&&&&/***&GET_PROTOCOL&***/
&&&&else&if&((Type_Recipient&==&(CLASS_REQUEST&|&INTERFACE_RECIPIENT))
&&&&&&&&&&RequestNo&==&GET_PROTOCOL)
&&&&&&&&CopyRoutine&=&DinkUsbGetProtocolV//获取协议值
&&&&else&if&((Type_Recipient&==&(CLASS_REQUEST&|&INTERFACE_RECIPIENT))
&&&&&&&&&(RequestNo&==&GET_MAX_LUN)&&&&(pInformation-&USBwValue&==&0)
&&&&&&&&&(pInformation-&USBwIndex&==&0)&&&&(pInformation-&USBwLength&==&0x01))
&&&&&&&&CopyRoutine&=&Get_Max_L
&&&&if&(CopyRoutine&==&NULL)
&&&&&&&&return&USB_UNSUPPORT;
&&&&pInformation-&Ctrl_Info.CopyData&=&CopyR
&&&&pInformation-&Ctrl_Info.Usb_wOffset&=&0;
&&&&(*CopyRoutine)(0);
&&&&return&USB_SUCCESS;
}GET_MAX_LEN的函数体为u8&*Get_Max_Lun(u16&Length)
&&if&(Length&==&0)
&&&&pInformation-&Ctrl_Info.Usb_wLength&=&LUN_DATA_LENGTH;
&&&&return&0;
&&&&return((u8*)(&Max_Lun));
二楼.对了,因为这一次使用了端点2作为存储设备使用的端点,所以要在初始化的时候顺便也多初始化两个端点//设备复位
void&DinkUsbReset(void)
&&&&Device_Info.Current_Configuration&=&0;&&//选择当前配置为0
&&&&pInformation-&Current_Feature&=&DinkUsbConfigDescriptor[7];&//获取配置描述符中当前设备属性
&&&&pInformation-&Current_Interface&=&0;//设置当前设备接口
&&&&SetBTABLE(BTABLE_ADDRESS);//设置缓冲区地址
&&&&SetEPType(ENDP0,&EP_CONTROL);//控制端点
&&&&SetEPTxStatus(ENDP0,&EP_TX_STALL);
&&&&SetEPRxAddr(ENDP0,&ENDP0_RXADDR);//设置端点缓冲区地址
&&&&SetEPTxAddr(ENDP0,&ENDP0_TXADDR);
&&&&Clear_Status_Out(ENDP0);
&&&&SetEPRxCount(ENDP0,&Device_Property.MaxPacketSize);//设置接收最大长度
&&&&SetEPRxValid(ENDP0);
&&&&SetEPType(ENDP1,&EP_INTERRUPT);//初始化端点1为中断传输模式,用来报告一些状态
&&&&SetEPTxAddr(ENDP1,&ENDP1_TXADDR);//设置端点地址
&&&&SetEPRxAddr(ENDP1,&ENDP1_RXADDR);//设置端点地址
&&&&SetEPRxStatus(ENDP1,&EP_RX_VALID);//使能接收
&&&&SetEPTxStatus(ENDP1,&EP_TX_NAK);&&//不使能发送
&&&&SetEPRxCount(ENDP1,&64);//设置接收最大长度
&&&&Clear_Status_Out(ENDP1);
&&&&SetEPType(ENDP2,&EP_BULK);//初始化端点1为中断传输模式,用来报告一些状态
&&&&SetEPTxAddr(ENDP2,&ENDP2_TXADDR);//设置端点地址
&&&&SetEPRxAddr(ENDP2,&ENDP2_RXADDR);//设置端点地址
&&&&SetEPRxStatus(ENDP2,&EP_RX_VALID);//使能接收
&&&&SetEPTxStatus(ENDP2,&EP_TX_NAK);&&//不使能发送
&&&&SetEPRxCount(ENDP2,&64);//设置接收最大长度
&&&&Clear_Status_Out(ENDP2);
&&&&bDeviceState&=&ATTACHED;//设备插入
&&&&SetDeviceAddress(0);//设置当前地址为0
&&&&usb_debug_printf(&USB&Reset\r\n&);
}然后就是端点响应了,端点2的响应文件如下void&EP2_IN_Callback(void)
&&&&Mass_Storage_In();
//USB总线发送过来数据
void&EP2_OUT_Callback(void)
&&&&Mass_Storage_Out();&&&&
}对应具体的代码就是这样/*******************************************************************************
*&Function&Name&&:&Mass_Storage_In
*&Description&&&&:&Mass&Storage&IN&transfer.
*&Input&&&&&&&&&&:&None.
*&Output&&&&&&&&&:&None.
*&Return&&&&&&&&&:&None.
//设备-&USB
*******************************************************************************/
void&Mass_Storage_In&(void)
&&&&USB_STATUS_REG|=0X10;//标记轮询
&&&&switch&(Bot_State)
&&&&&&&&case&BOT_CSW_Send:
&&&&&&&&case&BOT_ERROR:
&&&&&&&&&&&&Bot_State&=&BOT_IDLE;
&&&&&&&&&&&&SetEPRxStatus(ENDP2,&EP_RX_VALID);/*&enable&the&Endpoint&to&recive&the&next&cmd*/
&&&&&&&&&&&&
&&&&&&&&case&BOT_DATA_IN:&&//USB从设备读数据
&&&&&&&&&&&&switch&(CBW.CB[0])
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&case&SCSI_READ10:
&&&&&&&&&&&&&&&&&&&&USB_STATUS_REG|=0X02;//标记正在读数据
&&&&&&&&&&&&&&&&&&&&SCSI_Read10_Cmd(CBW.bLUN&,&SCSI_LBA&,&SCSI_BlkLen);
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
&&&&&&&&&&&&
&&&&&&&&case&BOT_DATA_IN_LAST:
&&&&&&&&&&&&Set_CSW&(CSW_CMD_PASSED,&SEND_CSW_ENABLE);
&&&&&&&&&&&&SetEPRxStatus(ENDP2,&EP_RX_VALID);
&&&&&&&&&&&&
&&&&&&&&default:
&&&&&&&&&&&&
/*******************************************************************************
*&Function&Name&&:&Mass_Storage_Out
*&Description&&&&:&Mass&Storage&OUT&transfer.
*&Input&&&&&&&&&&:&None.
*&Output&&&&&&&&&:&None.
*&Return&&&&&&&&&:&None.
//USB-&设备
*******************************************************************************/
void&Mass_Storage_Out&(void)
&&&&u8&CMD;
&&&&USB_STATUS_REG|=0X10;//标记轮询
&&&&CMD&=&CBW.CB[0];
&&&&Data_Len&=&GetEPRxCount(ENDP2);
&&&&PMAToUserBufferCopy(Bulk_Data_Buff,&ENDP2_RXADDR,&Data_Len);//读取端点缓存
&&&&switch&(Bot_State)//根据状态进行处理
&&&&&&&&case&BOT_IDLE://最开始的命令阶段
&&&&&&&&&&&&CBW_Decode();
&&&&&&&&&&&&
&&&&&&&&case&BOT_DATA_OUT://USB发送数据到设备
&&&&&&&&&&&&if&(CMD&==&SCSI_WRITE10)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&USB_STATUS_REG|=0X01;//标记正在写数据
&&&&&&&&&&&&&&&&SCSI_Write10_Cmd(CBW.bLUN&,&SCSI_LBA&,&SCSI_BlkLen);
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
&&&&&&&&&&&&Bot_Abort(DIR_OUT);
&&&&&&&&&&&&Set_Scsi_Sense_Data(CBW.bLUN,&ILLEGAL_REQUEST,&INVALID_FIELED_IN_COMMAND);
&&&&&&&&&&&&Set_CSW&(CSW_PHASE_ERROR,&SEND_CSW_DISABLE);
&&&&&&&&&&&&
&&&&&&&&default:
&&&&&&&&&&&&Bot_Abort(BOTH_DIR);
&&&&&&&&&&&&Set_Scsi_Sense_Data(CBW.bLUN,&ILLEGAL_REQUEST,&INVALID_FIELED_IN_COMMAND);
&&&&&&&&&&&&Set_CSW&(CSW_PHASE_ERROR,&SEND_CSW_DISABLE);
&&&&&&&&&&&&
/*******************************************************************************
*&Function&Name&&:&CBW_Decode
*&Description&&&&:&Decode&the&received&CBW&and&call&the&related&SCSI&command
*&&&&&&&&&&&&&&&&&routine.
*&Input&&&&&&&&&&:&None.
*&Output&&&&&&&&&:&None.
*&Return&&&&&&&&&:&None.
*******************************************************************************/
void&CBW_Decode(void)
&&for&(Counter&=&0;&Counter&&&Data_L&Counter++)
&&&&*((u8&*)&CBW&+&Counter)&=&Bulk_Data_Buff[Counter];
&&}//将buf数据拷贝入cbw结构体,便于下一次处理
&&CSW.dTag&=&CBW.dT
&&CSW.dDataResidue&=&CBW.dDataL
&&if&(Data_Len&!=&BOT_CBW_PACKET_LENGTH)
&&&&Bot_Abort(BOTH_DIR);
&&&&/*&reset&the&CBW.dSignature&to&desible&the&clear&feature&until&receiving&a&Mass&storage&reset*/
&&&&CBW.dSignature&=&0;
&&&&Set_Scsi_Sense_Data(CBW.bLUN,&ILLEGAL_REQUEST,&PARAMETER_LIST_LENGTH_ERROR);
&&&&Set_CSW&(CSW_CMD_FAILED,&SEND_CSW_DISABLE);
&&if&((CBW.CB[0]&==&SCSI_READ10&)&||&(CBW.CB[0]&==&SCSI_WRITE10&))
&&&&/*&Calculate&Logical&Block&Address&*/
&&&&SCSI_LBA&=&(CBW.CB[2]&&&&24)&|&(CBW.CB[3]&&&&16)&|&(CBW.CB[4]&&&&&8)&|&CBW.CB[5];
&&&&/*&Calculate&the&Number&of&Blocks&to&transfer&*/
&&&&SCSI_BlkLen&=&(CBW.CB[7]&&&&&8)&|&CBW.CB[8];
&&if&(CBW.dSignature&==&BOT_CBW_SIGNATURE)
&&&&/*&Valid&CBW&*/
&&&&if&((CBW.bLUN&&&Max_Lun)&||&(CBW.bCBLength&&&1)&||&(CBW.bCBLength&&&16))
&&&&&&Bot_Abort(BOTH_DIR);
&&&&&&Set_Scsi_Sense_Data(CBW.bLUN,&ILLEGAL_REQUEST,&INVALID_FIELED_IN_COMMAND);
&&&&&&Set_CSW&(CSW_CMD_FAILED,&SEND_CSW_DISABLE);
&&&&&&switch&(CBW.CB[0])
&&&&&&&&case&SCSI_REQUEST_SENSE:
&&&&&&&&&&SCSI_RequestSense_Cmd&(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_REQUEST_SENSE\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_INQUIRY:
&&&&&&&&&&SCSI_Inquiry_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_INQUIRY\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_START_STOP_UNIT:
&&&&&&&&&&SCSI_Start_Stop_Unit_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_START_STOP_UNIT\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_ALLOW_MEDIUM_REMOVAL:
&&&&&&&&&&SCSI_Start_Stop_Unit_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_MEDIA_REMOVAL\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_MODE_SENSE6:
&&&&&&&&&&SCSI_ModeSense6_Cmd&(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_MODE_SENSE6\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_MODE_SENSE10:
&&&&&&&&&&SCSI_ModeSense10_Cmd&(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_MODE_SENSE10\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_READ_FORMAT_CAPACITIES:
&&&&&&&&&&SCSI_ReadFormatCapacity_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_READ_FORMAT_CAPACITIES\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_READ_CAPACITY10:
&&&&&&&&&&SCSI_ReadCapacity10_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_READ_CAPACITY10\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_TEST_UNIT_READY:
&&&&&&&&&&SCSI_TestUnitReady_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_TEST_UNIT_READY\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_READ10:
&&&&&&&&&&SCSI_Read10_Cmd(CBW.bLUN,&SCSI_LBA&,&SCSI_BlkLen);
&&&&&&&&&&msc_debug_printf(&SCSI_READ10\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_WRITE10:
&&&&&&&&&&SCSI_Write10_Cmd(CBW.bLUN,&SCSI_LBA&,&SCSI_BlkLen);
&&&&&&&&&&msc_debug_printf(&SCSI_WRITE10\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_VERIFY10:
&&&&&&&&&&SCSI_Verify10_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_VERIFY10\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_FORMAT_UNIT:
&&&&&&&&&&SCSI_Format_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_FORMAT_UNIT\r\n&);
&&&&&&&&&&
&&&&&&&&&&/*Unsupported&command*/
&&&&&&&&case&SCSI_MODE_SELECT10:
&&&&&&&&&&SCSI_Mode_Select10_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_MODE_SELECT10\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_MODE_SELECT6:
&&&&&&&&&&SCSI_Mode_Select6_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_MODE_SELECT6\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_SEND_DIAGNOSTIC:
&&&&&&&&&&SCSI_Send_Diagnostic_Cmd(CBW.bLUN);
&&&&&&&&&&&msc_debug_printf(&SCSI_SEND_DIAGNOSTIC\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_READ6:
&&&&&&&&&&SCSI_Read6_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_READ6\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_READ12:
&&&&&&&&&&SCSI_Read12_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_READ12\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_READ16:
&&&&&&&&&&SCSI_Read16_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_READ16\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_READ_CAPACITY16:
&&&&&&&&&&SCSI_READ_CAPACITY16_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_READ_CAPACITY16\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_WRITE6:
&&&&&&&&&&SCSI_Write6_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_WRITE6\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_WRITE12:
&&&&&&&&&&SCSI_Write12_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_WRITE12\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_WRITE16:
&&&&&&&&&&SCSI_Write16_Cmd(CBW.bLUN);
&&&&&&&&&&msc_debug_printf(&SCSI_WRITE16\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_VERIFY12:
&&&&&&&&&&SCSI_Verify12_Cmd(CBW.bLUN);
&&&&&&&&&&&msc_debug_printf(&SCSI_VERIFY12\r\n&);
&&&&&&&&&&
&&&&&&&&case&SCSI_VERIFY16:
&&&&&&&&&&SCSI_Verify16_Cmd(CBW.bLUN);
&&&&&&&&&&&msc_debug_printf(&SCSI_VERIFY16\r\n&);
&&&&&&&&&&
&&&&&&&&default:
&&&&&&&&&&Bot_Abort(BOTH_DIR);
&&&&&&&&&&Set_Scsi_Sense_Data(CBW.bLUN,&ILLEGAL_REQUEST,&INVALID_COMMAND);
&&&&&&&&&&Set_CSW&(CSW_CMD_FAILED,&SEND_CSW_DISABLE);
&&&&/*&Invalid&CBW&*/
&&&&Bot_Abort(BOTH_DIR);
&&&&Set_Scsi_Sense_Data(CBW.bLUN,&ILLEGAL_REQUEST,&INVALID_COMMAND);
&&&&Set_CSW&(CSW_CMD_FAILED,&SEND_CSW_DISABLE);
/*******************************************************************************
*&Function&Name&&:&Transfer_Data_Request
*&Description&&&&:&Send&the&request&response&to&the&PC&HOST.
*&Input&&&&&&&&&&:&u8*&Data_Address&:&point&to&the&data&to&transfer.
*&&&&&&&&&&&&&&&&&&u16&Data_Length&:&the&nember&of&Bytes&to&transfer.
*&Output&&&&&&&&&:&None.
*&Return&&&&&&&&&:&None.
*******************************************************************************/
void&Transfer_Data_Request(u8*&Data_Pointer,&u16&Data_Len)
&&UserToPMABufferCopy(Data_Pointer,&ENDP2_TXADDR,&Data_Len);
&&SetEPTxCount(ENDP2,&Data_Len);
&&SetEPTxStatus(ENDP2,&EP_TX_VALID);
&&Bot_State&=&BOT_DATA_IN_LAST;
&&CSW.dDataResidue&-=&Data_L
&&CSW.bStatus&=&CSW_CMD_PASSED;
/*******************************************************************************
*&Function&Name&&:&Set_CSW
*&Description&&&&:&Set&the&SCW&with&the&needed&fields.
*&Input&&&&&&&&&&:&u8&CSW_Status&this&filed&can&be&CSW_CMD_PASSED,CSW_CMD_FAILED,
*&&&&&&&&&&&&&&&&&&or&CSW_PHASE_ERROR.
*&Output&&&&&&&&&:&None.
*&Return&&&&&&&&&:&None.
*******************************************************************************/
void&Set_CSW&(u8&CSW_Status,&u8&Send_Permission)
&&CSW.dSignature&=&BOT_CSW_SIGNATURE;
&&CSW.bStatus&=&CSW_S
&&UserToPMABufferCopy(((u8&*)&&CSW),&ENDP2_TXADDR,&CSW_DATA_LENGTH);
&&SetEPTxCount(ENDP2,&CSW_DATA_LENGTH);
&&Bot_State&=&BOT_ERROR;
&&if&(Send_Permission)
&&&&Bot_State&=&BOT_CSW_S
&&&&SetEPTxStatus(ENDP2,&EP_TX_VALID);
/*******************************************************************************
*&Function&Name&&:&Bot_Abort
*&Description&&&&:&Stall&the&needed&Endpoint&according&to&the&selected&direction.
*&Input&&&&&&&&&&:&Endpoint&direction&IN,&OUT&or&both&directions
*&Output&&&&&&&&&:&None.
*&Return&&&&&&&&&:&None.
*******************************************************************************/
void&Bot_Abort(u8&Direction)
&&switch&(Direction)
&&&&case&DIR_IN&:
&&&&&&SetEPTxStatus(ENDP2,&EP_TX_STALL);
&&&&case&DIR_OUT&:
&&&&&&SetEPRxStatus(ENDP2,&EP_RX_STALL);
&&&&case&BOTH_DIR&:
&&&&&&SetEPTxStatus(ENDP2,&EP_TX_STALL);
&&&&&&SetEPRxStatus(ENDP2,&EP_RX_STALL);
&&&&default:
}实质上就是实现usb的scsi存储接口,具体请看工程代码,另外需要注意,因为USB读取SD卡是在中断中,所以我们实际上操作物理介质的时候需要将读写函数做成可重入的,否则会为存储设备带来灾难的,也就是每次读取之前加一个标志位,不让其他资源来读写,类似于互斥信号量吧工程代码地址: 本文引用自:
目前看了点,觉得貌似复合设备就是两种方式混合,所以我对比了下
在转一篇经验我想把U盘(SD卡)和串口做成一个复合设备。参考了一些资料,ConfigDescriptor里用IAD复合描述符,现在的问题是只能枚举出一个设备,DeviceDescriptor里的idProduct如果是mass storage demo里的设置,枚举出的就是mass storage,如果用demo里的虚拟串口里的设置,枚举出的就是虚拟串口。那么,在复合设备里这个idProduct应该如何设置呢?在4.0库里的composite例子,把里面的HID部分去掉,换成virtual comport部分。搞了好几天,遇到一些问题,也算加深了了解。把一些关键点写下来给大家参考:1:主要修改usb_desc.c里的Composite_ConfigDescriptor,bNumInterfaces要改成总共的interface数目,我这里串口用了2个,u盘用了1个。然后是具体的描述,因为串口有2个interface,所以需要IAD描述,如果只有一个,就可以像例程那样直接描述。&&&&//&IAD
&&&&0x08,&&&&&&&&//描述符大小
&&&&0x0B,&&&&&&&&//IAD描述符类型
&&&&0x00,&&&&&&&&//&bFirstInterface&
&&&&0x02,&&&&&&&&//&bInterfaceCount
&&&&0x02,&&&&&&&&//&bFunctionClass:&CDC&Class
&&&&0x02,&&&&&&&&//&bFunctionSubClass
&&&&0x01,&&&&&&&&//&bFunctionProtocol
&&&&0x00,&&&&&&&&//&iFunction下面接串口本来的描述符,IAD里很简单原串口用了IN2,是中断传输,一直没找到和搞清楚具体的服务函数在哪儿?!有知道的说一声吧。因为u盘也用IN2和OUT2,所以把这里改成IN4。描述完串口接着描述u盘&&&&&&&&&&&&&&&&&&//&IAD
&&&&0x08,&&&&&&&&//描述符大小
&&&&0x0B,&&&&&&&&//IAD描述符类型
&&&&0x02,&&&&&&&&//&bFirstInterface
&&&&0x01,&&&&&&&&//&bInterfaceCount
&&&&0x08,&&&&&&&&//&bFunctionClass:&MASS&STORAGE&Class
&&&&0x06,&&&&&&&&//&bFunctionSubClass
&&&&0x50,&&&&&&&&//&bFunctionProtocol
&&&&0x01,&&&&&&&&//&iFunction下来照搬u盘描述即可。Composite_ConfigDescriptor 修改完了,别忘了修改一下usb_desc.h里的Composite_SIZ_CONFIG_DESC,因为增加了描述内容嘛。这时候就能枚举出符合设备了。2:整合,增加了端点,需要修改usb_prop.c里端点初始化部分。usb_endp.c里callback函数要修改。按照callback函数的增减修改usb_conf.h。这里有很重要的定义,改不好的话设备还是用不了。EP_NUM 是使用的端点数,我使用到ep4,那这里就是5。下来是BTABLE_ADDRESS各端点的缓冲区地址设置。BTABLE_ADDRESS是0,第一个缓冲区地址我这里要设为0x28。因为BTABLE_ADDRESS到第一个缓冲区之间是各缓冲区的偏移地址存放处,我用了5个端点,每个端点8个字节,所以我要把第一个缓冲区放在0x28才行。这个问题搞了好久才明白,参考 ,很详细。至此,修改完成,两种设备共存都正常工作了!只是驱动不容易装,如果我安装ST的串口驱动(修改过PID),那么就只有这个设备,u盘没有,如果直接自动装驱动,有u盘没串口。这时候手动更新有惊叹号的设备,指定串口的驱动,装好后测试也就正常了。U盘部分不需要驱动,串口部分不能自动安装驱动(即使系统安装过也不行),变惊叹号设备。如果再安装一次倒是可以用了,但是U盘却没了。对这个惊叹号设备手动选择驱动类型,强制使用以前安装的驱动则可以正常使用。这样搞总是不正常的样子。其实,要修改驱动包里的INF, %DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750改成%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750&MI_00就可以一切正常了。因为我这里设置串口为interface 0 开始的,惊叹号设备里也能看到 VID_0483&PID_5750&MI_00这样的信息,所以这样设置驱动就知道是要匹配0号interface的。至此,全部正常!本文转自:
几号学做复合设备,感谢分享
要回复问题请先或
浏览: 1563
关注: 6 人

我要回帖

更多关于 usb复合设备 的文章

 

随机推荐