- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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