| 我參考 USBD_Mass_Storage_Sram 的 Project 把 HID 的範例修改成 DMA mode 就不會動了. 修改如下
 #if 0 是原先的 HID 使用 FIFO 部份
 #if 1 是參考 MSDC 使用 DMA
 求解啊 ~~~~
 
 int32_t HID_CmdReadPages(CMD_T *pCmd)
 {
 uint32_t u32StartPage;
 uint32_t u32Pages;
 uint32_t len;
 int32_t i;
 
 u32StartPage = pCmd->u32Arg1;
 u32Pages     = pCmd->u32Arg2;
 
 printf("Read command - Start page: %d    Pages Numbers: %d\n", u32StartPage, u32Pages);
 
 if(u32Pages) {
 /* Update data to page buffer to upload */
 /* TODO: We need to update the page data if got a page read command. (0xFF is used in this sample code) */
 for(i=0; i<PAGE_SIZE; i++)
 g_u8PageBuff[i] = 0xFF;
 g_u32BytesInPageBuf = PAGE_SIZE;
 
 /* The signature word is used as page counter */
 pCmd->u32Signature = 1;
 
 /* Trigger HID IN */
 len = Minimum(g_u32EpAMaxPacketSize, g_u32BytesInPageBuf);
 
 #if 0 //FIFO mode
 for (i=0; i<len; i++)
 USBD->EPADAT_BYTE = g_u8PageBuff[i];
 USBD->EPATXCNT = len;
 USBD_ENABLE_EP_INT(EPA, USBD_EPINTEN_INTKIEN_Msk);
 #endif
 
 #if 1 //DMA mode
 printf("DMA Begin\n");
 USBD_SET_DMA_READ(INT_IN_EP_NUM);
 USBD_ENABLE_EP_INT(EPA, USBD_EPINTEN_TXPKIEN_Msk);
 g_usbd_ShortPacket = 0;
 while(1) {
 if (USBD_GET_EP_INT_FLAG(EPA) & USBD_EPINTSTS_BUFEMPTYIF_Msk) {
 MSC_ActiveDMA((uint32_t)g_u8PageBuff, PAGE_SIZE);
 break;
 }
 }
 printf("DMA End\n");
 #endif
 g_u32BytesInPageBuf -= len;
 }
 
 return 0;
 }
 
 |