完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有一块使用 MK60FN1M0VLQ12 处理器和 USB3300 PHY 的电路板,我想在其中连接 USBHS 通信。
因此,作为让此 USB 设备响应 USB 枚举的初步尝试,我创建了一个带有 USB 组件的 Processor Expert 项目,并实现了对 USB 枚举初始重置的设备描述符响应。 但是 USB 枚举失败:bLength of 0 不正确,应该是 18,并且所有描述符字段都是空的。并且进行 USB 数据包嗅探可确认设备和主机之间从未交换过任何数据包。 然而,在 MCU 中,我验证了 USB1_OnDeviceReset() 例程在传入复位时被调用,并且用于发送描述符的 USB1_DeviceInitEndpoint() 例程没有错误地完成。因此,永远不会调用 USB1_OnDeviceSetupPacket() 例程。 我究竟做错了什么?我在这里写我的 main.c 和 Events.c 以及附加项目。 主程序: /* ############################################## ################### ** 文件名:main.c ** 项目:USB_interface_PE ** 处理器:MK60FN1M0VLQ12 ** 版本:驱动程序 01.01 ** 编译器:GNU C 编译器 * * 日期/时间:2022 年 2 月 16 日,11:41,#CodeGen:0 ** 摘要: ** 主模块。 ** 此模块包含用户的应用程序代码。 **设置: **内容: **没有公共方法 ** ** ################################# ##################################*/ /*! ** @file main.c ** @version 01.01 ** @brief ** 主模块。 ** 此模块包含用户的应用程序代码。 */ /*! ** @addtogroup main_module 主模块文档 ** @{ */ /* MODULE main */ /* 包括编译此模块/过程所需的模块 */ #include "Cpu.h" #include "Events.h" #include "USB1.h" /* 包括用于整个项目的共享模块 */ #include "PE_Types.h" #include "PE_Error.h" #include "PE_Const.h" #include "IO_Map.h" /* User includes(#include 此行下面不是由 Processor Expert 维护的)*/ LDD_TDeviceData* usb; int 用户数据; LDD_TError USB_initControlEndpoint(void) { LDD_USB_TDevDescriptor 设备描述符; device_descriptor.bLength = sizeof(device_descriptor); device_descriptor.bDescriptorType = LDD_USB_DT_DEVICE; 设备描述符.bcdUSB = 0x0200;// USB2.0 device_descriptor.bDeviceClass = 0xff; // 类代码是供应商指定的 device_descriptor.bDeviceSubClass = 0x00; device_descriptor.bDeviceProtocol = 0x00; device_descriptor.bMaxPacketSize0 = 64; device_descriptor.idVendor = 0x0424; device_descriptor.idProduct = 0x0004; device_descriptor.bcdDevice = 1; // 设备版本 device_descriptor.iManufacturer = 1; 设备描述符.iProduct = 2; 设备描述符.iSerialNumber = 3; device_descriptor.bNumConfigurations = 1; 返回 USB1_DeviceInitEndpoint(usb, (LDD_USB_TEpDescriptor*)&device_descriptor, 0); } /*lint -save -e970 禁用 MISRA 规则 (6.3) 检查。*/ int main(void) /*lint -restore 启用 MISRA 规则 (6.3) 检查。*/ { /* 在这里写下你的局部变量定义 */ /*** Processor Expert 内部初始化。不要删除此代码!!!***/ PE_low_level_init(); /*** 处理器专家内部初始化结束。***/ /* 在这里写你的代码 */ usb = USB1_Init(&user_data); LDD_TError err_enable, err_disable; err_enable = USB1_Enable(usb); /*** 不要写任何经过这一行的代码,否则它会在代码生成时被删除。***/ /*** RTOS 启动代码。宏 PEX_RTOS_START 由 RTOS 组件定义。不要修改此代码!!!***/ #ifdef PEX_RTOS_START PEX_RTOS_START(); /* 所选 RTOS 的启动。宏由 RTOS 组件定义。*/ #endif /*** RTOS 启动代码结束。***/ /*** Processor Expert 主例程结束。不要修改此代码!!!***/ for(;;){} /*** Processor Expert 主例程结束。不要在下面写代码!!!***/ } /*** 主程序结束。不要修改此文本!!!***/ /* 结束主要内容 */ /*! ** @} */ /* ** ######################################## ########################### ** ** 此文件由 Processor Expert 10.5 [05.21]为 Freescale Kinetis 系列 创建 微控制器。 ** ** ############################################## ##################### */ 事件.c: /* ############################################## ################### ** 文件名:Events.c ** 项目:USB_interface_PE ** 处理器:MK60FN1M0VLQ12 ** 组件:事件 ** 版本:驱动程序 01.00 ** 编译器: GNU C Compiler ** Date/Time : 2022-02-16, 11:41, # CodeGen: 0 ** Abstract : ** 这是用户的事件模块。 ** 将您的事件处理程序代码放在这里。 ** 内容: ** Cpu_OnNMIINT - void Cpu_OnNMIINT(void); ** ** ############################################## #####################*/ /*! ** @file Events.c ** @version 01.00 ** @brief ** 这是用户的事件模块。 ** 将您的事件处理程序代码放在这里。 */ /*! ** @addtogroup Events_module 事件模块文档 ** @{ */ /* MODULE 事件 */ #include "Cpu.h" #include "事件.h" #ifdef __cplusplus 外部“C”{ #endif /* User includes (#include below this line is not maintained by Processor Expert) */ LDD_TError USB_initControlEndpoint(void); LDD_TError 重置错误; /* ** ============================================== ===================== ** 事件:Cpu_OnNMIINT(模块事件) ** ** 组件:Cpu [MK60FN1M0LQ15] */ /*! ** @brief ** 当不可屏蔽中断发生 ** 时调用此事件 。当 [NMI ** interrupt] 属性设置为“已启用”时,会自动启用此事件。 */ /* ============================================== =====================*/ void Cpu_OnNMIINT(void) { /* 在这里写你的代码 ... */ } /* ** ============================================== ===================== ** 事件:USB1_OnDeviceReset(模块事件) ** ** 组件:USB1 [USB1_LDD] */ /*! ** @brief ** 在 USB1 总线上检测到复位信号后调用, ** 启用 OnDeviceReset() 事件并启用 USB1 模块。 ** 请参阅 SetEventMask() 和 GetEventMask() 方法。在调用此 ** 事件之前,所有待处理的 ** 传输都将被取消,所有 EP 将被禁用。 设备地址设置为“0”。 ** @param ** UserDataPtr - 用户数据指针。这个 ** 指针作为 Init ** 方法的参数传递 。 */ /* ================================================ ===================*/ void USB1_OnDeviceReset(LDD_TUserData *UserDataPtr) { /* 在这里写你的代码... */ reset_error = USB_initControlEndpoint(); } /* ** ============================================== ===================== **事件:USB1_OnDeviceSpeedDetect(模块事件) ** **组件:USB1 [USB1_LDD] */ /*! ** @brief ** 在设备检测到总线速度后调用, 启用 OnBusSpedDetect() ** 事件并启用 USB1 模块。请参阅 ** SetEventMask() 和 GetEventMask() 方法。EP 0 应该 在 USB1 速度已知后启用和配置。 ** @param ** UserDataPtr - 用户数据指针。这个 ** 指针作为 Init ** 方法的参数传递 。 ** @param ** CurrentSpeed - 当前设备速度。 */ /* ================================================ ===================*/ void USB1_OnDeviceSpeedDetect(LDD_TUserData *UserDataPtr, LDD_USB_TBusSpeed CurrentSpeed) { /* 在这里写你的代码 ... */ } /* ** ============================================== ===================== **事件:USB1_OnDeviceSuspend(模块事件) ** **组件:USB1 [USB1_LDD] */ /*! ** @brief ** 在满足挂起条件后调用,OnDeviceSuspend() ** 事件被启用,USB1 模块被启用。请参阅 ** SetEventMask() 和 GetEventMask() 方法。 ** @param ** UserDataPtr - 用户数据指针。这个 ** 指针作为 Init ** 方法的参数传递 。 */ /* ============================================== =====================*/ void USB1_OnDeviceSuspend(LDD_TUserData *UserDataPtr) { /* 在这里写你的代码 ... */ } /* ** ============================================== ===================== ** 事件:USB1_OnDeviceResume(模块事件) ** ** 组件:USB1 [USB1_LDD] */ /*! ** @brief ** 在恢复信号完成后调用,OnDeviceResume() ** 事件被启用并且 USB1 模块被启用。请参阅 ** SetEventMask() 和 GetEventMask() 方法。 ** @param ** UserDataPtr - 用户数据指针。这个 ** 指针作为 Init ** 方法的参数传递 。 */ /* ============================================== =====================*/ void USB1_OnDeviceResume(LDD_TUserData *UserDataPtr) { /* 在这里写你的代码 ... */ } /* ** ============================================== ===================== **事件:USB1_OnDeviceSetupPacket(模块事件) ** **组件:USB1 [USB1_LDD] */ /*! ** @brief ** 在设置数据包被接收到内部 ** 缓冲区后调用,OnSetupPacket() 事件被启用并且 USB1 模块被 ** 启用。请参阅 SetEventMask() 和 GetEventMask() 方法。使用 ** 方法 GetSetupPacket() 将设置数据包复制到用户 ** 缓冲区。 ** @param ** UserDataPtr - 用户数据指针。这个 ** 指针作为 Init ** 方法的参数传递 。 ** @param ** EpNum - 端点编号。 */ /* ================================================ ===================*/ void USB1_OnDeviceSetupPacket(LDD_TUserData *UserDataPtr, uint8_t EpNum) { /* 在这里写你的代码 ... */ } /* 结束事件 */ #ifdef __cplusplus } /* 外部“C” */ #endif /*! ** @} */ /* ** ######################################## ########################### ** ** 此文件由 Processor Expert 10.5 [05.21]为 Freescale Kinetis 系列 创建 微控制器。 ** ** ############################################## ##################### */ |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
1950个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36511 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
5818 浏览 1 评论
6179 浏览 1 评论
6879 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4291 浏览 0 评论
692浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
671浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
685浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
766浏览 2评论
890浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 08:20 , Processed in 0.989345 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号