官方是否由 DMA的示例程序, usb或者 uart的可以
官方EVT中USB例程里使用了DMA,可供參考。
/*******************************************************************************
* Function Name? : DevEP2_IN_Deal
* Description? ? : 端點(diǎn)2數(shù)據(jù)上傳
* Input? ? ? ? ? : l: 上傳數(shù)據(jù)長度(<64B)? ?
* Return? ? ? ? ?: None
*******************************************************************************/
void DevEP2_IN_Deal( UINT8 l )
{
? ? R8_UEP2_T_LEN = l;
? ? R8_UEP2_CTRL = (R8_UEP2_CTRL & ~MASK_UEP_T_RES)| UEP_T_RES_ACK;
}
這個(gè)函數(shù)用的就是dma發(fā)送對嗎?
請問一下 有沒有串口的dma示例?
573串口沒有硬件DMA,只有硬件FIFO緩存。
調(diào)用DevEP2_IN_Deal這個(gè)函數(shù)前,如果端點(diǎn)2IN方向DMA對應(yīng)的RAM地址中存放有待上傳的數(shù)據(jù),會(huì)在主機(jī)下發(fā)IN令牌時(shí)自動(dòng)向主機(jī)上傳IN事務(wù)的數(shù)據(jù)包。
從機(jī)向主機(jī)上傳數(shù)據(jù)主要是如下步驟:①向DMA相應(yīng)的RAM中存放數(shù)據(jù)(可以用memcpy,也可以寫個(gè)循環(huán)),②調(diào)用DevEPn_IN_Deal函數(shù)。參考鍵盤上傳的函數(shù)如下。
1、usb除了 DMA的發(fā)送方式,還有沒有其他發(fā)送方式 比如 類似串口一樣 直接寫usb數(shù)據(jù)寄存器方式,
2、我現(xiàn)在遇到一個(gè)問題就是usb DMA設(shè)置好數(shù)據(jù)后 快速循環(huán)發(fā)送 比如這樣子
while (uart0_buffer_count = app_drv_fifo_length(&uart0_rx_fifo)) {
if (uart0_buffer_count > 64) uart0_buffer_count = 64;
app_drv_fifo_read(&uart0_rx_fifo, send_buffer, &uart0_buffer_count);
memcpy(pEP2_IN_DataBuf, send_buffer, uart0_buffer_count);
DevEP2_IN_Deal(uart0_buffer_count);
DelayMs(10); //需要加延時(shí),否則有概率 接收會(huì)丟包(某些win7)
}
是否有api可以判斷狀態(tài) DMA的數(shù)據(jù)已經(jīng)上報(bào) 完成
您好,只有DMA方式。每個(gè)端點(diǎn)都需要64個(gè)8位寄存器緩存數(shù)據(jù)的話,沒有這么多資源。
若想穩(wěn)定運(yùn)行IN上傳,可以引入一個(gè)全局變量,在調(diào)用DevEPn_IN_Deal前將其置位表示暫未上傳成功,在USB_DevTransProcess()中的?case UIS_TOKEN_IN | 端點(diǎn)號(hào)n: 下清零表示上傳完成。