Where this "feature" is described, not in errdata, TRM or datasheet, this looks to be a bug in CPU because functionality is really absurd? Based on TRM text the the DMA requests shall be always generated if the corresponding request bit is set in peripheral side and DMA channel has that request source activated but that looks not to be the case...
DMA is capable of sending only one stream if not toggling the peripheral requests between sending like this
scilinREG->CLEARINT = BIT_n(16U);
scilinREG->SETINT = BIT_n(16U);
and in SPI side
spiREG4->INT0 &= ~BIT_n(16U);
spiREG4->INT0 |= BIT_n(16U);
Of course you can disable the peripheral request in DMA BTC interrupt (if using one) or if not using BTC then clear the request always when starting new HW-trigger to DMA.
If not toggling the requesting peripheral side the DMA PEND register stays 0, DMA HW reqs are in place and also SCI&SPI registers indicates that those are ready to receive data. So by looking the registers the DMA is ready to run and peripheral is ready to receive, only missing thing is the DMA requests :).
So this is ok:
scilinREG->CLEARINT = BIT_n(16U); // could be in BTC ISR
scilinREG->SETINT = BIT_n(16U);
dmaSetChEnable( DMA_CH_SCI_TX, DMA_HW );
And this:
scilinREG->CLEARINT = BIT_n(16U); // could be in BTC ISR
dmaSetChEnable( DMA_CH_SCI_TX, DMA_HW );
scilinREG->SETINT = BIT_n(16U);
But this isn't (basically setting DMA request once active and leave it that way)
dmaSetChEnable( DMA_CH_SCI_TX, DMA_HW );
scilinREG->SETINT = BIT_n(16U);
And this neither
scilinREG->SETINT = BIT_n(16U);
dmaSetChEnable( DMA_CH_SCI_TX, DMA_HW );
In TRM chapter 29.5.2 there is weird sentence.
"Because all data has been transmitted, the interrupt/DMA request should be halted. This can be done by either disabling the transmit interrupt (CLR TX INT) / DMA request (CLR TX DMA bit) or by disabling the transmitter(clear TXENA bit)."
- Is that toggling requirement really hidden into this sentence ("should be halted") (SPI does not have following kind of text at all). With DMA there is no need (or let's say there shouldn't be any need to disable anything) because SCI peripheral can't know (or shouldn't know) when DMA has sent all the data so if DMA is stopped the requests generated by SCI should go to PEND register to wait next DMA start.
TRM chapter 27.7 says
"The SPI generates a request on the TX_DMA_REQ line each time the TX data is copied to the TX shift register either from the TXBUF or from peripheral data bus (when TXBUF is empty).
The first TX_DMA_REQ pulse is generated when either of the following is true:
• DMAREQEN (SPIINT0[16]) is set to 1 while SPIEN (SPIGCR1[24]) is already 1.
• SPIEN (SPIGCR1[24]) is set to 1 while DMAREQEN (SPIINT0[16]) is already 1."
- This says clearly that DMA requests shall be generated if DMAREQEN & SPIEN is kept ON despite of completing one DMA block
This is really simple to reproduce, set DMA to send something for example at 1 sec interval (something which sending takes less than 1 sec :)) and take out clear line just to noticed that DMA sends item only once.