阅读:2999回复:18
DMA传输速度问题。
我的USB板卡1581利用周立功给的驱动程序(无源码),速度能达到10m字节/s。但是利用自己编写的驱动和应用程序却达不到,仅为可怜的60K字节/s左右,每次只能传64字节的数据,不知道如何解决?哪位给点好的建议?或者能给我1581的测试程序?我的测试程序是利用厂商请求发出DMA请求命令然后批量传输的,开辟了一个线程,就是在驱动网上down的。
|
|
沙发#
发布于:2004-07-20 18:40
补充一点:
我的应用程序是用DeviceIOcontrl函数先发送VENDOR_REQUEST命令到驱动程序,即发送64(只能为这个???)字节的setup包,然后用DeviceIOcontrl来发送bulk_in命令传输。每次我设置bulk的传输数据为4096,但是结果还是传输了64?请问怎么加大每次读写的缓冲区??? |
|
板凳#
发布于:2004-07-21 09:04
我也是用1581的,驱动自己写的,一次可以传3M数据,用逻辑分析仪
看,好象是20MBYTE/S(DREQ上升下降之间的距离). 你的是HS还是FS?BULK MAXPACKET 是多少?64BYTE?为什么不设512 BYTE?你在传时向DMA COUNTER REGISTER写了多少?64BYTE?我写了 4M,然后传,由于DMA总线比USB总线慢得多,所以就不用管它,DMA总 在读,USB有空间就写,直到DMA中断发生. |
|
|
地板#
发布于:2004-07-21 09:29
Such a question was asked million times, please query answers before you create a post.
The transferring rate will be significantly improved if MaximumTransferSize is increased to reasonable size when driver configures usb interface. The default value of MaximumTransferSize is 4096 and you can set it to 64*1024 or more. Somebody in the forum increases MaximumTransferSize to 1M and the transferring rate reaches 1MB/s in USB 1.1 mode, you can search the post. Anothing thing you must take care of is firmware, firmware takes key role in transferring rate improvement. |
|
地下室#
发布于:2004-07-21 09:41
我用的是断开 模式,mdma从机模式传输。BULK MAXPACKET 设置的为4096,在传时向DMA COUNTER REGISTER写了40960×1000BYTE?但是我得到的速度还是每秒64k左右,因为我即使dResult=pDLG->ISP1581TEST_DEVICE.ReadBulkPipes (40960,DmaBuffer+40960*i,&Trans);但是每次还是传输64字节而不是40960,我的驱动也响应改了,但是没有用,请metalwing
帮我看看。多谢了 驱动中:这是D12_DRIVER_BULK_IN_Handler,我不知道哪儿需要变更? > NTSTATUS D12_DriverDevice::D12_DRIVER_BULK_IN_Handler(KIrp I) > { > PURB pUrb; > NTSTATUS status; > t << "Entering DddDevice::BULK_IN, " << I << EOL; > // TODO: Check the incoming request. Replace "FALSE" in the following > // line with a check that returns TRUE if the request is not valid. > > if (I.IoctlOutputBufferSize() == 0) > { > I.Information() = 0; > return I.PnpComplete(this, STATUS_SUCCESS); > } > > // Declare a memory object > > ULONG dwTotalSize = I.IoctlInputBufferSize(CURRENT); > ULONG dwMaxSize = m_Endpoint2In.MaximumTransferSize(); > > // If the total requested read size is greater than the Maximum Transfer > // Size for the Pipe, request to read only the Maximum Transfer Size since > // the bus driver will fail an URB with a TransferBufferLength of greater > // than the Maximum Transfer Size. > if (dwTotalSize > dwMaxSize) > { > ASSERT(dwMaxSize); > dwTotalSize = dwMaxSize; > } > ULONG dwBytesRead = 0; > // Create an URB to do actual Bulk read from the pipe > pUrb = m_Endpoint2In.BuildBulkTransfer( > (unsigned char *)I.IoctlBuffer(), // transfer buffer > dwTotalSize, // transfer buffer size > TRUE, // Host To Device > NULL, // link urb > FALSE, // Short Ok > NULL // new urb > ); > > if ( pUrb != NULL) > { > // Submit the URB to our USB device, synchronously - say less is OK > // pUrb->UrbBulkOrInterruptTransfer.TransferFlags = > // (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK); > > status = m_Endpoint1In.SubmitUrb(pUrb, NULL, NULL,300);//请问速度 是这里需要修改吗?为什么是端点1in?我的驱动为2in可以吗?我的端点设置为1中断 in,4096(这个和64字节一样效果?)1中断out,2bulkin,2bulkout,驱动程序中在 哪儿修改传输字节数? > > if ( NT_SUCCESS(status) ) > { > dwBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength; > > if (dwBytesRead > 0) > t << "BULK_IN got " << dwTotalSize << " bytes from USB\n"; > } > > delete pUrb; > } > else > { > status=STATUS_INSUFFICIENT_RESOURCES; > } > > > I.Information() = dwBytesRead; > return status; > } > 应用程序中:DoBulkIn函数 > UINT DoBulkIn(void * pParam) > { > CISP1581TESTDlg * pDLG=(CISP1581TESTDlg *)pParam; > static REQUEST SetDmaCom={0x40,0x0c,0,0x0471,0x40}; > ~~~这个值可以任意修改?对 速度没有影响? > //static REQUEST SetDmaCom={0x40,0x0c,64,0x06,0x0471}; > static DWORD TotalTrans=0; > static DWORD Trans=0; > static UCHAR SetDmaInData[6]={0,0,0,64,0,1}; > static DWORD dResult=0; > unsigned char *DmaBuffer; 40960*1000); > HANDLE hFile; > DWORD dwWritten; > int i=0; > hFile=CreateFile("DATA_BULK_IN",GENERIC_WRITE, FILE_SHARE_READ, NULL, > CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); > > if (hFile == INVALID_HANDLE_VALUE) > goto Exit ; > > > while (BulkInThread) > { > pDLG->BulkThreadRuning=1; > > dResult=pDLG->ISP1581TEST_DEVICE.VendorRequest (SetDmaCom,SetDmaInData); > if(dResult!=ERROR_SUCCESS) > goto Exit; > > > dResult=pDLG->ISP1581TEST_DEVICE.ReadBulkPipes (40960,DmaBuffer+40960*i,&Trans); > ~~??这个地方我怎么改大 小都只传输64字节? > > if(dResult!=ERROR_SUCCESS) > goto Exit; > TotalTrans+=Trans; > CString sTotalTrans; > sTotalTrans.Format("%d字节",TotalTrans/4096); > pDLG->GetDlgItem (IDC_TXT_BULK_IN_DONE)->SetWindowText(sTotalTrans); > > if(dResult!=ERROR_SUCCESS) > goto Exit; > i++; > if (i==1000) > { > BulkInThread=0; > } > SetButton(BulKIn,Start,pDLG); > } > WriteFile(hFile, DmaBuffer, 40960*1000, &dwWritten, 0); > CloseHandle(hFile); > free(DmaBuffer); > SetButton(BulKIn,Stop,pDLG); > pDLG->BulkThreadRuning=0; > return dResult; > Exit: > SetButton(BulKIn,Stop,pDLG); > pDLG->BulkThreadRuning=0; > return dResult; > } > > 谢谢metalwing,你的QQ是……?给多少分都在所不惜的! 帮我看看了,我攻这个都半个多月了,没有一点进展!!! |
|
5楼#
发布于:2004-07-21 09:42
谢谢WINDRV兄.
看到你很多次了,觉得你的理论知识及其扎实,实际经验也不少,希望 以后多多交流. 再次谢谢. EMAIL:DIEUNDERSWORD@163.COM |
|
|
6楼#
发布于:2004-07-21 09:59
static UCHAR SetDmaInData[6]={0,0,0,64,0,1};
别的还没仔细看,你上面的是1581 VENDOR REQUEST 0471的后续数据吧?你在长度里为什么赋64BYTE?我不知到你的固件如何解析它的, 我是把长度直接写入DMA COUNTER REGISTER,如果你跟我的一样的话,那当然只传64BYTE了。另:我在驱动里将后续的6个字节改为8个 字节,将长度定义为4个字节(跟DMA COUNTER REGISTER一样长), 这样就可以传输更长的数据了。 另:WINDRV兄说的很对,传输速率的快慢跟固件有直接关系,建议你看看你的固件有什么需要改进。 我没QQ。不好意思. 一点愚见,不知对否。 [编辑 - 7/21/04 by metalwing] |
|
|
7楼#
发布于:2004-07-21 10:21
1. How can you set bulk maxpacket to 4096? In usb 2.0 mode, the bulk packet size should be 512, this is a standard. If you set it to 4096, it will bring a big trouble in the future when your device connects to different brand of usb 2.0 pci card.
2. MaximumTransferSize is setup when driver configures interface. It is usually in IRP_MN_START_DEVICE dispatcher. 3. Since IN1 is an interrupt endpoint and IN2 is a bulk endpoint, why not use IN2? If you have a member m_Endpoint2In, you can replace m_Endpoint1In. metalwing, thanks for your appraise. you are excellent too. darydl's problem seems in firmware. Although I am not familiar with D12 firmware, I guess your suggestion of SetDmaInData is correct. [编辑 - 7/21/04 by windrv] |
|
8楼#
发布于:2004-07-21 11:31
感谢二位大侠!!!
这是我固件程序中的设置。 //Bulk Out MaxPacketSize Endpoint D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点 D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes dary ~~~这个必须是64? //Bulk In MaxPacketSize EndpointD14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点 D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes dary void Init_Main(void) { AUXR = 0x02; CKCON = 0x01; //disable ISP1581 chip select ISP1581_CS = 1; //关1581片选 bytecount = 0; PIO_Count = 4096; //dary64 这里是我修改的。 Type = 0; // USB_Device.BITS.DMA_Test_Mode = PIO_Test; USB_Device.BITS.DMA_Test_Mode = GDMA_Test; ^…… //初始化ISP1581 Init_D14(); } 中断out m_Endpoint1OUT.Initialize(m_Lower, 0x1, 64); 中断in m_Endpoint1IN.Initialize(m_Lower, 0x81, 64); bulkout m_Endpoint2OUT.Initialize(m_Lower, 0x2, 4096); bulkin m_Endpoint2IN.Initialize(m_Lower, 0x82, 4096); windv这个地方只能为最大512吗?多谢了 驱动程序: NTSTATUS ISP1581_DRIVERDevice::ISP1581_DRIVER_BULK_IN_Handler(KIrp I) { PURB pUrb; NTSTATUS status; t << "Entering ISP1581_DRIVER_BULK_IN_Handler::BULK_IN, " << I << EOL; // TODO: Check the incoming request. Replace "FALSE" in the following // line with a check that returns TRUE if the request is not valid. if (I.IoctlOutputBufferSize() == 0) { I.Information() = 0; return I.PnpComplete(this, STATUS_SUCCESS); } // Declare a memory object ULONG dwTotalSize = 4096;//I.IoctlInputBufferSize(CURRENT); ULONG dwMaxSize = 4096; 这是我修改的,没有用???!? // than the Maximum Transfer Size. if (dwTotalSize > dwMaxSize) { ASSERT(dwMaxSize); dwTotalSize = dwMaxSize; } ULONG dwBytesRead = 0; // Create an URB to do actual Bulk read from the pipe pUrb = m_Endpoint2IN.BuildBulkTransfer( (unsigned char *)I.IoctlBuffer(), // transfer buffer 4096,//dwTotalSize, 这里也是 // transfer buffer size TRUE, // Host To Device NULL, // link urb FALSE, // Short Ok NULL // new urb ); if ( pUrb != NULL) { // Submit the URB to our USB device, synchronously - say less is OK // pUrb->UrbBulkOrInterruptTransfer.TransferFlags = // (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK); status = m_Endpoint2IN.SubmitUrb(pUrb, NULL, NULL,1000); if ( NT_SUCCESS(status) ) { dwBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength; if (dwBytesRead > 0) t << "BULK_IN got " << dwTotalSize << " bytes from USB\n"; } delete pUrb; } else { status=STATUS_INSUFFICIENT_RESOURCES; } I.Information() = dwBytesRead; return status; } 下面的函数不用修改??? ISP1581_DRIVERDevice::ISP1581_DRIVER_VENDOR_REQUEST_Handler(KIrp I) { PURB pUrb; NTSTATUS status; // UCHAR buffer1[]={0,0,0,0x20,0,0x80}; // UCHAR buffer1[]={0x40,0x0c,0,0x0471,0x06}; t << "ISP1581_DRIVER_VENDOR_REQUEST_Handler, " << I << EOL; pUrb = m_Lower.BuildVendorRequest( (unsigned char *)I.IoctlBuffer(), // transfer buffer I.IoctlInputBufferSize(), // transfer buffer size // buffer1, // 6, // buffer1, // 4096, 0, // ReservedBits 0x0c, // Request 0, // Value 0, // Direction 0, // bShortOk NULL, // Link 0x0471, // wIndex URB_FUNCTION_VENDOR_DEVICE, // Function NULL //pUrb ); if ( pUrb == NULL ) { status = STATUS_INSUFFICIENT_RESOURCES; } else { // submit the URB to USBD status = m_Lower.SubmitUrb(pUrb); delete pUrb; } return status; } 应用程序: UINT DoBulkIn(void * pParam) { CISP1581TESTDlg * pDLG=(CISP1581TESTDlg *)pParam; static REQUEST SetDmaCom={0x40,0x0c,0,0x0471,0x06}; static DWORD TotalTrans=0; static DWORD Trans=0; static UCHAR SetDmaInData[6]={0,0,0,64,0,1}; ~~metalwing 我修改了这个地方,但是没有用啊 static DWORD dResult=0; unsigned char *DmaBuffer; DmaBuffer = (unsigned char*)malloc(40960*1000); 我设置的缓冲大小 HANDLE hFile; DWORD dwWritten; int i=0; hFile=CreateFile("DATA_BULK_IN",GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) goto Exit ; while (BulkInThread) { pDLG->BulkThreadRuning=1; dResult=pDLG->ISP1581TEST_DEVICE.VendorRequest (SetDmaCom,SetDmaInData); if(dResult!=ERROR_SUCCESS) goto Exit; dResult=pDLG->ISP1581TEST_DEVICE.ReadBulkPipes (64,DmaBuffer+64*i,&Trans); ~~~这个我改大了,比如40960但是没有用还是64。 if(dResult!=ERROR_SUCCESS) goto Exit; TotalTrans+=Trans; CString sTotalTrans; sTotalTrans.Format("%d字节",TotalTrans/4096); pDLG->GetDlgItem (IDC_TXT_BULK_IN_DONE)->SetWindowText(sTotalTrans); if(dResult!=ERROR_SUCCESS) goto Exit; i++; if (i==1000) { BulkInThread=0; } SetButton(BulKIn,Start,pDLG); } WriteFile(hFile, DmaBuffer, 40960*1000, &dwWritten, 0); CloseHandle(hFile); free(DmaBuffer); SetButton(BulKIn,Stop,pDLG); pDLG->BulkThreadRuning=0; return dResult; Exit: SetButton(BulKIn,Stop,pDLG); pDLG->BulkThreadRuning=0; return dResult; } 谢谢二位◎!!!马上放分。对了metalwing大侠的邮箱IEUNDERSWORD@163.COM不好用啊,能告诉我好使的吗?谢谢了。 |
|
9楼#
发布于:2004-07-21 12:14
这是我的固件程序(初始化DMA):
MOV DPTR, #0038H ;initial dma MOV A, #01H MOVX @DPTR, A MOV A, #00H INC DPTR MOVX @DPTR, A MOV DPTR, #003CH MOV A, #04H MOVX @DPTR, A MOV DPTR, #0054H MOV A, #00H MOVX @DPTR, A INC DPTR MOV A, #05H MOVX @DPTR, A 你的4096写哪里了?不会是1581的MAXPACKET REGISTER吧?那里只能写 512(对于BULK ENDPOINT而言,这是USB 2.0规定的). 这是DMA 从模式写: MOV DPTR, #0000H MOVX A, @DPTR MOV R2, A MOV DPTR, #0B000H MOV A, #06H MOVX @DPTR, A MOV DPTR, #1000H MOV A, #20H MOVX @DPTR, A MOV A, R2 MOV DPTR, #0000H MOVX @DPTR, A MOV R1, #FILE_SIZE MOV DPTR, #0034H MOV A, @R1 MOVX @DPTR, A INC R1 INC DPTR MOV A, @R1 MOVX @DPTR, A INC DPTR INC R1 MOV A, @R1 MOVX @DPTR, A INC DPTR INC R1 MOV A, @R1 MOVX @DPTR, A MOV R1, #USB_INT_FLAG_BIT INC R1 MOV A, @R1 ANL A, #40H JZ DMA_WRITE MOV A, @R1 ANL A, #0BFH MOV @R1, A MOV DPTR, #0058H MOV A, #04H MOVX @DPTR, A MOV DPTR, #0030H MOV A, #01H MOVX @DPTR, A 前面的是初始化DMA CONTROLER和设备状态.对端点的初始化在设备枚举之前就做了(INDEX,MAXPACKET,SET BUFFER ENABLE...),FILE SIZE 对于你的就是00 00 02 00,我用了4个字节表示. 之后,应用程序在发之前,检测管道是否开,发命令(0471),收到应答后,发数据,USBD自动分包,1581自动应答无空,而你的DMA只管接收. 传输字节数在应用程序中写多大无所谓,大了在USBD中会自动分包,但 在1581寄存器中必须按要求设置. 我的E_MAIL:DIE...,上面的把D盖住了,不是我的错. WINDRV:你太客气了,我也是在摸着走,最多只是比DARYDL前一步,而且 还有很多地方搞不清楚,还需要大家的大力帮助. ACK在设备收到PC传来的数据后返回(正确接收),那么在IN管道和OUT管道返回ACK有什么不同?希望能帮忙解答一下. |
|
|
10楼#
发布于:2004-07-21 13:17
How can you set bulk maxpacket to 4096? In usb 2.0 mode, the bulk packet size should be 512, this is a standard. If
~~~~~~~???有人告诉我可以为65535 不知道是不是真的?you set it to 4096, it will bring a big trouble in the future when your device connects to different brand of usb 2.0 pci card |
|
11楼#
发布于:2004-07-21 13:19
How can you set bulk maxpacket to 4096? In usb 2.0 mode, the bulk packet size should be 512, this is a standard. If
~~~~~~~???有人告诉我可以为65535 不知道是不是真的?我是说创建DS的第五步左右,有一个提示,端点设置,那个地方设置为4096,可以吗? 即驱动里面就自动生成为: 中断out m_Endpoint1OUT.Initialize(m_Lower, 0x1, 64); 中断in m_Endpoint1IN.Initialize(m_Lower, 0x81, 64); bulkout m_Endpoint2OUT.Initialize(m_Lower, 0x2, 4096); bulkin m_Endpoint2IN.Initialize(m_Lower, 0x82, 4096); you set it to 4096, it will bring a big trouble in the future when your device connects to different brand of usb 2.0 pci card |
|
12楼#
发布于:2004-07-21 13:33
metalwing:
能再说一次你的Email全名吗?我有点糊涂了,另外你说的“我在驱动里将后续的6个字节改为8个 字节,将长度定义为4个字节(跟DMA COUNTER REGISTER一样长), ” 这个是在应用程序中厂商请求中还是固件程序中,我的应用程序要进行批量传输之前必须前要厂商请求一次。dResult=pDLG->ISP1581TEST_DEVICE.VendorRequest (SetDmaCom,SetDmaInData); 这两个参数是和固见中对应好了的 static REQUEST SetDmaCom={0x40,0x0c,0,0x0471,0x06};static UCHAR SetDmaInData[6]={0,0,0,64,0,1};然后才进行批量传输: dResult=pDLG->ISP1581TEST_DEVICE.ReadBulkPipes (64,DmaBuffer+64*i,&Trans); ~~~你说的“你在传时向DMA COUNTER REGISTER写了多少”具体就是在这里改变大小吗?我改变了,但是每次还是传输64字节,玉石我把驱动程序中的设置,即刚开始创建ds端点的Max transferPaket改为4096(默认值也是这么多,原来为64),效果没有变化,我快着急死了,半个月了还是这样。另外metalwing,我准备在另开辟帖子给你100分,你的回答对我帮助太大了,请留意我下面的帖子,再次感谢你。 |
|
13楼#
发布于:2004-07-21 14:07
1. MaxPacketSize和MaximumTransferSize是两个不同的概念. MaxPacketSize是在设备传给PC的USB设备描述符里,在USB总线上传输的Endpoint的包的大小.对于USB1.1而言,MaxPacketSize最大是64bytes,对USB 2.0而言,MaxPacketSize是512bytes.这是由USB协议规定的,不能随便更改.
MaximuTransferSize是在驱动程序里设定的,以告诉USB总线驱动程序每次URB请求的最大的数据长度,缺省值是4096bytes.在驱动程序初始化USB设备时,可以指定一个比较大的值,例如256Kbytes.这样一次URB可以读256KBytes, 从而大大减少URB请求次数,提高数据传输速度. MaxPacketSize是在firmware设置的;MaximuTransferSize是在驱动程序里设置的. 2. 在你的firmware里, 应该改成 D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 64 ; // USB 1.1 或D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 512 ; // USB 2.0 驱动程序里改MaximuTransferSize应该是 bulkin m_Endpoint2IN.Initialize(m_Lower, 0x82, 256*1024) 吧 (很久没有用Driver Works了, 你看一下手册吧). 3. IN Endpoint 的ACK回应比较简单: HC (host controller) 先发IN token (token中包含设备ID及Endpoint address), 设备收到后检查数据是否ready,如果没有ready则回应NAK token,如果有数据就发一包数,然后回ACK token. OUT endpoint的ACK回应过程,在USB 1.1和USB 2.0中稍有些不同.先说USB 1.1, HC先发一个OUT token,然后发数据包, 如果设备能收下这包数,则回应ACK,如果设备忙,数据包不能收下,则回NAK.从这里可以看出, 不管设备能不能收数, HC在发OUT token之后总要发一包数,浪费USB 1.1带宽. 因此USB 2.0协议做了改进, HC在发OUT token之前,先发PING token,如果设备没有空,回应NAK,HC不再发OUT token和数据包;如果设备有空,回应ACK,HC发OUT token和数据包,设备收到数后在回应ACK或NAK,确定数据是否真正收到. IN EP和OUT EP的大致流程是这样. 具体一些细节,如数据包有错,超时等问题,要去看书才比较清楚. |
|
14楼#
发布于:2004-07-21 15:07
首先谢谢WINDRV兄的解释,我一直搞不懂设备在OUT管道中发送ACK是
干什么用,OUT管道是PC向设备发送的数据管道,我在这里发送ACK给 谁,听你的意思是说不管IN管道还是OUT管道都是对应PC OUT数据的, 只不过IN是在设备正确收到数据后向PC发出的响应,而OUT则是响应 PC在发送OUT TOKEN前发送的PING TOKEN,那么我如何判断我收没收到 PING TOKEN?PING TOKEN只是在PID里标识了一下,好象到不了固件中去,或是说OUT ACK是由USB 控制芯片自动完成?? DARYDL:我跟你的一样,在发送DMA传输之前,先由应用程序发送一个厂商请求:40 0C 00 00 71 04 08 00(顺序好象有点反,在这里,我把1581规定的6个字节改为8个字节,这是在应用程序里做的,固件要和它对应),后跟8个字节的参数:00 00 00(OFF SET) XX XX XX XX(要传输的长度,即我直接向DMA COUNTER REGISTER 34H~37H写入的数据) XX(方向,因为我没有单独的BULK传输,所以最高位不管,只管最低位),然后,应用程序向设备发送XX XX XX XX个数据.其实,这里是8个还是6个 好象不影响你的问题. static REQUEST SetDmaCom={0x40,0x0c,0,0x0471,0x06}; static UCHAR SetDmaInData[6]={0,0,0,64,0,1}; 在你的SETDMAINDATA[6]={0,0,0,64,0,1}里定义了只传64字节,我不知到在你传输时将那个64改了没改,如果没改,那自然只给你传64字节,另外在你的应用程序中,你能否跟一下看它传了多少,是没给你传, 还是没收到. 你在传输前可以看看1581的34H~37H(DMA COUNTER REGISTER),看它设为多少了.一般来说,你一发送DMA读写命令(置30H为00或01,不管你的DMA控制),1581开始DMA传输,传一次,COUNTER REGISTER里的数减1,直至减到0,DMA停止传输(DREQ无效,如果你不干扰他的话,如设置EOT等等),也就是说,你给DMA COUNTER REGISTER置了多少,他就会传多少(当然要有数据).所以,你的问题可能是: 1.对1581的DMA COUNTER REGISTER置数不对. 2.你的应用程序没有给你传. 我建议你在传之前看一下COUNTER REGISTER是否是你要传的长度,再在中断处理(ISR)里设断点看是否传完了. 另:参考一下WINDRV兄对MaxPacketSize和MaximumTransferSize的解释,不知是否对你有点帮助. 我的邮箱:"DIEUNDERSWORD(死于剑下)@163.COM". |
|
|
15楼#
发布于:2004-07-21 15:22
两位热心的朋友鼎力相助,我要是作不出来就惭愧得跳搂了。很感谢,真的。我把
static UCHAR SetDmaInData[6]={0,0,0,64,0,1}; 的64改了,现在最大只能改为255。但是我现在有信心多了。 “别的还没仔细看,你上面的是1581 VENDOR REQUEST 0471的后续数据吧?你在长度里为什么赋64BYTE?我不知到你的固件如何解析它的, 我是把长度直接写入DMA COUNTER REGISTER,如果你跟我的一样的话,那当然只传64BYTE了。另:我在驱动里将后续的6个字节改为8个 字节,将长度定义为4个字节(跟DMA COUNTER REGISTER一样长), 这样就可以传输更长的数据了。 另:WINDRV兄说的很对,传输速率的快慢跟固件有直接关系,建议你看看你的固件有什么需要改进。 我没QQ。不好意思. 一点愚见,不知对否。” ”把长度直接写入DMA COUNTER REGISTER,“你的长度赋值为多大? 在固件程序中设置的吗? SetDmaCom={0x40,0x0c,0,0x0471,0x06};设置应该不会有错把,我是按照固件程序中的厂商请求,发送这个setuppacket的。 具体的我给你发信了。 真的谢谢二位的热心。 [编辑 - 7/21/04 by metalwing] |
|
16楼#
发布于:2004-07-21 16:56
我把
SetDmaInData改为: static UCHAR SetDmaInData[6]={0,0,0,255,255,1};速度快了很多, 现在我想知道SetDmaInData[6】的指令格式是怎么样的?有高手能告知吗? 再次感谢二位,指出了我的问题。如果需要分尽管告诉我。 |
|
17楼#
发布于:2004-07-21 18:47
给你发了一封信,你可以看看.
|
|
|
18楼#
发布于:2004-07-22 08:37
灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~灌点水,给点分吧~~~~~~~~~~~~~~~~~~~~
|
|
|