阅读:1168回复:4
一个迷惑的问题――望指教!!!
在看ZBoard的固件程序的时候,有点迷惑了!那里面的
void USBVendorRequest_ReadCode(void) { unsigned char nLen; // bZBoardFlags.bits.bRead = TRUE; CodeData.wCodeAddress = ControlData.DeviceRequest.wIndex; CodeData.wCodeLength = ControlData.DeviceRequest.wValue; CodeData.wCodeCount = 0; CodeData.pCodeData = GenBuf; nLen = CodeData.wCodeLength; if(nLen > EP2_TX_FIFO_SIZE) nLen = EP2_TX_FIFO_SIZE; // Read data from flash FlashRead(CodeData.wCodeAddress, CodeData.pCodeData, nLen); nLen = USBD12_WriteEndpoint(5, CodeData.pCodeData, nLen); CodeData.wCodeCount += nLen; CodeData.wCodeAddress += nLen; // Send a zero packet to finish this control transfer USB_Single_Transmit(0, 0); } void ISRx_Main_TxDone(void) { unsigned short nLen; USBD12_ReadLastTransactionStatus(5); /* Clear interrupt flag */ nLen = CodeData.wCodeLength - CodeData.wCodeCount; if(nLen != 0) { if(nLen > EP2_TX_FIFO_SIZE) nLen = EP2_TX_FIFO_SIZE; FlashRead(CodeData.wCodeAddress, CodeData.pCodeData, nLen); nLen = USBD12_WriteEndpoint(5, CodeData.pCodeData, nLen); CodeData.pCodeData += nLen; if(CodeData.pCodeData > (GenBuf + sizeof(GenBuf) / 2)) CodeData.pCodeData = GenBuf; CodeData.wCodeCount += nLen; CodeData.wCodeAddress += nLen; } } 这两个函数分别在ZBoard的ISR.C和VDOR.C中定义的,好象都能实现数据从endpoin2进行IN呀!是不是定义重复了!!!我的理解对吗? 还有一个问题就是这种VendorRequest的传输方式是控制传输还是Bulk传输啊? |
|
沙发#
发布于:2002-06-08 17:23
首先这两个函数有不同的用途,USBVendorRequest_ReadCode()是
根据厂商自定义请求从FLASH中读取一段数据写到端点5中去,然后上位机用READFILE()读取数据时,取走在USBVendorRequest_ReadCode()函数中写到端点5的数据,并产生中断,这个中断就会调用ISRx_Main_TxDone(void)继续送数据到端点5。以后同里。必须先往端点5中送了一次数据后,上位机用READFILE()时才会产生中断。 这种VendorRequest的传输方式是控制传输还是Bulk传输啊? 看你的数据和VendorRequest是通过什么端点进行传输,端点是指定用什么传输方式,那么就是什么传输了,例如端点5用BULK,那就是BULK。 |
|
地板#
发布于:2002-06-08 18:51
只是自己开发USB的一点体会,以后有空多交流。shenjinhua@xty.com.cn
|
|
地下室#
发布于:2002-06-09 14:27
请问那么什么时候调用USBVendorRequest_ReadCode()函数呢?起码ISRx_Main_TxDone(void)函数是产生硬件中断时被调用的。
|
|