Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB_HID
USB设备_Device
【英飞凌开发板模块评测任务大挑战】英飞凌 PSOC6上的USBD实践
发布于 2023-04-27 20:17:00 浏览:731
订阅该版
[tocm] # 前言 本文介绍基于Modus ToolBox自动创建Demo工程,演示HID设备功能,以评估USBD模块。 # 模块介绍 参考《Infineon-PSoC_6_MCU_CY8C6xx8_CY8C6xxA_Architecture_Technical_Reference_Manual_(TRM)-AdditionalTechnicalInformation-v08_00-EN.pdf》的33. Universal Serial Bus (USB) Device Mode PSoC 6 MCU 提供了一个USB2.0全速设备接口。具备一下特征: - USB2.0全速 - 8个数据端点和一个控制端点 - 512B共享FIFO - 控制端点专用的8字节存储 - 支持控制,中断,批量,同步传输 - 支持总线和自供电 - 支持USB挂起以降低功耗 - 支持 无DMA,手动DMA模式 最大512字节的包 自动DMA模式 同步传输最大1023自己的包 - 带22欧终端电阻和1.5k上拉电阻 - 支持USB2.0 LPM 框图如下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/65e731261d1a7c8d6210d75483b0774b.png.webp) # 寄存器 参考《Infineon-PSoC_6_MCU_CY8C62x8_CY8C62xA_Registers_Technical_Reference_Manual-AdditionalTechnicalInformation-v06_00-EN.pdf》的21 USB Registers # 离线模式创建工程 1.安装Modus Toolbox建议从Infineon Developer Center Launcher安装,直接下载的话比较慢。 2.果在线从github拉取,需要配置C:\Windows\System32\drivers\etc\hosts后添加一行185.199.108.133 raw.githubusercontent.com 否则会提示不能访问raw.githubusercontent.com 3.如果修改了Modus Toolbox默认安装路径的话需要设置环境变量 CY_TOOLS_PATHS为安装路径D:/ModusToolbox/tools_3.0 注意斜杠方向为左斜杠 4.从以下地址下载离线包,在线git拉取基本都会失败 https://softwaretools.infineon.com/tools/com.ifx.tb.tool.modustoolboxofflinecontentpackage ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/3334bca77ab309d19486cf6505e58bca.png.webp) 5.配置离线包 将上述下载内容解压到%USERPROFILE%/.modustoolbox目录下 只有.modustoolbox/offline文件夹,其他之前在线模式已经下载的内容都要删掉。 新建系统环境变量CY_GETLIBS_OFFLINE=true 6.创建工程 离线的方式创建工程 参考 https://community.infineon.com/t5/Resource-Library/ModusToolbox-Offline-Libraries/ta-p/252265 打开Modus ToolBox File->New->ModusToolbox Applacation-> ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/e5fb1d68ae3fb8bb21e5155698c3d7b3.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/3d92bac6b1ac6245232310257f8374bc.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/219b9ef0bde5a2fbe7328084d4a69920.png.webp) # 测试 双击打开 D:\BOARD\infineonPSOC62\usb\USB_HID_Generic\USB_HID_Generic.cprj 另外需要先安装Cypress.PSoC6_DFP.1.2.0.pack包。 可以参考文章https://club.rt-thread.org/ask/article/4081c0c5c46e58dd.html 修改设备 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/a29b9ff51a63f73f67a42113a99ab135.png.webp) Pre_Include_Global.h中注释掉`#define CY_SUPPORTS_DEVICE_VALIDATION` `#define CY_TARGET_DEVICE CY8C624ABZI_S2D44` 改为`#define CY_TARGET_DEVICE CY8C624ABZI_S2D44` `#define CY_TARGET_DEVICE CY8C624ALQI_S2D42` 报以下错误 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/299b3569d61f52f34d520e4a32f2edb8.png.webp) 按如下设置 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/2abe105d00d4cd31b0bf7778732de3f0.png.webp) 设置仿真器 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/2169f7feaa30a409db1f9be8525d5c58.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/8ca0fbdc5d93c245bc1e9f5426aec3c8.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/8d8db4ca6116dafa2168d1d3d15c6fc4.png.webp) 下载运行 卡在了WCO初始化 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/141f92cde5e8647ec84a1dfe811b0530.png.webp) 这是因为板子上没有WCO的32.768Khz时钟 所以cycfg_system.c中注释掉//#define CY_CFG_SYSCLK_WCO_ENABLED 1 板子上也没有外接ECO 从手册上看到时钟树,只能使用IMO作为系统时钟源, ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/85852ce12d38430d569c13b385618265.png.webp) 修改#define CY_CFG_SYSCLK_CLKBAK_SOURCE CY_SYSCLK_BAK_IN_WCO 为#define CY_CFG_SYSCLK_CLKBAK_SOURCE CY_SYSCLK_BAK_IN_ILO 全部选择IMO作为时钟源 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/b1a294b100f09b04cba3370df50052d5.png.webp) 接上USB线到PC,运行程序测试可以看到多了USB输入设备 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/5a2a304872759f3a2f879ae55c766451.png.webp) # 调试 从https://github.com/OpenAcousticDevices/USB-HID-Tool 下载HID调试工具 进入USB-HID-Tool\bin\windows目录 右键打开终端 输入./usbhidtool.exe 0x04B4 0xE17E 4 0xDE 0xAD 0xBE 0xEF 其中0x04B4 0xE17E是设备的VID和PID, 发送4个字节给设备(实际发送64字节剩余的补0),设备原样返回收到的数据 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/60ccfb1d66f80135e33eb31a397e9aa4.png.webp) 以上结合仿真就可以进行调试了。 # 代码介绍 代码框架如下 使用了usbdev设备驱动 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230427/66ddb664c9ce7271af6d3e6cbbc566c9.png.webp) 详见main函数 ``` int main(void) { cy_rslt_t result; cy_en_usb_dev_ep_state_t ep_state; uint32_t count; uint32_t read_count; /* Initialize the device and board peripherals */ result = cybsp_init() ; if (result != CY_RSLT_SUCCESS) { CY_ASSERT(0); } /* Enable global interrupts */ __enable_irq(); /* Initialize the User LED */ cyhal_gpio_init((cyhal_gpio_t) CYBSP_USER_LED, CYHAL_GPIO_DIR_OUTPUT, CYHAL_GPIO_DRIVE_STRONG, CYBSP_LED_STATE_OFF); /* Initialize the USB device */ Cy_USB_Dev_Init(CYBSP_USBDEV_HW, &CYBSP_USBDEV_config, &usb_drvContext, &usb_devices[0], &usb_devConfig, &usb_devContext); /* Initialize the HID Class */ Cy_USB_Dev_HID_Init(&usb_hidConfig, &usb_hidContext, &usb_devContext); /* Initialize the USB interrupts */ Cy_SysInt_Init(&usb_high_interrupt_cfg, &usb_high_isr); Cy_SysInt_Init(&usb_medium_interrupt_cfg, &usb_medium_isr); Cy_SysInt_Init(&usb_low_interrupt_cfg, &usb_low_isr); /* Enable the USB interrupts */ NVIC_EnableIRQ(usb_high_interrupt_cfg.intrSrc); NVIC_EnableIRQ(usb_medium_interrupt_cfg.intrSrc); NVIC_EnableIRQ(usb_low_interrupt_cfg.intrSrc); /* Make device appear on the bus. This function call is blocking, * it waits till the device enumerates */ Cy_USB_Dev_Connect(true, CY_USB_DEV_WAIT_FOREVER, &usb_devContext); /* Turn on User LED after enumeration */ cyhal_gpio_write(CYBSP_USER_LED1, CYBSP_LED_STATE_ON); /* Enable OUT endpoint to receive data from host */ Cy_USB_Dev_StartReadEp(USB_OUT_ENDPOINT, &usb_devContext); for(;;) { cyhal_system_sleep(); /* Read the OUT Endpoint state */ ep_state = Cy_USBFS_Dev_Drv_GetEndpointState(CYBSP_USBDEV_HW, USB_OUT_ENDPOINT, &usb_drvContext); /* Check if any data from USB host is ready to be read */ if (ep_state == CY_USB_DEV_EP_COMPLETED) { /* Turn off User LED when data is received */ cyhal_gpio_write(CYBSP_USER_LED1, CYBSP_LED_STATE_OFF); /* Check how many bytes are available to read */ count = Cy_USB_Dev_GetEpNumToRead(USB_OUT_ENDPOINT, &usb_devContext); /* Copy data to the application usb buffer */ Cy_USB_Dev_ReadEpBlocking(USB_OUT_ENDPOINT, usb_buffer, count, &read_count, CY_USB_DEV_WAIT_FOREVER, &usb_devContext); /* Write data back to the host */ Cy_USB_Dev_WriteEpBlocking(USB_IN_ENDPOINT, usb_buffer, read_count, CY_USB_DEV_WAIT_FOREVER, &usb_devContext); /* Enable OUT endpoint to receive data from host again */ Cy_USB_Dev_StartReadEp(USB_OUT_ENDPOINT, &usb_devContext); /* Turn on User LED after data is sent */ cyhal_gpio_write(CYBSP_USER_LED1, CYBSP_LED_STATE_ON); } } } /*************************************************************************** * Function Name: usb_high_isr ******************************************************************************** * Summary: * This function process the high priority USB interrupts. * ***************************************************************************/ static void usb_high_isr(void) { /* Call interrupt processing */ Cy_USBFS_Dev_Drv_Interrupt(CYBSP_USBDEV_HW, Cy_USBFS_Dev_Drv_GetInterruptCauseHi(CYBSP_USBDEV_HW), &usb_drvContext); } /*************************************************************************** * Function Name: usb_medium_isr ******************************************************************************** * Summary: * This function process the medium priority USB interrupts. * ***************************************************************************/ static void usb_medium_isr(void) { /* Call interrupt processing */ Cy_USBFS_Dev_Drv_Interrupt(CYBSP_USBDEV_HW, Cy_USBFS_Dev_Drv_GetInterruptCauseMed(CYBSP_USBDEV_HW), &usb_drvContext); } /*************************************************************************** * Function Name: usb_low_isr ******************************************************************************** * Summary: * This function process the low priority USB interrupts. * **************************************************************************/ static void usb_low_isr(void) { /* Call interrupt processing */ Cy_USBFS_Dev_Drv_Interrupt(CYBSP_USBDEV_HW, Cy_USBFS_Dev_Drv_GetInterruptCauseLo(CYBSP_USBDEV_HW), &usb_drvContext); } ``` # 总结 以上通过一个HID设备实例演示了PSOC的USBD模块, step by step通过创建工程和测试调试。得益于Modus ToolBox的自动创建Demo 工程我们可以很快速的进行模块评估,基于Demo进行应用开发。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
RT thread HID 如何收发数据
2
解决usbhost 无法使用hid设备的问题,
3
rtthread winusb 修改 vid 与 pid 设备就不识别
4
rtthread USB HOST怎么与HID设备连接通讯
5
usb设备端HID问题
6
USB Host 鼠标键盘枚举无法获取HID设备描述符
7
USB作为HID设备怎么与PC交互?
8
USB Device HID 如何使用?
9
usb hid device超时接口
10
shell如何移植到HID接口?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部