完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
型号:NUC472,官方的 STD Drive 里面有关 USBD_HID从设备很难用,只能够枚举成功,但是数据发送不知道怎么发出去(发送我不想通过中断的方式,使用查询即可,但没找到操作的函数在哪里),数据接收可用中断(还没有试下是否可以),请问有没有USB使用查询方式发送数据的例程?
|
|
相关推荐
1个回答
|
|
对于NUC472,可以使用官方提供的USB Device Vendor Class例程作为参考,了解如何使用查询方式发送数据。该例程中有一个Vendor Request的例子,可以在主机端发送Vendor Request指令给设备,设备收到指令后回复数据。具体实现代码如下:
主机端: ``` #define VENDOR_REQUEST_ID 0xA0 #define VENDOR_REQUEST_LEN 8 uint8_t VendorRequestBuf[VENDOR_REQUEST_LEN] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; int main() { //USB初始化代码省略 //... //发送Vendor Request指令给设备 USBD_VendorRequest(HID_IN_EP_NUM, VENDOR_REQUEST_ID, 0, 0, VendorRequestBuf, VENDOR_REQUEST_LEN); //等待设备回复数据 while(!IsVendorRequestDone); //从设备读取数据 uint8_t VendorRequestData[VENDOR_REQUEST_LEN]; USBD_VendorRequest(HID_OUT_EP_NUM, VENDOR_REQUEST_ID, 0, 0, VendorRequestData, VENDOR_REQUEST_LEN); //处理收到的数据 //... } ``` 设备端: ``` #define VENDOR_REQUEST_ID 0xA0 void VendorRequest_Callback(S_USBD_CMD_T *cmd) { if(cmd->bmRequestType & 0x80) { /* request data transfer direction */ /* Device to host */ switch(cmd->bRequest) { case VENDOR_REQUEST_ID: USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(cmd->ucEPNum)), VendorRequestData, VENDOR_REQUEST_LEN); USBD_SET_DATA1(cmd->ucEPNum); USBD_SET_PAYLOAD_LEN(cmd->ucEPNum, VENDOR_REQUEST_LEN); break; default: /* Error */ USBD_SET_EP_STALL(cmd->ucEPNum); break; } } else { /* Host to device */ switch(cmd->bRequest) { case VENDOR_REQUEST_ID: USBD_MemCopy(VendorRequestData, (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(cmd->ucEPNum)), VENDOR_REQUEST_LEN); IsVendorRequestDone = TRUE; USBD_SET_DATA1(cmd->ucEPNum); USBD_SET_PAYLOAD_LEN(cmd->ucEPNum, VENDOR_REQUEST_LEN); break; default: /* Error */ USBD_SET_EP_STALL(cmd->ucEPNum); break; } } } ``` 上述代码中,主机端通过调用USBD_VendorRequest函数发送了一个Vendor Request指令给设备,设备在收到指令后会调用VendorRequest_Callback函数进行处理。设备会从命令中解析出指令编号,根据指令编号分别进行数据的收发操作。收到数据后,设备会将数据保存在VendorRequestData数组中,并将IsVendorRequestDone标志位设为TRUE,以通知主机端该指令已经处理完成。主机端在收到通知后,再通过调用USBD_VendorRequest函数从设备端读取数据。 需要注意的是,在设备端收到Vendor Request指令时,必须在函数中进行数据的收发操作,并在收到数据后将IsVendorRequestDone标志位设为TRUE。否则,主机端将一直等待设备端回复数据,程序会一直阻塞。 |
|
|
|
只有小组成员才能发言,加入小组>>
820 浏览 0 评论
1162 浏览 1 评论
2537 浏览 5 评论
2872 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2722 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1127浏览 3评论
199浏览 2评论
466浏览 2评论
382浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
464浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 05:40 , Processed in 0.924437 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号