Hi,
I'm using uVision 4 with the MCB2300 development board. I'm developing a software that periodically transmits data (status information) from the device to the host (as first step, the data are sent without being explicitly requested by the host as soon as a connection has been established). Thereto I've modified the USBCDC example included with uVision. The software transmits 20 bytes periodically, using USB_WriteEP (in usbhw.c, which uses the register interface). This works fine so far. Now I would like to use the DMA engine to avoid copying the bytes word by word into the register. I've enabled DMA in the USB configuration for logical IN endpoint 2 (physical endpoint 5 which is called CDC_DEP_IN in the example), and I have managed to set up DMA descriptors. But how do I trigger a DMA transfer? I've tried several combinations of USB_DMA_Setup and USB_DMA_Enable. Manually setting the appropriate bit in DMA_REQ_SET to trigger the interrupt results in an error state. What am I doing wrong? Could anyone please give me some hints concerning USB DMA? Thanks a lot. I'll be back in January, after my Christmas vacation. I wish everybody a merry Christmas and a happy new year!
CC
is it possible to get the number of bytes which were received by the last packet to determine if the packet was a normal data packet or a command packet? Is it also possible to use USB_ReadEP() because I will also use DMA for the BULK out endpoints?
void EndpointISR() { /* use of dma */ if(event & USB_EVT_OUT_DMA_EOT) { /* End of Transfer */ if (USB_DMA_BufAdr(CDC_DEP_OUT) != ((unsigned int)DataBuf0 + DataIn0)) { /* Data Available */ /* determine if the rxd data is a cmd or a dmx data pkt */ /* is it possible to get the size of the rxd packet to determine if the packet is a data packet or a command packet? */ if(command_pkt) { USB_ReadEP(CDC_DEP_OUT, &CommandReq[0]); SetupCommand(&CommandReq[0]); return; } } } if (event & (USB_EVT_OUT_DMA_EOT) | (USB_EVT_OUT_DMA_NDR)) { /* End of Transfer or New Descriptor Request */ DD.BufAdr = (unsigned int)DataBuf0 + DataIn0; DD.BufLen = DATA_TX_PKT_LEN; DD.MaxSize = 64; /* 64Byte for bulk-transfer */ DD.Cfg.Val = 0; /* Initial DMA Configuration */ USB_DMA_Setup (CDC_DEP_OUT, &DD); /* Setup DMA */ USB_DMA_Enable(CDC_DEP_OUT); } /* 2) */ if(event & USB_EVT_IN_DMA_NDR) dmaInProgress &= ~(1 << EPAdr(CDC_DEP_IN)); }
> is it possible to get the number of bytes which were received by the last packet to determine if the packet was a normal data packet or a command packet?
The byte size of received transfer is written-back to the DD for OUT EP.
> Is it also possible to use USB_ReadEP() because I will also use DMA for the BULK out endpoints?
No. USB_ReadEP() is not available for the OUT EP, while DMA is enabled on the EP.
Tsuneo