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));
}
}
求解决