你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407外接24位ADC, 如何实现用ADC的DATAREADY信号触发SPI通讯接收数据?

[复制链接]
jim_weisd 提问时间:2022-10-14 18:52 / 未解决
STM32F407外接24位ADC, 用ADC的DATAREADY信号触发SPI通讯接收数据,且希望启动DMA存储一组ADC数据,这个应用怎么实现?查了网上帖子建议用timer事件捕捉响应DATAREADY信号启动SPI的DMA通讯,SPI是8位或16位的数据传输,而ADC的数据是24位或32位的,所以可以用SPI的DMA接收3个Byte或4个Byte,完成一个数据的接收,但是问题在于,下一次DATAREADY信号来了以后,如何不要CPU的干预把DMA的接收地址自动增加到下一个数据地址?
收藏 评论18 发布时间:2022-10-14 18:52

举报

18个回答
yr 回答时间:2022-10-15 15:58:33
jim_weisd 发表于 2022-10-15 14:36
硬件连接和配置就是根据第一条建议进行的。如果根据第二条建议,每次DATAREADY信号来了以后,CPU要做中断 ...

这个问题的关键点是adc转换须用spi把数据传出,而一次启动spi的传输又难以分割成若干次传输,且不想mcu干涉每个点的获取,也就是在采集1024个数据结束前要求mcu不介入,因此,解决的方法就变成每一次adc的dataready信号纯硬件触发spi传输。这里提供一个思路,具体实现要参照手册,看f407是否满足,我知道g4是可以这样做的。
(1)mcu的spi和adc的spi都配置成从模式,它的clk信号来自高级计时器(比如tim1)的输出。
(2)dataready接入tim1的输入,tim1配成slave trigger模式,同时tim1的rcr counter设成24,目的是每个dataready信号沿让tim1产生固定个数24个时钟,这个时钟作为spi的时钟,这样,意味着,每次dataready就会触发adc传3个字节到mcu的spi
(3)申请1024*3=3072个字节的数组,配置spi rx dma normal 3072个数据
(4)在进入dma的tc中断后,表示1024个数据已经被采到,在adc的采集过程中,mcu不干预


jim_weisd 回答时间:2022-10-18 08:45:54
yr 发表于 2022-10-17 20:15
坦率地说,挺怀疑作者的说法。从逻辑上讲,spi的dma搬运应该发生在spi的dr寄存器或者fifo有收到数据后才 ...

timer捕捉到DATAREADY下降沿产生一个DMA request,这个DMA的数据源地址是SPI的数据寄存器,且MCU的SPI是主,目的地址是数组的首地址。当DMA request发起后,SPI开始发送数据,重复发送3个Byte(当接收24位ADC数据),或4个Byte(当接收32位ADC数据),同时会接收到相应长度的ADC数据。每次DATAREADY信号被ADC芯片拉低就会发起一个SPI DMA传输,接收当前ADC转换的数据,这个过程我没疑问,我担心的是,每次数据都会被搬到数组的首地址,而不是递增的地址,因为地址的递增实际上是每次传输3个Byte或4个Byte时的地址递增,而不是数组元素的地址递增。结果就是传输结束以后,数组里只有第一个元素有数据,也就是最后一次DMA传输得到的数据。不知道我这个担心是否正确,最后还得写代码验证。
yr 回答时间:2022-10-17 20:15:23
butterflyspring 发表于 2022-10-17 17:38
DMA开始搬运需要reuqest 信号,用那个事件产生request 信号呢?

坦率地说,挺怀疑作者的说法。从逻辑上讲,spi的dma搬运应该发生在spi的dr寄存器或者fifo有收到数据后才触发,这是连续的两个动作。对作者上述说法的理解是,dataready之后,必须有发生spi传输(不知怎么让spi传输,作者要求mcu不能干预,仅仅依靠硬件触发,尚不知怎么不用mcu干预而用信号链让spi传输),当且仅当一个字节或者半字传输好之后,timer能捕捉到这个事件,暂时不知哪个信号或者信息能满足这个要求,倘若仅凭timer的定时溢出判断,个人认为是有风险,需保证adc的时钟和mcu的时钟要一致,否则无法确保先后的时序。
yr 回答时间:2022-10-15 11:29:12
根据问题描述,从以下几个方面提供一些参考。
1. 硬件连接和配置。adc的dataready连接mcu的某个io,充当外部触发;mcu的spi外设连接adc的spi专用管脚,mcu的spi配置成master,8bit接收,配置spi rx dma,dma circular模式,每次接收3个字节。
2. 控制流程。adc转换成功,dataready外部触发mcu,在外部触发中断callback里,启动spi dma接收3个字节,这样3个字节自动被搬运到变量里,在dma的tc中断里,可以处理接收到的数据
jim_weisd 回答时间:2022-10-15 14:36:15
yr 发表于 2022-10-15 11:29
根据问题描述,从以下几个方面提供一些参考。
1. 硬件连接和配置。adc的dataready连接mcu的某个io,充当外 ...

硬件连接和配置就是根据第一条建议进行的。如果根据第二条建议,每次DATAREADY信号来了以后,CPU要做中断处理,就没有达到不需要CPU干预采多个数据点的目的。现在想实现的是用DMA功能采集1024个数据点,然后给一个信号给CPU,CPU对这1024点做FFT。
废鱼 回答时间:2022-10-15 15:23:38
楼主最好说一下用的那个ADC芯片。先看手册,ready信号是产生读取数据的来源,对于ADC数据是如何存放的,需要按照手册说明进行读取。比如SPI读取寄存器08地址,09地址,0a地址的数据后,重新排列为24位ADC数据。
jim_weisd 回答时间:2022-10-15 17:31:42
废鱼 发表于 2022-10-15 15:23
楼主最好说一下用的那个ADC芯片。先看手册,ready信号是产生读取数据的来源,对于ADC数据是如何存放的,需 ...

ADC芯片是MCP3564, 数据手册下载链接:https://ww1.microchip.com/downloads/aemDocuments/documents/APID/ProductDocuments/DataSheets/MCP3561_2_4R-Data-Sheet-DS200006391C.pdf
jim_weisd 回答时间:2022-10-15 17:55:32
yr 发表于 2022-10-15 15:58
这个问题的关键点是adc转换须用spi把数据传出,而一次启动spi的传输又难以分割成若干次传输,且不想mcu干 ...

不知道这样操作是否可行:
1)DATAREADY连到Timer输入捕捉,DATAREADY高到低触发SPI DMA,MCU为主,数据宽度为8bit,用FIFO模式,4个Byte后一次性传输4个Byte到内存。
2)DMA传输模式设为重复传输,源地址不递增,目的地地址递增。重复次数为1024。
第一点应该没问题,第二点是否可行不清楚,请高手指点。
yr 回答时间:2022-10-15 20:40:03
jim_weisd 发表于 2022-10-15 17:55
不知道这样操作是否可行:
1)DATAREADY连到Timer输入捕捉,DATAREADY高到低触发SPI DMA,MCU为主,数据 ...

我看第一点有问题,spi rx dma只能是spi的RXNE=1的时候触发,意味着spi的dr收到数据,此时才request dma去读数据,dataready无法触发spi的rx dma
jim_weisd 回答时间:2022-10-15 22:48:48
yr 发表于 2022-10-15 20:40
我看第一点有问题,spi rx dma只能是spi的RXNE=1的时候触发,意味着spi的dr收到数据,此时才request dma ...

第一点的关键是DATAREADY信号通过timer的事件捕捉触发SPI的DMA,正是因为DATAREADY信号无法触发SPI DMA,才需要timer的事件捕捉帮忙。
yr 回答时间:2022-10-17 08:50:37
jim_weisd 发表于 2022-10-15 22:48
第一点的关键是DATAREADY信号通过timer的事件捕捉触发SPI的DMA,正是因为DATAREADY信号无法触发SPI DMA, ...

楼主说的timer的事件捕捉触发spi的dma,这个是怎么实现的?能具体说说看
xmshao 回答时间:2022-10-17 09:18:41
大致了解你的需求了。你ADC那边每次可能有3个字节的数据过来,MCU这边DMA接收即可。你现在担心的重点是如何让DMA继续接收,这应该没啥问题。 比方你如果希望DMA接收1024个数据后才去做处理,那你就将DMA的接收size设置为1024.Normal模式或循环模式都可以。每接收1024个后触发完成中断,然后对数据做处理。
jim_weisd 回答时间:2022-10-17 14:34:11
yr 发表于 2022-10-17 08:50
楼主说的timer的事件捕捉触发spi的dma,这个是怎么实现的?能具体说说看

DATAREADY信号下降沿被timer事件捕捉到以后可以产生中断或DMA,这里选择DMA,然后配置DMA的时候,源地址是SPI数据寄存器的地址,终地址是内存量数组的起始地址,这就把外接触发信号用timer转接到了SPI的DMA启动上了。
butterflyspring 回答时间:2022-10-17 17:38:56
jim_weisd 发表于 2022-10-17 14:34
DATAREADY信号下降沿被timer事件捕捉到以后可以产生中断或DMA,这里选择DMA,然后配置DMA的时候,源地址 ...

DMA开始搬运需要reuqest 信号,用那个事件产生request 信号呢?
jim_weisd 回答时间:2022-10-17 21:21:44
butterflyspring 发表于 2022-10-17 17:38
DMA开始搬运需要reuqest 信号,用那个事件产生request 信号呢?

timer的事件捕捉可以产生DMA request
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版