请教USB批量传输模式端点3做为输入无法接收数据如何配置
有个产品通讯要求用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发送到设备端的内容能收到,设备返回给电脑的数据,电脑收不到。
请问还有哪些地方要做修改?请专家指教,谢谢!
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;
}
} USB官方例程,改成用端点2接收和端点2发送,下载到官方试验箱中测试,U盘能正常工作
但改成端点3接收和端点3发送,下载到官方试验箱中测试,U盘无法被电脑打开,请问端点3是否有收发的使用例程 gdrc 发表于 2023-4-6 22:42
USB官方例程,改成用端点2接收和端点2发送,下载到官方试验箱中测试,U盘能正常工作
但改成端点3接收和端点 ...
下面是使用端点3的范例,请参考
注意:原范例下面这句有笔误
谢谢楼上的超级版主批指教,经过修改后能用端点3实现U盘功能,在实验箱上验证过了,功能与用端点0和端点1是一样的。 输入与输出端点不是同一端点时,收到电脑发送的数据,需要返回结果前一定要切换到新的端点,然后将数据写入对应的FIFO中,然后电脑就收到设备发来的数据了。问题已经基本上找到了。 {:smile:}
页:
[1]