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

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

[复制链接]

该用户从未签到

1

主题

4

回帖

25

积分

新手上路

积分
25
发表于 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

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 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

回帖

25

积分

新手上路

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

点评

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

使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    16

    主题

    728

    回帖

    2620

    积分

    超级版主

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

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

    1.png


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

    241.43 KB, 下载次数: 28

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    25

    积分

    新手上路

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

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    25

    积分

    新手上路

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

    使用道具 举报

    该用户从未签到

    557

    主题

    9695

    回帖

    1万

    积分

    管理员

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

    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-2 05:47 , Processed in 0.067980 second(s), 60 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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