Cypress技术论坛
直播中

石正厚

7年用户 1073经验值
私信 关注
[问答]

为什么mux到sar和dma两个阵列中每个数组只写第一个元素?

使用cyc8kit-050,我试图复用两个模拟输入和一个adc_sar有两通道输入样本去单独的阵列。披露:我有一个开放的情况下对这两周,但唯一的反应,我是蹩脚的例子,一个单一的模拟输入引脚发送200样本array1然后200样本array2使用两个TDS。那不是我需要做的。我需要输入一个样本,从样本输入B…重复直到2040样品收集在每个阵列(dma_a [ ] [ ] dma_b 2040年和2040年)。后来我需要时间使样品在FIR滤波器(未显示在这个简化版)。我的问题是,我似乎只写每个数组的第一个元素--最好的。
在TopDebug中,我使用LUT来选择MUX输入。我用定时器产生中断的时候,我们有4080样品。每个EOC倒计时定时器和产生一个新的SoC推迟1.5us通过PWM。我用两个TDS,每个数组一个。
在项目上,dma_done ISR是没有意义的。在另一个版本,我把一个样品使用一个TD单变量,然后用ISR加载到任何dma_a或dma_b。我检查看看我们的样品数为偶数或奇数确定阵列负载这样:
cy_isr_proto(dma_done);cy_isr(dma_done)/ /中断DMA做{如果处理程序(adc_count &;1)/ /看到如果数组偏移是偶数还是奇数dma_b [ adc_count ] = adc_read;/ /很奇怪——负载右声道的其他dma_a [ adc_count ] = adc_read;/它的即使负载左声道adc_count + +;/ / adc_count声明为挥发性dma_done_flag = 1;}
在(永远)环,我打印dma_a 1,2和3元素的值,在LCD上面一行。我打印DMAYB元素1,2,3在SENCOND行。注:为了测试这个你必须保证至少有一个通道的输入连接在cydwr P3 [ 6 ]电位器。请注意,在169170线的虚拟initalizations不通过数据显示在液晶显示屏上覆盖有。
如果这种方法是不可行的,也许有人可以建议一个C++结构,它可以将每个其他元素从一个数组中分离出来,而不使用for循环中的CPU循环。单从阵列会:samplea [ 1 ],sampleb [ 1 ],samplea [ 2 ],sampleb [ 2 ],samplea [ 3 ],sampleb [ 3 ]…
但我的FIR滤波器将看到:samplea [ 1 ],samplea [ 2 ],samplea [ 3 ]…在通道A和SAMPLE B〔1〕中,SAMPPLB〔2〕,SAMPPLB〔3〕…B频道
工作空间捆绑。谢谢您。
MuxySaldDMA.CyWrk.CaseV01.Zip
2兆字节

回帖(2)

姜钰

2019-8-16 07:23:51
只需查看您所发布的代码:对于每个数组,您只写入每一个元素(0, 2, 4为DMAIa,1, 3, 5为DMAYB)。
使用DMA;您需要的是“分散聚集DMA”(并在TRM中以该名称解释)。你所做的是:
为你的DMA创建两个TDS,每个指向相应的数组将它们链接在一个循环中,这样它们就在每个传输计数分别为2040之后被执行,并且设置每个突发的请求被设置为1,所以每次只传输一个字节,也许你想要设置“保存TDS”,所以DMA可以在填充缓冲器之后启动,在两个TDS上都需要设置“增量目的地地址”。有一个例子做了几乎你需要的,但是没有内存(它只是把数据从三个通道发送到三个DAC):HTTP://wwwyCypCy.COM/?ID=4和;RID=60629
举报

石正厚

2019-8-16 07:37:51
附加信息:虽然这并不能解决我的问题,但我注意到我的前一篇文章中的代码中有一个错误源。而不是说:如果(ADCQUITY和AMP;1)…我应该说:如果(1 & & AdcCl计数)…前者做一个赋值,后者做比较,并捕捉这样一个可能的错误。尽管如此,仍在研究这个问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分