This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
adc利用DMA的pingpong模式,但是一直进不了adc的中断来进行ping-pong转换
void pp_init() //adc and ssi { SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); //dma,adc,ssi(dac) // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); GPIOPinTypeADC(GPIO_PORTE_BASE,GPIO_PIN_3); //pe.3 anolog input // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PA3_SSI0FSS); GPIOPinConfigure(GPIO_PA4_SSI0RX); GPIOPinConfigure(GPIO_PA5_SSI0TX); // PA5 - SSI0Tx // PA4 - SSI0Rx // PA3 - SSI0Fss // PA2 - SSI0CL //adc comfig ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_ALWAYS, 0); ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH0|ADC_CTL_END);//dma //ADCIntEnable(ADC0_BASE,3); ADCIntEnableEx(ADC0_BASE,ADC_INT_DMA_SS3); ADCSequenceDMAEnable(ADC0_BASE,3); ADCSequenceEnable(ADC0_BASE,3); IntEnable(INT_ADC0SS3); //ssi config SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, 10000000, 16); // PO=1,PO=0 SSIDMAEnable(SSI0_BASE,SSI_DMA_TX); SSIEnable(SSI0_BASE); //udma config IntEnable(INT_UDMA); IntEnable(INT_UDMAERR); uDMAEnable(); uDMAControlBaseSet(pui8DMAControlTable); //adc dma uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC0, UDMA_ATTR_USEBURST|UDMA_ATTR_ALTSELECT|UDMA_ATTR_REQMASK|UDMA_ATTR_HIGH_PRIORITY); //uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC0,UDMA_ATTR_ALTSELECT); //ping pong uDMAChannelControlSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); uDMAChannelControlSet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG, adc_address, ping_in,sizeof(ping_in)); uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, adc_address, pong_in,sizeof(pong_in)); //ssi dma uDMAChannelAttributeDisable(UDMA_CHANNEL_SSI0TX, UDMA_ATTR_USEBURST|UDMA_ATTR_ALTSELECT|UDMA_ATTR_REQMASK|UDMA_ATTR_HIGH_PRIORITY); //uDMAChannelAttributeEnable(UDMA_CHANNEL_SSI0TX,UDMA_ATTR_ALTSELECT); //ping pong uDMAChannelControlSet(UDMA_CHANNEL_SSI0TX | UDMA_PRI_SELECT, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); uDMAChannelControlSet(UDMA_CHANNEL_SSI0TX | UDMA_ALT_SELECT, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); uDMAChannelTransferSet(UDMA_CHANNEL_SSI0TX | UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, adc_address, pong_out,sizeof(pong_out)); uDMAChannelTransferSet(UDMA_CHANNEL_SSI0TX | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG, adc_address, ping_out,sizeof(ping_out)); IntMasterEnable(); uDMAChannelEnable(UDMA_CHANNEL_SSI0TX); uDMAChannelEnable(UDMA_CHANNEL_ADC0); }
中断服务函数
void ADC_3_Handler() { uint32_t status; uint32_t mode; status=ADCIntStatusEx(ADC0_BASE,flase); ADCIntClearEx(ADC0_BASE,status); ADCIntClear(ADC0_BASE,3); mode = uDMAChannelModeGet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT); if(mode == UDMA_MODE_STOP) { //g_ui32RxPingCount++; uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG, adc_address, ping_in,sizeof(ping_in)); } mode = uDMAChannelModeGet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT); if(mode == UDMA_MODE_STOP) { //g_ui32RxPingCount++; uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG, adc_address, pong_in,sizeof(pong_in)); } }
求解决