嵌入式技术论坛
直播中

訾存贵

8年用户 926经验值
私信 关注
[问答]

stm32f1使用usb device的winusb设备无法收到接收回调咋回事?

实验平台是STM32f103c8t6 最小板,想做个winusb通信。hid和cdc速度太慢了。用winusb的话使用Bulk传输,速度只受usb总线和stm32硬件把控制器的限制。
问题描述 :
使用stm32f1作为usbdevice 然后只开启了一个winusb接口。

list_device
device           type         ref count
-------- -------------------- ----------
rtc      RTC                  0
winusb   Miscellaneous Device 1
usbd     USB Slave Device     0
可以看到生成出了usbd和winusb设备。
然后我写代码打开设备,进行读写,并使用python写了上位机测试代码。
python上位机可以收到stm32发过来的数据,但是python写给stm32的数据却一直没有收到

python上位机代码

from usb.backend import libusb1
import usb.core
import usb.util
#
USB_ID_VENDOR = 0x1234
USB_ID_PRODUCT = 0x5678
#print(usb.core.show_devices())
#usb_dev = usb.core.find(find_all=True,idVendor=USB_ID_VENDOR,idProduct=USB_ID_PRODUCT,backend=libusb1.get_backend() )
#for dev in usb_dev :
#  print(dev)
usb_dev = usb.core.find(idVendor=USB_ID_VENDOR,idProduct=USB_ID_PRODUCT,backend=libusb1.get_backend() )
print(usb_dev)
usb_dev.write(0x01,"1")
while True:
  data = usb_dev.read(0x81, 64,-1)
  print(data)
  usb_dev.write(0x01,data)
rtthread代码

#include "stdint.h"
#include "stdio.h"
#include "string.h"
#include "rtthread.h"
#include "rtdevice.h"
#define DBG_TAG "usb1"
#define DBG_LVL DBG_LOG
#include
#define USB_DEVICE_NAME            "winusb"
static                 rt_device_t            usb1_dev;     /* usb 设备句柄 */
static struct rt_semaphore        usb1_rx_sem;     /* 用于接收消息的信号量 */
/* 接收数据回调函数 */
static rt_err_t usb1_rx_call(rt_device_t dev, rt_size_t size)
{
    /* USB 接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
    rt_kprintf("usb1 rx call :%dn",size);
    rt_sem_release(&usb1_rx_sem);
    return RT_EOK;
}
static rt_err_t usb1_tx_done(rt_device_t dev,void *buffer)
{
    rt_kprintf("usb1 tx done :%pn",buffer);
    return RT_EOK;
}
void usb1_send_0x123(void)
{
    char *text = "123";
    int size = rt_device_write(usb1_dev, 0,text, 3);
    if (size < 0)
    {
        rt_kprintf("usb1 dev write data failed rc:%dn",size);
    }
}
static void usb1_thread(void *param)
{
    int rc = 0;
    usb1_dev = rt_device_find(USB_DEVICE_NAME);
    if (!usb1_dev)
    {
            rt_kprintf("find %s failed!n", USB_DEVICE_NAME);
            return ;
    }else
    {
        rt_kprintf("find %s ok!n", USB_DEVICE_NAME);
    }
    rt_sem_init(&usb1_rx_sem, "usb1_rx_sem", 0, RT_IPC_FLAG_FIFO);
    /* 打开 USB    设备 */
    rc = rt_device_open(usb1_dev, 0);
    RT_ASSERT(rc == RT_EOK);
    /* 设置回调函数 */
    rt_device_set_rx_indicate(usb1_dev, usb1_rx_call);
    rt_device_set_tx_complete(usb1_dev, usb1_tx_done);
    uint8_t temp_buff[32] = {0};
    while(1)
    {
        /*  循环读取数据,直到读取数据小于0表示缓存为空了 */
        do{
            rt_memset(temp_buff, 0, 32);
            rc = rt_device_read(usb1_dev, 0, temp_buff, 32);
            if(rc > 0)
            {
                rt_kprintf("usb read:%dn",rc);
                for(int i=0; i < rc; i++)
                {
                    rt_kprintf("0x%02X ",temp_buff);
                }
                rt_kprintf("n");
            }
        }while(rc <= 0);
        rt_kprintf("usb read waitn");
        /* 阻塞等待接收信号量 */
        rt_sem_take(&usb1_rx_sem, RT_WAITING_FOREVER);
        rt_kprintf("usb readn");
    }
}
int usb1_test_init(void)
{
    static int usb1_init = 0;
    rt_thread_t tid;
    if(usb1_init > 0)
    {
        return 0;
    }
    usb1_init = 1;
    tid = rt_thread_create("usb1",usb1_thread, NULL,1024,20, 10);
    if (tid != RT_NULL)
            rt_thread_startup(tid);
    return 0;
}
void usb1_test(uint8_t argc, char **argv)
{
    rt_kprintf("usb1 testn");
    usb1_send_0x123();
}
MSH_CMD_EXPORT(usb1_test, usb1 test);
void usb1_debug(uint8_t argc, char **argv)
{
    if(argc > 1)
    {
        int val = atoi(argv[1]);
        rt_kprintf("usb1 debug set %dn",val);
    }
}
MSH_CMD_EXPORT(usb1_debug, usb1 debug);
配置
2.jpg
3.jpg
4.jpg

更多回帖

×
20
完善资料,
赚取积分