同步STM32的SAI外设传输普通数据

原创 云深之无迹 2024-11-03 22:30

FreeEEG32-32通道同步ADC生物电采集系统

关于32通道同步ADC采集系统答疑

一般同步ADC都是使用的FPGA,但是单片机也可以采集!虽然I2S和SAI都是传音频数据的,但其实可以传普通数据,本质都是二进制数据流嘛!(全网都没有相关的文章)

就是一个中断来了,然后通过SD线进来,DMA外设从SD搬到了内存,就是这么简单。

可以串行的从这里进去,4个SD口,4个ADC,数据太多还可以通过FIFO来缓冲,然后把FIFO的数据传到DMA里面。

我给了三个demo段:

  1. 实现了一个双通道SAI(串行音频接口)的DMA数据采集功能。也就是说,它会同时从两个SAI通道(Block B2和Block A1)采集数据,并将采集到的数据分别存储到两个不同的缓冲区中。

  2. 当ADC的引脚就绪,启动SAI模块读取数据,并通过UART7以二进制形式输出。

  3. 实现了一个多通道SAI(串行音频接口)的DMA数据采集功能,并且使用了中断来处理DMA完成事件。它可以同时从四个SAI通道(Block B2, Block A1, Block B1, Block A2)采集数据,并将采集到的数据分别存储到不同的缓冲区中。

    1. 多通道同时采集: 通过同时启动四个SAI通道的DMA传输,实现了多通道的数据同时采集。

    2. DMA高效传输: 使用DMA方式进行数据传输,可以减轻CPU的负担,提高数据传输效率。

    3. 中断处理: 通过DMA中断,可以在DMA传输完成后立即进行后续处理,提高系统响应速度。

    4. 灵活配置: 可以根据需要选择是否启用DMA中断。

    5. 缓冲区存储: 将采集到的数据分别存储到不同的缓冲区中,方便后续的处理。


采集使用的ADC是AD777x,他们不是单纯的SPI输出,而是并行的输出接口,在官方给出的代码里面有着不同数据输出的方式:

这里使用了SAI的外设,就使用这个模式

串行的输出

一帧数据

三个宏

三个宏,用于配置AD7779模数转换器(ADC)的寄存器。这些宏可以用来设置数据的输出格式、数据头格式和时钟分频系数。

  1. AD7779_DOUT_FORMAT(x)

  • (x) & 0x3: 取出输入值x的低两位。

  • ((x) & 0x3) << 6: 将提取的两位左移6位,放到寄存器中的指定位置。

  • 最终的结果用来配置AD7779寄存器中的数据输出格式。

  • 作用: 定义数据输出格式,决定每个采样点的位数。

  • AD7779_DOUT_HEADER_FORMAT

    • (1 << 5): 将值的第5位设置为1,其他位为0。

    • 这个值用来在AD7779寄存器中启用数据头格式。

    • 作用: 定义数据头格式,包括同步和帧同步等信息。


    这么多数据要加CRC的,也就是要加个头


    AD7779、AD7771都是这样的为了快速的移动数据使用了大量的DMA外设

    SAI外设使用中断来启动

    SD数据线

    模式是非同步的从设备,就是等着数据来

    这个就是一些设置,数据深度开到了最大

    两个FIFO全开

    FIFO在APB的下面

    这个是中断的地址

    这个函数就是就是接收DMA的数据

    使用这样的结构直接获取来自SAI外设上面的数据

    实现了一个双通道SAI(串行音频接口)的DMA数据采集功能。也就是说,它会同时从两个SAI通道(Block B2和Block A1)采集数据,并将采集到的数据分别存储到两个不同的缓冲区中。

    1. 条件判断:

    • if (FREESMARTEEG_ADC & FREESMARTEEG_ADC_SAI_READ_DMAMUX): 这一行代码首先检查了两个宏定义:FREESMARTEEG_ADCFREESMARTEEG_ADC_SAI_READ_DMAMUX

    • 只有当这两个宏定义都为真时,才会执行后续的代码。这意味着,只有当ADC功能和SAI读取DMA复用功能都开启时,才会进行数据采集。

  • 启动DMA传输:

    • 这行代码启动了SAI Block B2的DMA接收。它会将从SAI Block B2接收到的32位数据存储到datas[0]这个缓冲区中。

      HAL_SAI_Receive_DMA(&hsai_BlockB2, datas[0], SAI_DATASIZE_32):

    同样,这行代码启动了SAI Block A1的DMA接收,并将数据存储到datas[1]缓冲区中。

      HAL_SAI_Receive_DMA(&hsai_BlockA1, datas[1], SAI_DATASIZE_32)
  • 等待DMA传输完成:

    • 这行代码会一直等待,直到SAI Block B2的DMA传输完成。

      while (HAL_SAI_GetState(&hsai_BlockB2) != HAL_SAI_STATE_READY)
    • 这行代码会一直等待,直到SAI Block A1的DMA传输完成。

      while (HAL_SAI_GetState(&hsai_BlockA1) != HAL_SAI_STATE_READY)
  • 检查条件: 确保ADC和DMA复用功能开启。

  • 启动DMA: 同时启动两个SAI通道的DMA接收。

  • 等待完成: 等待两个DMA传输都完成。


    • 双通道同时采集: 通过同时启动两个SAI通道的DMA传输,实现了双通道的数据同时采集。

    • 缓冲区存储: 将采集到的数据分别存储到不同的缓冲区中,方便后续的处理。

    • 等待机制: 通过循环等待DMA传输完成,确保数据采集的完整性。


    在ADC的数据传输的时候是有个信号的

    1. 条件判断:

    • 检查是否开启了ADC和SAI读取功能。

      FREESMARTEEG_ADC & FREESMARTEEG_ADC_SAI_READ
  • 数据读取循环:

    • 循环等待DMA传输完成。

      HAL_SAI_GetState(&hsai_BlockB1) != HAL_SAI_STATE_READY:
    • 启动DMA方式接收32位的数据,并将数据存储到datasBuffer[0]中。

      HAL_SAI_Receive_DMA(&hsai_BlockB1, datasBuffer[0], SAI_DATASIZE_32):
    • 读取DRDY引脚的状态。

      HAL_GPIO_ReadPin(AD_DRDY_GPIO_Port, AD_DRDY_Pin):
    • 循环等待DRDY引脚变为高电平,表示数据准备就绪。

    • 等待数据就绪:

    • 启动SAI接收:

    • 等待DMA传输完成:

  • 数据打印:

    • 遍历接收到的数据,逐字节打印成二进制形式。

    • print7_binary函数:用于打印一个字节的二进制表示。

    • print7_symbol(';'): 用于打印分隔符';'。

    • print7_line(): 用于打印换行符。

    • 检查是否开启了UART7文本输出。

      FREESMARTEEG_OUT & FREESMARTEEG_SAI_TEXT_UART7:
    • 检查输出模式:

    • 循环打印数据:

    • SAI (Serial Audio Interface): 一种高速串行音频接口,用于音频数据的传输。

    • DMA (Direct Memory Access): 一种数据传输方式,可以高效地直接将数据从外设传输到内存,减轻CPU的负担。

    • DRDY (Data Ready): 数据就绪信号,表示新的数据已经准备好可以读取。

    • 二进制输出: 将数据以二进制的形式打印出来。


    1. 条件判断:

    • 这一行代码首先检查了两个宏定义:FREESMARTEEG_ADCFREESMARTEEG_ADC_SAI_READ_INT。只有当这两个宏定义都为真时,才会执行后续的代码。这意味着,只有当ADC功能和SAI读取中断功能都开启时,才会进行数据采集。

      if (FREESMARTEEG_ADC & FREESMARTEEG_ADC_SAI_READ_INT):
  • 启动数据采集:

    • 如果启用了DMA中断:

    • 如果没有启用DMA中断:

    • HAL_SAI_Receive_DMA: 启动四个SAI通道的DMA接收,并将数据分别存储到datas[0]datas[1]datas[2]datas[3]这四个缓冲区中。

    • 程序会等待每个DMA传输完成,然后设置SAI_RxCplt标志位,表示数据采集周期结束。

    • 程序直接等待每个DMA传输完成,然后设置SAI_RxCplt标志位。

    • if (SAI_RxStart): 这行代码检查了一个标志位SAI_RxStart,用于判断是否需要开始新的数据采集周期。

    • SAI_DMA_INT_SHIFT: 这个标志位表示是否启用了DMA中断。

  • 等待DMA传输完成:

    • 无论是否启用了DMA中断,程序都会通过HAL_SAI_GetState函数来等待每个DMA传输完成。


    1. 检查条件: 确保ADC和SAI读取中断功能开启,并且需要开始新的数据采集周期。

    2. 启动DMA: 启动四个SAI通道的DMA接收。

    3. 等待完成: 等待所有DMA传输完成。

    4. 设置标志位: 设置SAI_RxCplt标志位,表示数据采集周期结束。

    第一个的连接是这样的,全连接

    第二个也是

    然后时钟线就两个,外设4个,然后可以把时钟给到别人

    音频子模块既可作为接收器,又可作为发送器;既可与另一模块同步,又可以不同步。SAI 可与其它 SAI 相连接来同步运行。

    音频数据的量化位数可能不同,控制器支持16bit、24bit和32bit三种数据长度, 因为数据寄存器是16bit的,所以对于24bit和32bit数据长度需要发送两个。为此,可以产生四种数据和帧格式组合:
    • 将16位数据封装在16位帧中
    • 将16位数据封装在32位帧中
    • 将24位数据封装在32位帧中
    • 将32位数据封装在32位帧中
    当使用32位数据包中的16位数据时,前16位(MSB)为有效位,16位LSB被强制清零,无需任何软件操作或DMA请求(只需一个读/写操作)。如果程序使用DMA传输(一般都会用),则24位和32位数据帧需要对数据寄存器执行两次DMA操作。24位的数据帧,硬件会将8位非有效位扩展到带有0位的32位。对于所有数据格式和通信标准而言,始终会先发送最高有效位(MSB优先)。

    另外的外设,就没有时钟线了

    是使用的第一个的时钟线

    同理

    这个是时钟树上面的位置

    这个就是IO的输入的口

    评论
    • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
      知白 2025-01-07 15:02 40浏览
    • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
      丙丁先生 2025-01-06 09:23 82浏览
    •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
      电子知识打边炉 2025-01-04 20:04 96浏览
    • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
      华普微HOPERF 2025-01-06 15:29 120浏览
    • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
      Industio_触觉智能 2025-01-06 10:43 87浏览
    • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
      知白 2025-01-06 12:04 155浏览
    • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
      优思学院 2025-01-06 12:03 107浏览
    • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
      华普微HOPERF 2025-01-06 17:23 138浏览
    • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
      GIRtina 2025-01-06 11:10 102浏览
    • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
      hai.qin_651820742 2025-01-07 14:52 25浏览
    • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
      GIRtina 2025-01-07 11:02 51浏览
    • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
      丙丁先生 2025-01-07 09:25 71浏览
    我要评论
    0
    点击右上角,分享到朋友圈 我知道啦
    请使用浏览器分享功能 我知道啦