#include #include "usbreg.h" #include "usbcore.h" #include "usbuser.h" #include "usbcfg.h" #include "usb.h" #include "usb_hw.h" #include "usbdesc.h" #include "hid.h" #include "hiduser.h" #define _DEBUG_ #include "debug.h" #pragma diag_suppress 111,1441 //用来指示USB设备的状态 WORD USB_DeviceStatus; //用来存储设备的地址 BYTE USB_DeviceAddress; //用来存储USB当前使用的设备的配置 BYTE USB_Configuration; //此配置使用端点 DWORD USB_EndPointMask; //用于标志此端点是否已经被停止0~15依次代表15个端点 DWORD USB_EndPointHalt; //此配置使用的接口数 BYTE USB_NumInterfaces; //每个接口可用的当前接口可替换值 BYTE USB_AltSetting[USB_IF_NUM]; /*用于临时存储控制传输时的数据包*/ USB_SETUP_PACKET SetupPacket; /*用于向主机发送数据的EP0的数据结构*/ USB_EP_DATA EP0Data; /*EP0Buf用于向USB发送数据时用的缓冲区*/ BYTE EP0Buf[USB_MAX_PACKET0]; /*功能:复位USB的一些数据标志 *参数:无 *返回值:无 */ void USB_ResetCore(void) { //默认为总线供电,因为我们的USB现在不都是插在电脑上才能工作的么&^_^ USB_DeviceStatus = USB_POWER; //在枚举之初地址当然是0 USB_DeviceAddress = 0; //配置描述符的标识从1开始,这里也先置为0 USB_Configuration = 0; //目前使用的是端点0 USB_EndPointMask = 0x00010001; //没有停止的端点 USB_EndPointHalt = 0x00000000; } /*功能:建立阶段,读取建立数据包 *参数:无 *返回值:无 */ void USB_SetupStage(void) { USB_ReadEP(0x00,(BYTE*)&SetupPacket); } /*功能:建立阶段,In握手包 *参数:无 *返回值:无 */ void USB_StatusInStage(void) { USB_WriteEP(0x80,NULL,0); } /*功能:建立阶段,Out握手包 *参数:无 *返回值:无 */ void USB_StatusOutStage(void) { USB_ReadEP(0x00,EP0Buf); } /*功能:数据In阶段 *参数:无 *返回值:无 */ void USB_DataInStage(void) { DWORD cnt; //先计算引次要发送多少数据 if(EP0Data.Count > USB_MAX_PACKET0) cnt = USB_MAX_PACKET0; else cnt = EP0Data.Count; //这里写端点却主机读,则将Dir位置1 cnt = USB_WriteEP(0x80,EP0Data.pData,cnt); EP0Data.pData += cnt; EP0Data.Count -= cnt; } /*功能:数据Out阶段 *参数:无 *返回值:无 */ void USB_DataOutStage(void) { DWORD cnt; cnt = USB_ReadEP(0x00,EP0Data.pData); EP0Data.pData+=cnt; EP0Data.Count-=cnt; } /*功能:获取USB设备的状态 *参数:无 *返回值:TRUE --->成功 * FALSE --->错误 */ __inline BOOL USB_GetStatus(void) { DWORD n,m; switch(SetupPacket.bmRequestType.BM.Recipient) { //接收端是设备 case REQUEST_TO_DEVICE: //返回设备状态给他 EP0Data.pData = (BYTE *)&USB_DeviceStatus; //将状态信息发送给主机 USB_DataInStage(); break; //接收端是接口 case REQUEST_TO_INTERFACE: /*配置描述符的标识从1开始,并且请求的接口号不能大于接口的数目,因为接口数目从0开始 *因为我们接口描述符中的接口号是一个字节所以这里wIndex中的数据中人低字节有效 */ if((USB_Configuration !=0)&&(SetupPacket.wIndex.WB.L < USB_NumInterfaces)) { //清0两个字节,因为根据USB协议此处必须返回0 *((__packed WORD *)EP0Buf) = 0; EP0Data.pData = EP0Buf; //发送给主机 USB_DataInStage(); } //此接口出现了错误 else return FALSE; break; case REQUEST_TO_ENDPOINT: //端点号高1位0方向,低4位为端点号 n = SetupPacket.wIndex.WB.L & 0x8f; //m的高16位代表in端点的标志,低16位代表out端点的标志 m = (n&0x80)?(1<<16 )<< (n&0x0f) :(1< if((USB_Configuration !=0)||((n&0x0f)==0)&&(USB_EndPointMask & m)) { //查看此端点是否已经停用 *((__packed WORD *)EP0Buf) = (USB_EndPointHalt &m )?1:0; EP0Data.pData = EP0Buf; //将数据发送给主机 USB_DataInStage(); } //说明配置描述符出了问题 else return FALSE; break; default: return FALSE; } return TRUE; } /*功能:设置/清除USB设备的特征 *参数:sc 0----->清除 1----->设置 *返回值:TRUE --->成功 * FALSE --->错误 */ __inline BOOL USB_SetClrFeature(DWORD sc) { DWORD n,m; switch(SetupPacket.bmRequestType.BM.Recipient) { //接收端是设备,则清除或设置设备的特性 case REQUEST_TO_DEVICE: if(SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) { if(sc) { printf("设置设备远程唤醒特性rn"); //设置USB状态为使能远程唤醒 USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP; /*stm32硬件本身就支持远程唤醒,这里就不用设置了 *当然,软件支不支持在于对中断屏蔽位的设置 */ } else { printf("清除设备远程唤醒特性rn"); USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP; /*stm32硬件本身就支持远程唤醒,这里就不用设置了 *当然,软件支不支持在于对中断屏蔽位的设置
上一篇:关于stm32的USB学习笔记之USB_HW.c
下一篇:STM32关于USB的相关寄存器
推荐阅读
史海拾趣
品质是企业的生命线。安碁科技自成立以来,一直注重品质管理和技术创新。2000年,公司引进了全自动化制程设备,正式生产SMD产品,并通过了ISO9002认证。此后,安碁科技陆续通过了多项国际认证,如TL-9000、TS16949等,证明了其在品质管理方面的卓越表现。同时,公司也不断投入研发资源,推动技术创新和产品升级,以满足市场不断变化的需求。
在快速发展的同时,CINCH公司也注重质量管理体系的建设。公司引进了国际先进的质量管理理念和方法,建立了完善的质量管理体系,并通过了ISO9001等质量管理体系认证。这一举措不仅提升了公司的产品质量和服务水平,还增强了客户对公司的信任度和满意度。
作为英国翘楚皮具品牌,Ettinger有幸获得了H.R.H威尔士王的皇家保证。这一荣誉不仅是对Ettinger产品质量的认可,也为品牌的发展带来了更多的机遇。随着品牌知名度的提升,Ettinger逐渐成为了英国人最喜爱的皮具品牌之一,并在全球范围内拥有了广泛的粉丝群。
Base Two (2) Systems深知技术创新的重要性,因此不断加大对研发的投入。公司引进了一批高端研发人才和先进设备,为研发团队提供了强有力的支持。在研发团队的努力下,公司不断推出新产品,并对现有产品进行升级改进,以满足市场的不断变化和客户的多样化需求。
Base Two (2) Systems公司自创立之初,便以技术创新为核心竞争力。在创始团队的带领下,公司研发团队不断攻克技术难关,成功研发出一系列具有领先水平的电子产品。这些产品不仅性能卓越,而且具有广泛的应用前景,为公司在市场上赢得了良好的口碑。
随着技术的不断进步和市场需求的不断变化,AZ Displays的产品应用领域也在不断拓展。除了传统的消费电子领域外,公司的产品还广泛应用于航空电子、医疗、导航系统、工业控制等多个领域。通过与各行业合作伙伴的紧密合作,AZ Displays成功打开了新的市场大门,实现了业务的快速增长。
6、提高CPU的并行性 ( 1)使用并行代码 尽可能把长的有依赖的代码链分解成几个可以在流水线执行单元中并行执行的没有依赖的代码链。很多高级语言,包括 C++ ,并不对产生的浮点表达式重新排序,因为那是一个相当复杂的过程。需要注意的是,重 ...… 查看全部问答∨ |
|
2006年 四川省大学生电子设计竞赛试题-无线调频对讲机(内江师院) 本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 电子设计竞赛试题-无线调频对讲机 一、电子设计竞赛设计任务 设计一无线调频对讲机。 二、电子设计竞赛设计要求 1、基本要求: (1)、发射和接收频率范围:27MHz~31MHz(FM); (2) ...… 查看全部问答∨ |
1. 如果你有做硬件和单片机的经验,建议自己做个最小系统板:假如你从没有做过ARM的开发,建议你一开始不要贪大求全,把所有的应用都做好,因为ARM的启动方式和dsp或单片机有所不同,往往会碰到各种问题,所以建议先布一个仅有Flash,SRAM或SDRAM、C ...… 查看全部问答∨ |
在用FPGA对ASIC做原型验证的时候,ASIC内部模块间的端口数目较大,而多片FPGA之间的管脚数目相对来说却比较有限,对于这个问题,大虾们是怎么解决的? 谢谢~… 查看全部问答∨ |
|
现在用的vs2008做XP程序,买了昆仑通态的一体机,不想用昆仑通态的的那个东西, 软硬件环境 三星arm920,winCE4.2 请问大家都用什么编程环境啊?谢谢… 查看全部问答∨ |
|
设计资源 培训 开发板 精华推荐
- 【EEWORLD第三十九届】2012年06月社区明星人物揭晓!
- TI 培训积分全新上线!学课程 领积分 兑礼品
- 有奖直播 | 迈来芯为您详解:半导体研发功能安全的实现与技术支持
- 有奖直播 | 微软 Azure Sphere助力稳定,安全和灵活的物联网解决方案
- TI 工业月,灵感不设限!深度挖掘工业设计的痛点和难点,读专题填问卷赢好礼!
- 希望一月 爱上EEWORLD——论坛推广月
- Microchip最新SAM 以及 PIC32单片机软件开发平台-- MPLAB® Harmony V3介绍 ”
- 有奖直播:ams投影照明(MLA)增强汽车与道路的沟通
- 有奖直播 是德科技全新光通信测试方案介绍
- 基于USB PD受电协议芯片CH224 DIY创意秀