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.

DMA USE THE PING-PONG

Other Parts Discussed in Thread: EK-TM4C123GXL

Hello:

I can go to the ISR fuction,my code is

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);
	uDMAChannelAssign(UDMA_CH17_ADC0_3);
	//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);
}

i need to change ping to pong in the ISR function

  • Hello Zengfu,

    In the Ping Pong Mechanism of the uDMA, when the Ping Buffer is over, the uDMA automatically switches to the Pong Buffer and vice-versa.

    What you need to do in the ISR is to reinit the buffer which has completed.

    Please see the example

    C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\ek-tm4c123gxl\udma_demo

    where the ISR is used to detect which buffer has completed and then re-initialized.

    Regards

    Amit