1 Reply Latest reply on Jan 23, 2018 1:43 AM by hima

    DMA TD chaining

    TelmoBarros

      Hello everyone,

       

      I'm developing a way to transfer data from the psoc to my pc and, so far I've managed to send 2048 16-bits values.

       

      These values are obtained from an ADC that is directly connected to a DMA, so that I can save them in a buffer.

       

      In order to save more values, I've read many entries, and the Application Notes as well, and I know I have to use TD chaining to obtain my desired result.

       

      The thing is I have a small difference in comparison with the other entries. While they tend to have two or more buffers to save the ADC converted values, I only have one buffer (in my case, it is 16384 bytes long).

       

      I tried to program each address for the TD's in the following manner:

      TD[0] - 0...4095      -> destination address :0

      TD[1] - 4096...8191   -> destination address :4096

      TD[2] - 8192...12287  -> destination address :8192

      TD[3] - 12288...16384 -> destination address :12288

       

      My issue was that only the samples sent by the first TD resembled the wave originated from the ADC. Therefore, I'm asking you what could possibly be the mistake I made.

      I'm not sure, but I think it's down to the TD properties, especifically, their destination addresses and some of the requests.

       

      Thanks in advance

       

      p.s my project is attached

        • 1. Re: DMA TD chaining
          hima

          Hello,

           

          1)Is there any reason for enabling the CY_DMA_TD_AUTO_EXEC_NEXT option.

          2)Can you enable TERM out for all TDs and check if the second TD and other TDs are getting executed.

          3)Can you use '&' operator and check if you see any difference in behaviour?

           

              CyDmaTdSetAddress(DMA_TD[0], LO16((uint32)ADC_DEC_SAMP_PTR), LO16((uint32)&samples.u16_buffer[0]));

              CyDmaTdSetAddress(DMA_TD[1], LO16((uint32)ADC_DEC_SAMP_PTR), LO16((uint32)&samples.u16_buffer[4096]));

              CyDmaTdSetAddress(DMA_TD[2], LO16((uint32)ADC_DEC_SAMP_PTR), LO16((uint32)&samples.u16_buffer[8192]));

              CyDmaTdSetAddress(DMA_TD[3], LO16((uint32)ADC_DEC_SAMP_PTR), LO16((uint32)&samples.u16_buffer[12288]));

           

          Thanks,

          Hima

          1 of 1 people found this helpful