DMA setup:
#define S1_BUF_SIZE 256
// --- Enable Analog in clocking ---
SIM->SCGC6 |= SIM_SCGC6_ADC0_MASK; // Enable ADC0 gate clock moved to system_MK60F12.c
SIM->SCGC3 |= SIM_SCGC3_ADC1_MASK; // Enable ADC1 gate clock
SIM->SCGC6 |= SIM_SCGC6_ADC2_MASK; // Enable ADC2 gate clock
SIM->SCGC3 |= SIM_SCGC3_ADC3_MASK; // Enable ADC3 gate clock
SIM->SOPT7 = SIM_SOPT7_ADC0TRGSEL(0) | // 0 = external trigger
//SIM_SOPT7_ADC0PRETRGSEL_MASK | // 0 = pre-trigger A selected for ADC0; 1 = Pre-trigger B selected for ADC0
//SIM_SOPT7_ADC0ALTTRGEN_MASK | // 0 = PDB trigger selected for ADC0; 1 = Alternate trigger selected for ADC0
SIM_SOPT7_ADC1TRGSEL(0) | //
//SIM_SOPT7_ADC1PRETRGSEL_MASK | //
//SIM_SOPT7_ADC1ALTTRGEN_MASK | //
SIM_SOPT7_ADC2TRGSEL(0) | //
//SIM_SOPT7_ADC2PRETRGSEL_MASK | //
//SIM_SOPT7_ADC2ALTTRGEN_MASK | //
SIM_SOPT7_ADC3TRGSEL(0) ; //
//SIM_SOPT7_ADC3PRETRGSEL_MASK | //
//SIM_SOPT7_ADC3ALTTRGEN_MASK ; //
ADC_Calib();
// channel 6 descriptor
DMA0->TCD[6].SADDR = (uint32_t)&SPI1->POPR;
DMA0->TCD[6].SOFF = (uint16_t)0;
DMA0->TCD[6].DADDR = (uint32_t)&S1_rxbuf;
DMA0->TCD[6].DOFF = (uint16_t)4;
DMA0->TCD[6].ATTR = 0;
DMA0->TCD[6].ATTR |= DMA_ATTR_SSIZE(2) |
DMA_ATTR_DSIZE(2) |
DMA_ATTR_SMOD(0) |
DMA_ATTR_DMOD(0);
DMA0->TCD[6].NBYTES_MLNO = 4;
DMA0->TCD[6].SLAST = 0x00;
DMA0->TCD[6].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(S1_BUF_SIZE >> 0);
DMA0->TCD[6].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(S1_BUF_SIZE >> 0);
DMA0->TCD[6].DLAST_SGA = DMA_DLAST_SGA_DLASTSGA(0); // scatter/gather wordt niet gebruikt
DMA0->TCD[6].CSR = 0; // diable ELINK, disable scatter/gather,
DMA0->TCD[6].CSR |= DMA_CSR_DREQ_MASK | // One transfer only.
//DMA_CSR_INTMAJOR_MASK | // enable interrupts
DMA_CSR_BWC(0x0); // Bandwith max
// channel 7 descriptor
//DMA0->TCD[7].SADDR = (uint32_t)&S1_txbuf;
DMA0->TCD[7].SOFF = (uint16_t)4;
DMA0->TCD[7].DADDR = (uint32_t)&SPI1->PUSHR_SLAVE;
//DMA0->TCD[7].DADDR = (uint32_t)&SPI2->PUSHR;
DMA0->TCD[7].DOFF = (uint16_t)0;
DMA0->TCD[7].ATTR = (uint16_t)0;
DMA0->TCD[7].ATTR |= DMA_ATTR_SSIZE(2) |
DMA_ATTR_DSIZE(2) |
DMA_ATTR_SMOD(0) |
DMA_ATTR_DMOD(0);
DMA0->TCD[7].NBYTES_MLNO = 4;
DMA0->TCD[7].SLAST = 0x00;
DMA0->TCD[7].DLAST_SGA = DMA_DLAST_SGA_DLASTSGA(0); // scatter/gather wordt niet gebruikt
DMA0->TCD[7].CSR = 0; // diable ELINK, disable scatter/gather,
DMA0->TCD[7].CSR |= DMA_CSR_DREQ_MASK | // One transfer only.
DMA_CSR_INTMAJOR_MASK | // enable interrupts
DMA_CSR_BWC(0x0); // Bandwith max
DMA trigger:
SPI1->MCR |= SPI_MCR_CLR_RXF_MASK | // clear rx FIFO
SPI_MCR_CLR_TXF_MASK ; // clear tx FIFO
DMA0->TCD[6].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(S1_BUF_SIZE); // DMA's in sync.
DMA0->TCD[6].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(S1_BUF_SIZE);
DMA0->TCD[7].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(S1_BUF_SIZE);
DMA0->TCD[7].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(S1_BUF_SIZE);
SPI1->MCR &= ~SPI_MCR_HALT_MASK ; // halt disable
DMA0->ERQ |= DMA_ERQ_ERQ6_MASK; // DMA will respond to SPI rx (RDRF) requests
DMA0->ERQ |= DMA_ERQ_ERQ7_MASK; // DMA will respond to SPI tx (TFFF) requests
SUMMARY:
DMA_ATTR_SSIZE = 4 bytes
MLNO = 4
CITER = 256
With this setup we expect to send (datasheet): 4 * 4 * 256 = 4096 bytes
But in the test it actually does send 1024 bytes.
Any setting of MLNO other than 4 does not work.
Can you confirm this?