Part Number: RM48L952
Hi TI
I have looked at several examples for the Hercules DMA SPI transfer, but there is a missing link.
First of all, I'm not sure that SPI2 & SPI4 supports DMA transfer, because some of the examples uses some resisters only existing for the mibSPI1&3&5.
But looking in the reference manual DMA Request Sources are defined for SPI2 and SPI4.
The example from here, seems to miss the start trigger for the transfer.
The turturial from here uses some features only available for the mibSPI's.
https://training.ti.com/jp/hercules-tutorial-mibspi-and-dma-overview
In my working example (wich is for SPI3, but I need it to work on SPI2 as well) I have reached following, but the code is not compleate, the trivialities regarding the data is omitted:
void N2HET2_1_IRQHandler ( void ) /* Turn on */
{
dmaConfigCtrlPacketUpdate(&g_dmaCTRLPKT_TX, tx_buffer, &spiREG3->DAT1, spi_words);
dmaConfigCtrlPacketUpdate(&g_dmaCTRLPKT_RX, &spiREG3->BUF, rx_buffer, spi_words);
dma_start_transfer(); /* FIXME Not defined yet */
idle_led_off (); /* Switch 'Idle' LED off TODO */
}
void dmaConfigCtrlPacket(g_dmaCTRL *g_dmaCTRLPKT, uint32 sadd,uint32 dadd,uint32 dsize)
{
g_dmaCTRLPKT->SADD = sadd; /* source address */
g_dmaCTRLPKT->DADD = dadd; /* destination address */
g_dmaCTRLPKT->CHCTRL = 0; /* channel control */
g_dmaCTRLPKT->FRCNT = 1; /* frame count */
g_dmaCTRLPKT->ELCNT = dsize; /* element count */
g_dmaCTRLPKT->ELDOFFSET = 4; /* element destination offset */
g_dmaCTRLPKT->ELSOFFSET = 0; /* element destination offset */
g_dmaCTRLPKT->FRDOFFSET = 0; /* frame destination offset */
g_dmaCTRLPKT->FRSOFFSET = 0; /* frame destination offset */
g_dmaCTRLPKT->PORTASGN = 4; /* port b */
g_dmaCTRLPKT->RDSIZE = ACCESS_16_BIT; /* read size */
g_dmaCTRLPKT->WRSIZE = ACCESS_16_BIT; /* write size */
g_dmaCTRLPKT->TTYPE = FRAME_TRANSFER ; /* transfer type */
g_dmaCTRLPKT->ADDMODERD = ADDR_INC1; /* address mode read */
g_dmaCTRLPKT->ADDMODEWR = ADDR_OFFSET; /* address mode write */
g_dmaCTRLPKT->AUTOINIT = AUTOINIT_ON; /* autoinit */
}
void dmaConfigCtrlPacketUpdate(g_dmaCTRL *g_dmaCTRLPKT, volatile void *sadd, volatile void *dadd, uint32 dsize)
{
g_dmaCTRLPKT->SADD = (uint32_t)sadd; /* source address */
g_dmaCTRLPKT->DADD = (uint32_t)dadd; /* destination address */
g_dmaCTRLPKT->ELCNT = dsize; /* element count */
}
void init_spi_dma(void)
{
/* - assigning dma request: channel-0 with request line - 1 */
dmaReqAssign(0, DMA_REQ_LINE_SPI3_TX );
dmaReqAssign(1, DMA_REQ_LINE_SPI3_RX );
/* - configuring dma control packets */
dmaConfigCtrlPacket(&g_dmaCTRLPKT_TX, 0,0,0);
dmaConfigCtrlPacket(&g_dmaCTRLPKT_RX, 0,0,0);
/* - setting dma control packets */
dmaSetCtrlPacket(DMA_CH0,g_dmaCTRLPKT_TX);
dmaSetCtrlPacket(DMA_CH1,g_dmaCTRLPKT_RX);
/* - setting the dma channel to trigger on h/w request */
dmaSetChEnable(DMA_CH0, DMA_HW);
dmaSetChEnable(DMA_CH1, DMA_HW);
/* - enabling dma module */
dmaEnable();
}
Am I close? Is it possible?