I saw the thread on the FFT accelerator and the 2048 point example but am still confused.

I am doing a 256 point FFT which should be the simple case. I have it working, I just don't really understand it.

Like the person in the other thread, I also can't seem to do a second FFT without either resetting the FFT or explicitly moving it to idle. My code is below:

#define FFT_N 256

#define FFT_LOG_N 8

// select fft accel

*pPMCTL1 = (*pPMCTL1 & ~(BIT_17 | BIT_18)) | FFTACCSEL;

asm("nop;");

asm("nop;");

//asm("nop;");

// doing nothing doesn't work

//*pFFTCTL1 = FFT_RST; // works but needs 3 nop's

*pFFTCTL1 = FFT_EN | FFT_DMAEN; // works with 2 nop's

//*pFFTCTL1 = FFT_START; // doesn't work

//*pFFTCTL1 = 0xE; // doesn't work (recommendation from FFT accel thread)

*pFFTCTL2 = FFT_CPACKIN | FFT_CPACKOUT | (FFT_LOG_N << 3) | ((FFT_N/16) << 7);

*pFFTCTL1 = FFT_EN | FFT_START | FFT_DMAEN;

*pCPIFFT = (int)&TCB_FFT_w.IIFFTx - OFFSET | BIT_20;

*pCPOFFT = (int)&TCB_FFT_y.OIFFTx - OFFSET;

// wait for fft to complete

while(!(*pFFTDMASTAT & ODMACHIRPT))

{

asm("nop;");

}

It hangs in the spin loop if I don't reset or move the FFT accel explicitly through idle after the first time (first time out or chip reset is okay). Somewhere I got the impression that two instruction cycles are needed after selecting the accelerator, maybe from and FIR discussion or example, but for some reason if I reset the FFT I need three cycles instead of two, if I explicitly put in idle I can use two nop's. If I use less than two I get stuck in my spin loop.

Okay, so instead I decided to just leave the FFT disabled so it is ready to go for next time by writing 0 to FFTCTL1 after my spin loop and that didn't work. It seems like I have to first move it to idle then disable. Or resetting the FFT seems to work.

// wait for fft to complete

while(!(*pFFTDMASTAT & ODMACHIRPT))

{

asm("nop;");

}

// leave fft accel ready for next time

//*pFFTCTL1 = 0; // doesn't work

*pFFTCTL1 = FFT_EN; *pFFTCTL1 = 0; // combination works

//*pFFTCTL1 = FFT_RST; // works

So I guess my question is, what is the right way to do this?

Matt

Hi,

>>Do I also need 4 nop's after selecting the FIR accelerator before writing any of the FIR registers? I'm not sure where I came up with two. I looked at an >>ADI example and it didn't have any. So is it 4 when selecting any of the accelerators?

Yes you need 4 nop's due to the effect latency of PMCTL1 register. Following is from page 6-53 of the manual

"Writes to the PMCTL1 register have an effect latency of two PCLK cycles. Wait for for at least two PCLK (or four CCLK) cycles after selecting an accelerator

before accessing any of its registers"

Hope this clarifies.

Thanks,

Divya