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利用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));
	}
}

求解决