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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版