找回密码
 立即注册
查看: 936|回复: 6

请教USB批量传输模式端点3做为输入无法接收数据如何配置

[复制链接]

1

主题

4

回帖

27

积分

新手上路

积分
27
发表于 2023-4-6 22:37:51 | 显示全部楼层 |阅读模式
有个产品通讯要求用USB设备的3号端子做为输入,2号端点做为输出,相应的端点描述符如下:


    0x07,                   //bLength(7);
    0x05,                   //bDescriptorType(Endpoint);
    0x83,                   //端点3 as IN);
    0x02,                   //bmAttributes(Bulk);
    0x40,0x00,              //wMaxPacketSize(64);
    0x0A,                   //bInterval(Ignored);

    0x07,                   //bLength(7);
    0x05,                   //bDescriptorType(Endpoint);
    0x02,                   //端点2 as OUT);
    0x02,                   //bmAttributes(Bulk);
    0x40,0x00,              //wMaxPacketSize(64);
    0x0A,                   //bInterval(Ignored);


我用的工程是在U盘工程上进行更改完成的,相应的接收和发送关键部分如下所示:


//#define EN_EP1IN
//#define EN_EP2IN
#define EN_EP3IN
//#define EN_EP4IN
//#define EN_EP5IN
//#define EN_EP1OUT
#define EN_EP2OUT
//#define EN_EP3OUT
//#define EN_EP4OUT
//#define EN_EP5OUT




void usb_bulk_intr_in(BYTE *pData, BYTE bSize, BYTE ep)
{
    //usb_write_fifo((BYTE)(FIFO1 + ep), pData, bSize);
        printf("write Fifo3=%d\r\n",(uint16_t)bSize);
        usb_write_fifo((BYTE)(FIFO0 + ep), pData, bSize);
    usb_write_reg(INCSR1, INIPRDY);
}



void scsi_in(BYTE *pData, int nSize)
{
    BYTE cnt;
        
    while (nSize)
    {
        cnt = EP3IN_SIZE;
        if (nSize < EP3IN_SIZE) cnt = nSize;
        
        while (usb_bulk_intr_in_busy());
        //usb_bulk_intr_in(pData, cnt, 1);
                usb_bulk_intr_in(pData, cnt, 2);
        
        nSize -= cnt;
        pData += cnt;
    }
}


所有要发送到电脑的数据是用scsi_in()这个函数完成。
现在的问题是电脑通过端点2发送到设备端的内容能收到,设备返回给电脑的数据,电脑收不到。
请问还有哪些地方要做修改?请专家指教,谢谢!
回复

使用道具 举报 送花

1

主题

4

回帖

27

积分

新手上路

积分
27
发表于 2023-4-6 22:40:01 | 显示全部楼层
void scsi_in(BYTE *pData, int nSize)
{
    BYTE cnt;
        
    while (nSize)
    {
        cnt = EP3IN_SIZE;
        if (nSize < EP3IN_SIZE) cnt = nSize;
        
        while (usb_bulk_intr_in_busy());
        //usb_bulk_intr_in(pData, cnt, 1);
                usb_bulk_intr_in(pData, cnt, 3);   //这个传输出函数,第3个参数改成3测试也是收不到
        
        nSize -= cnt;
        pData += cnt;
    }
}
回复 支持 反对

使用道具 举报 送花

1

主题

4

回帖

27

积分

新手上路

积分
27
发表于 2023-4-6 22:42:48 | 显示全部楼层
USB官方例程,改成用端点2接收和端点2发送,下载到官方试验箱中测试,U盘能正常工作
但改成端点3接收和端点3发送,下载到官方试验箱中测试,U盘无法被电脑打开,请问端点3是否有收发的使用例程

点评

下面是使用端点3的范例,请参考 注意:原范例下面这句有笔误  详情 回复 发表于 2023-4-7 10:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 2023-4-7 10:01:34 | 显示全部楼层
gd*** 发表于 2023-4-6 22:42
USB官方例程,改成用端点2接收和端点2发送,下载到官方试验箱中测试,U盘能正常工作
但改成端点3接收和端点 ...

下面是使用端点3的范例,请参考
注意:原范例下面这句有笔误

1.png


74-MSC(Mass Storage Class)协议范例-使用端点3.zip

241.43 KB, 下载次数: 83

回复 支持 反对

使用道具 举报 送花

1

主题

4

回帖

27

积分

新手上路

积分
27
发表于 2023-4-7 21:07:42 | 显示全部楼层
谢谢楼上的超级版主批指教,经过修改后能用端点3实现U盘功能,在实验箱上验证过了,功能与用端点0和端点1是一样的。
回复 支持 反对

使用道具 举报 送花

1

主题

4

回帖

27

积分

新手上路

积分
27
发表于 2023-4-7 21:10:23 | 显示全部楼层
输入与输出端点不是同一端点时,收到电脑发送的数据,需要返回结果前一定要切换到新的端点,然后将数据写入对应的FIFO中,然后电脑就收到设备发来的数据了。问题已经基本上找到了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15632
发表于 2023-4-7 21:35:01 | 显示全部楼层

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 03:09 , Processed in 0.257351 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表