<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Kinetis MicrocontrollersのトピックRe: SPI Master - DMA Transfer</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-Master-DMA-Transfer/m-p/478935#M29276</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;HI,&lt;/P&gt;&lt;P&gt;DMA is working, it transfers the bytes as specified.&lt;/P&gt;&lt;P&gt;But only one thing needs your help:&lt;/P&gt;&lt;P&gt;Both DMA TX complete and DMA RX complete interrupts are not called. Here is the setup for the interupts:&lt;/P&gt;&lt;P&gt;1. PE generated code: Interrupt is enabled for both DMA channels (SPI1_TX DMA request, and SPI1 RX DMA&amp;nbsp; request)&lt;/P&gt;&lt;P&gt;2. in DMA controller PE generated code: DMACH2 for RX and DMACH3 for TX : both interrupts are registered:&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA2_DMA18_TransferComplete_ISR.isrData = _int_get_isr_data(LDD_ivIndex_INT_DMA2_DMA18);&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA2_DMA18_TransferComplete_ISR.isrFunction = _int_install_isr(LDD_ivIndex_INT_DMA2_DMA18, DMA1_INT_DMA2_DMA18_TransferComplete_ISR,&amp;nbsp; DevDataPtr);&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Transfer complete interrupt vector(INT_DMA3_DMA19) allocation */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* {MQX RTOS Adapter} Save old and set new interrupt vector (function handler and ISR parameter) */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Note: Exception handler for interrupt is not saved, because it is not modified */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA3_DMA19_TransferComplete_ISR.isrData = _int_get_isr_data(LDD_ivIndex_INT_DMA3_DMA19);&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA3_DMA19_TransferComplete_ISR.isrFunction = _int_install_isr(LDD_ivIndex_INT_DMA3_DMA19, DMA1_INT_DMA3_DMA19_TransferComplete_ISR,&amp;nbsp; DevDataPtr);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;3.&amp;nbsp; DMA Mux has interrupt ISR initialized: (for both DMACH2 and DMACH3)&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* DMAMUX initial settings */&lt;/P&gt;&lt;P&gt;&amp;nbsp; (DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(0x12)), /* DMA multiplexor configuration register initial value 'SPI1_Receive_DMA_Request' */&lt;/P&gt;&lt;P&gt;&amp;nbsp; { /* Events initial setting */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;DMACH2_OnComplete,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* OnComplete callback address */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;DMACH2_OnError&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* OnComplete callback address */&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;4. DMA_CSR_INTMAJOR_MASK are set for both TCD.DMA_TCD_CSR_Reg&lt;/P&gt;&lt;P&gt;5. DMAs are started &lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;DMA_ERQ |= DMA_ERQ_ERQ2_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; // DMA will respond to SPI SPI Rx (RDRF) requests&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;DMA_ERQ |= DMA_ERQ_ERQ3_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; // DMA will respond to SPI SPI tx (TFFF) requests&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI1_MCR &amp;amp;= ~SPI_MCR_HALT_MASK;&lt;/P&gt;&lt;P&gt;6. 5 bytes to TX and to RX:&lt;/P&gt;&lt;P&gt;DMA_TCD2_BITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_BITER_ELINKNO_BITER(5);&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;DMA_TCD2_CITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_TCD2_BITER_ELINKNO;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DMA_TCD3_BITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_BITER_ELINKNO_BITER(5);&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;MA_TCD3_CITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_TCD3_BITER_ELINKNO;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;7. Operation completed (Tx-ed OK and RX-ed OK)&lt;/P&gt;&lt;P&gt;BUT both callback functions are not called&lt;/P&gt;&lt;P&gt;void DMACH3_OnComplete(LDD_TUserData *UserDataPtr) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gdwSpiCmdSent++;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void DMACH2_OnComplete(LDD_TUserData *UserDataPtr) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gdwSpiCmdReceived++;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What is still missing?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David Zhou&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 27 Apr 2016 20:59:06 GMT</pubDate>
    <dc:creator>davidzhou</dc:creator>
    <dc:date>2016-04-27T20:59:06Z</dc:date>
    <item>
      <title>SPI Master - DMA Transfer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-Master-DMA-Transfer/m-p/478934#M29275</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;HI,&lt;/P&gt;&lt;P&gt;I have TWRK60F120MUM tower board. I try to use DMA for SPI master transfer. It doesn't start DMA. Here is code:&lt;/P&gt;&lt;P&gt;LDD_TDeviceData* SM1_Init(LDD_TUserData *UserDataPtr)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; SM1_TDeviceDataPtr DeviceDataPrv; &lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv = (SM1_TDeviceData *)_mem_alloc_system((_mem_size)sizeof(SM1_TDeviceData));&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;UserData = UserDataPtr; /* Store the RTOS device structure */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Interrupt vector(s) allocation */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;TxCommand = 0x80010000U; /* Initialization of current Tx command */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;ErrFlag = 0x00U;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Clear error flags */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Clear the receive counters and pointer */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;InpRecvDataNum = 0x00U; /* Clear the counter of received characters */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;InpDataNumReq = 0x00U; /* Clear the counter of characters to receive by ReceiveBlock() */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;InpDataPtr = NULL;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Clear the buffer pointer for received characters */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Clear the transmit counters and pointer */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;OutSentDataNum = 0x00U; /* Clear the counter of sent characters */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;OutDataNumReq = 0x00U; /* Clear the counter of characters to be send by SendBlock() */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DeviceDataPrv-&amp;gt;OutDataPtr = NULL;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Clear the buffer pointer for data to be transmitted */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* SIM_SCGC6: DSPI1=1 */&lt;/P&gt;&lt;P&gt;&amp;nbsp; SIM_SCGC6 |= SIM_SCGC6_DSPI1_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Interrupt vector(s) priority setting */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* NVICIP27: PRI27=0x80 */&lt;/P&gt;&lt;P&gt;&amp;nbsp; NVICIP27 = NVIC_IP_PRI27(0x80);&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* NVICISER0: SETENA|=0x08000000 */&lt;/P&gt;&lt;P&gt;&amp;nbsp; NVICISER0 |= NVIC_ISER_SETENA(0x08000000);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PINS configuration ...&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* SPI1_MCR: MSTR=0,CONT_SCKE=0,DCONF=0,FRZ=0,MTFE=0,PCSSE=0,ROOE=1,??=0,??=0,PCSIS=1,DOZE=0,MDIS=0,DIS_TXF=0,DIS_RXF=0,CLR_TXF=0,CLR_RXF=0,SMPL_PT=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,HALT=1 */&lt;/P&gt;&lt;P&gt;&amp;nbsp; SPI1_MCR = SPI_MCR_DCONF(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_ROOE_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_PCSIS(0x01) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_SMPL_PT(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_HALT_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Set Configuration register */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* SPI1_MCR: MSTR=1,CONT_SCKE=0,DCONF=0,FRZ=0,MTFE=0,PCSSE=0,ROOE=1,??=0,??=0,PCSIS=1,DOZE=0,MDIS=0,DIS_TXF=1,DIS_RXF=1,CLR_TXF=1,CLR_RXF=1,SMPL_PT=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,HALT=1 */&lt;/P&gt;&lt;P&gt;&amp;nbsp; SPI1_MCR = SPI_MCR_MSTR_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_DCONF(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_ROOE_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_PCSIS(0x01) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //SPI_MCR_DIS_TXF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //SPI_MCR_DIS_RXF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_CLR_TXF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_CLR_RXF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_SMPL_PT(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_HALT_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Set Configuration register */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* SPI1_CTAR0: DBR=1,FMSZ=7,CPOL=0,CPHA=1,LSBFE=0,PCSSCK=3,PASC=3,PDT=3,PBR=3,CSSCK=0,ASC=0,DT=0,BR=1 */&lt;/P&gt;&lt;P&gt;&amp;nbsp; SPI1_CTAR0 = SPI_CTAR_DBR_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_FMSZ(0x07) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_CPHA_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_PCSSCK(0x03) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_PASC(0x03) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_PDT(0x03) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_PBR(0x03) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_CSSCK(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_ASC(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_DT(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_CTAR_BR(0x01);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Set Clock and Transfer Attributes register */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* SPI1_SR: TCF=1,TXRXS=0,??=0,EOQF=1,TFUF=1,??=0,TFFF=1,??=0,??=0,??=0,??=1,??=0,RFOF=1,??=0,RFDF=1,??=0,TXCTR=0,TXNXTPTR=0,RXCTR=0,POPNXTPTR=0 */&lt;/P&gt;&lt;P&gt;&amp;nbsp; SPI1_SR = SPI_SR_TCF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_EOQF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_TFUF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_TFFF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_RFOF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_RFDF_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_TXCTR(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_TXNXTPTR(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_RXCTR(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SR_POPNXTPTR(0x00) |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00200000U;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Clear flags */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* SPI1_RSER: TCF_RE=0,??=0,??=0,EOQF_RE=0,TFUF_RE=0,??=0,TFFF_RE=0,TFFF_DIRS=0,??=0,??=0,??=0,??=0,RFOF_RE=0,??=0,RFDF_RE=1,RFDF_DIRS=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; _int_disable();&lt;/P&gt;&lt;P&gt;&amp;nbsp; SPI1_RSER &amp;amp;= ~SPI_RSER_TFFF_RE_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; SPI1_RSER |= SPI_RSER_TFFF_DIRS_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //Enable receive interrupt`&lt;/P&gt;&lt;P&gt;&amp;nbsp; //SPI1_RSER &amp;amp;= ~SPI_RSER_RFDF_RE_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //SPI1_RSER &amp;amp;= ~SPI_RSER_RFDF_DIRS_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; _int_enable();&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; SM1_SetClockConfiguration(DeviceDataPrv, Cpu_GetClockConfiguration()); /* Set Initial according speed CPU mode */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Registration of the device structure */&lt;/P&gt;&lt;P&gt;&amp;nbsp; PE_LDD_RegisterDeviceStructure(PE_LDD_COMPONENT_SM1_ID,DeviceDataPrv);&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return ((LDD_TDeviceData *)DeviceDataPrv); /* Return pointer to the data data structure */&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;LDD_TDeviceData* DMACH2_Init(LDD_TUserData *UserDataPtr)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;// enable DMA and DMAMUX clock &lt;/P&gt;&lt;P&gt;SIM_SCGC6 |= SIM_SCGC6_DMAMUX0_MASK; &lt;/P&gt;&lt;P&gt;SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;//////////////////////////////////////////&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;ChnInit2 = DMACH2_ChInit;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Initialize local copy of init. structure &lt;/P&gt;&lt;P&gt;// source configuration:&amp;nbsp; Source will need to be updated in write to global buffer&lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_SADDR_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DMA_SADDR_SADDR(UserDataPtr);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //empty needs to be set: needwork&lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_SOFF_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Source address increment: 4 bytes increment needed&lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_SLAST_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Source address reload after major loop finishes: no reload needed&lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_ATTR_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);//SSIZE and DSIZE are 2 SMOD is 0&lt;/P&gt;&lt;P&gt;// destination configuration &lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_DADDR_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint32_t)&amp;amp;(SPI1_PUSHR);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_DOFF_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; &lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_DLASTSGA_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //in Bytes : reload after major loop finishes&lt;/P&gt;&lt;P&gt;//Loop interation numbers &lt;/P&gt;&lt;P&gt;// set CITER and BITER to maximum value &lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_BITER_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DMA_BITER_ELINKNO_BITER (1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Number of DWORDs of Tx Buffer &lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_CITER_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DMA_CITER_ELINKNO_CITER (1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Number of DWORDs of Tx Buffer &lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_NBYTES_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //4 bytes in minor loop &lt;/P&gt;&lt;P&gt;// enable auto close request &lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_CSR_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //disale ELINK&lt;/P&gt;&lt;P&gt;ChnInit2.TCD.DMA_TCD_CSR_Reg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |= DMA_CSR_DREQ_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ChnDevDataPtr = DMA1_InitChannel(DevDataPtr, (DMA1_TChnInit *)(void *)&amp;amp;ChnInit2, UserDataPtr);&lt;/P&gt;&lt;P&gt;return (ChnDevDataPtr);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint8_t Spi1_Trigger(void) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI1_MCR |=&amp;nbsp; SPI_MCR_CLR_RXF_MASK&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear rx FIFO&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_MCR_CLR_TXF_MASK&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear tx FIFO&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_TCD2_BITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_BITER_ELINKNO_BITER(1);&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_TCD2_CITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_TCD2_BITER_ELINKNO;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_ERQ |= DMA_ERQ_ERQ2_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DMA will respond to SPI SPI tx (TFFF) requests&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //SPI1_RSER |= SPI_RSER_RFDF_RE_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //enable the tx fifo fill interrupt for DMA use&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI1_RSER |= SPI_RSER_TFFF_RE_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //enable the tx fifo fill interrupt for DMA use&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI1_MCR &amp;amp;= ~SPI_MCR_HALT_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // halt disable&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ERROR_OK;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Code Sequence:&lt;/P&gt;&lt;P&gt;1. SM1_Init () is called to initalize SPI Master (SPI1)&lt;/P&gt;&lt;P&gt;2. Setup DMA for SPI1 by calling DMACH2_INIT()&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA channel 2 (Static channel )&lt;/P&gt;&lt;P&gt;3. Call Spi1_Trigger() to start transfer.&lt;/P&gt;&lt;P&gt;nothing happens.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can you help me review the code and point out what is missing?&lt;/P&gt;&lt;P&gt;Thank you&lt;/P&gt;&lt;P&gt;David Zhou&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Apr 2016 20:51:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-Master-DMA-Transfer/m-p/478934#M29275</guid>
      <dc:creator>davidzhou</dc:creator>
      <dc:date>2016-04-26T20:51:31Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Master - DMA Transfer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-Master-DMA-Transfer/m-p/478935#M29276</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;HI,&lt;/P&gt;&lt;P&gt;DMA is working, it transfers the bytes as specified.&lt;/P&gt;&lt;P&gt;But only one thing needs your help:&lt;/P&gt;&lt;P&gt;Both DMA TX complete and DMA RX complete interrupts are not called. Here is the setup for the interupts:&lt;/P&gt;&lt;P&gt;1. PE generated code: Interrupt is enabled for both DMA channels (SPI1_TX DMA request, and SPI1 RX DMA&amp;nbsp; request)&lt;/P&gt;&lt;P&gt;2. in DMA controller PE generated code: DMACH2 for RX and DMACH3 for TX : both interrupts are registered:&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA2_DMA18_TransferComplete_ISR.isrData = _int_get_isr_data(LDD_ivIndex_INT_DMA2_DMA18);&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA2_DMA18_TransferComplete_ISR.isrFunction = _int_install_isr(LDD_ivIndex_INT_DMA2_DMA18, DMA1_INT_DMA2_DMA18_TransferComplete_ISR,&amp;nbsp; DevDataPtr);&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Transfer complete interrupt vector(INT_DMA3_DMA19) allocation */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* {MQX RTOS Adapter} Save old and set new interrupt vector (function handler and ISR parameter) */&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Note: Exception handler for interrupt is not saved, because it is not modified */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA3_DMA19_TransferComplete_ISR.isrData = _int_get_isr_data(LDD_ivIndex_INT_DMA3_DMA19);&lt;/P&gt;&lt;P&gt;&amp;nbsp; DevDataPtr-&amp;gt;SavedISRSettings_DMA1_INT_DMA3_DMA19_TransferComplete_ISR.isrFunction = _int_install_isr(LDD_ivIndex_INT_DMA3_DMA19, DMA1_INT_DMA3_DMA19_TransferComplete_ISR,&amp;nbsp; DevDataPtr);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;3.&amp;nbsp; DMA Mux has interrupt ISR initialized: (for both DMACH2 and DMACH3)&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* DMAMUX initial settings */&lt;/P&gt;&lt;P&gt;&amp;nbsp; (DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(0x12)), /* DMA multiplexor configuration register initial value 'SPI1_Receive_DMA_Request' */&lt;/P&gt;&lt;P&gt;&amp;nbsp; { /* Events initial setting */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;DMACH2_OnComplete,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* OnComplete callback address */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;DMACH2_OnError&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* OnComplete callback address */&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;4. DMA_CSR_INTMAJOR_MASK are set for both TCD.DMA_TCD_CSR_Reg&lt;/P&gt;&lt;P&gt;5. DMAs are started &lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;DMA_ERQ |= DMA_ERQ_ERQ2_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; // DMA will respond to SPI SPI Rx (RDRF) requests&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;DMA_ERQ |= DMA_ERQ_ERQ3_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; // DMA will respond to SPI SPI tx (TFFF) requests&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPI1_MCR &amp;amp;= ~SPI_MCR_HALT_MASK;&lt;/P&gt;&lt;P&gt;6. 5 bytes to TX and to RX:&lt;/P&gt;&lt;P&gt;DMA_TCD2_BITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_BITER_ELINKNO_BITER(5);&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;DMA_TCD2_CITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_TCD2_BITER_ELINKNO;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DMA_TCD3_BITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_BITER_ELINKNO_BITER(5);&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;MA_TCD3_CITER_ELINKNO&amp;nbsp;&amp;nbsp; = DMA_TCD3_BITER_ELINKNO;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;7. Operation completed (Tx-ed OK and RX-ed OK)&lt;/P&gt;&lt;P&gt;BUT both callback functions are not called&lt;/P&gt;&lt;P&gt;void DMACH3_OnComplete(LDD_TUserData *UserDataPtr) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gdwSpiCmdSent++;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void DMACH2_OnComplete(LDD_TUserData *UserDataPtr) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gdwSpiCmdReceived++;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What is still missing?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David Zhou&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 27 Apr 2016 20:59:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-Master-DMA-Transfer/m-p/478935#M29276</guid>
      <dc:creator>davidzhou</dc:creator>
      <dc:date>2016-04-27T20:59:06Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Master - DMA Transfer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-Master-DMA-Transfer/m-p/478936#M29277</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This is working now. Please close this tick for me.&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David Zhou&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 29 Apr 2016 19:18:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/SPI-Master-DMA-Transfer/m-p/478936#M29277</guid>
      <dc:creator>davidzhou</dc:creator>
      <dc:date>2016-04-29T19:18:09Z</dc:date>
    </item>
  </channel>
</rss>

