TI 【ads131m02】DSP TMS320F280049C调试与学习笔记

ads131m02 调试与学习笔记

    • 时序
      • SPI

参考链接:
ADS131M02_TI官网资料参考
ADS131M02—英文使用手册
ADS131M0x—参考代码 Example C Code

ADS131M02 是一款 two 通道、同步采样、24 位、ΔΣ 模数转换器 (ADC),具有宽动态范围、低功耗和电能测量特定功能,因此非常适合电能计量、功率计量和断路器应用。
ADS131M02 同属于ADS131M0x系列,x代表通道位数,M02为2通道,M08为8通道。

DSP使用的也是TI的 TMS320F280049C,通讯方式为SPI

时序

SPI

简单介绍一下SPI,如果需要详细了解可以参考这篇文章:SPI通信详解

SPI 是英语 Serial Peripheral interface 的缩写,即串行外围设备接口。SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。

在这里插入图片描述

ADS131M02使用SPI兼容接口来配置器件并检索转换数据。该器件始终充当 SPI 从机; SCLK 和 CS 是接口的输入。该接口在SPI模式1下运行,其中CPOL = 0,CPHA = 1。在SPI模式1中,SCLK空闲为低电平,数据仅在SCLK上升沿启动或更改;数据由主机和从机在SCLK下降沿上锁存或读取。该接口是全双工的,这意味着接口可以同时发送和接收数据。
该器件包括典型的 SPI 信号:SCLK、CS、DIN (MOSI) 和 DOUT (MISO)。此外,还有另外两个数字引脚提供额外的功能。DRDY 引脚用作主机的标志,用于指示新的转换数据可用。SYNC/RESET引脚是一个双功能引脚,允许将转换同步到外部事件,并允许硬件设备复位。

疑问1:但在实际程序中,我初始化SPI为模式1时发现通讯数据接收回来刚好会便宜一位,如发送复位指令应该回复0xFF22,但是实际回复0x7F91,其正好是FF22右移一位,初始化为SPI的0模式,CPOL = 0,CPHA = 0时又收发都正常,但与手册中说明的却不符…求大佬指点

  1. 片选 Chip Select (CS)
    CS 引脚是一个低电平有效输入信号,用于选择用于通信的器件。该器件忽略任何通信,当 CS 保持高电平时,DOUT 为高阻抗。在通信帧期间将 CS 保持低电平,以确保正确通信。每次 CS 为高电平时,接口都会重置。
  2. 串行数据时钟 Serial Data Clock (SCLK)
    SCLK 引脚是一个输入,用作接口的串行时钟。SCLK上升沿的DOUT引脚转换的输出数据和DIN的输入数据均锁存于SCLK的下降沿。
  3. 串行数据输入 Serial Data Input (DIN)
    DIN引脚是器件的串行数据输入引脚。当 CS 引脚为低电平时,串行命令由器件通过 DIN 引脚移入,每个 SCLK 下降沿。
  4. 串行数据输出 Serial Data Output (DOUT)
    DOUT 引脚是该器件的串行数据输出引脚。当 CS 引脚为低电平时,该器件通过每个上升的 SCLK 边沿串行移出命令响应和 ADC 转换数据。当 CS 为高电平时,该引脚处于高阻抗状态。
  5. 数据就绪 Data Ready (DRDY)
    DRDY引脚是一个低电平有效输出,用于指示转换模式下新的转换数据何时准备就绪,或者在电流检测模式下是否满足电流检测要求。将DRDY引脚连接到主机上的数字输入,以在转换模式下触发定期数据检索。(转换模式:连续转换;全局斩波)。

DRDY引脚与ADS131M02上给定通道的采样时间之间的关系取决于该通道的相位校准设置以及MODE寄存器中DRDY_SEL[1:0]位的状态。DRDY_SEL[1:0]位的设置决定了DRDY引脚何时被激活(即,变为低电平):
当DRDY_SEL[1:0]被设置为00b时,DRDY会在具有最大正相位校准设置(即,最滞后的)的通道有新转换结果时激活。
当DRDY_SEL[1:0]被设置为01b时,设备会在任何通道数据准备就绪时激活DRDY。
当DRDY_SEL[1:0]被设置为10b或11b时,DRDY会在具有最负相位校准设置(即,最领先的)的通道有新转换数据时激活。
在全局斩波模式下,改变DRDY_SEL[1:0]位对DRDY行为没有影响,因为在该模式下相位校准自动禁用。

在MODE寄存器中,DRDY_HIZ位配置了DRDY引脚在非断言(即高电平)时的状态。默认情况下,该位是0b,意味着引脚使用推挽输出级主动驱动为高电平。当该位被设置为1b时,DRDY表现为一个开漏数字输出。如果DRDY未断言,可以使用一个100kΩ的上拉电阻将引脚拉高。
MODE寄存器中的DRDY_FMT位决定了DRDY信号的格式
当该位为0b时,新数据通过DRDY从高电平变为低电平来指示,并保持低电平,直到所有转换数据从设备中移出,或者在下次DRDY过渡到低电平之前短暂地保持低电平然后变为高电平。当DRDY_FMT位为1b时,新数据通过DRDY引脚上的一个短暂负脉冲来指示。
如果当DRDY_FMT为1b时,主机在DRDY脉冲后不读取转换数据,则设备会跳过一个转换结果,并且在数据因生成脉冲的方式而再次就绪的第二次实例之前,不会提供另一个DRDY脉冲。
重要的是要注意,当新转换完成而正在读取转换数据时,DRDY脉冲会被阻塞。因此,为了避免DRDY行为的不一致性,应避免在新转换完成的时间段内读取ADC数据。这样可以确保DRDY信号能够准确地反映数据就绪的状态。

在我的程序中参考TI工程例子,使用DRDY中断在中断函数中获取采样转换数据并保存。

__interrupt void GPIO_DRDY_IRQHandler(void)
{int32 ch0 = 0xFF, ch1 = 0xFF;ReadData(&adcdata_channel);if(queueIndex >= WINDOW_LEN){queueIndex = 0;}ch0queue[queueIndex] = adcdata_channel.channel0;   // 通道0ch1queue[queueIndex++] = adcdata_channel.channel1;  // 通道1Interrupt_clearACKGroup(PIEACK_GROUP1);   //清理中断标志(必须)
}

在这里插入图片描述

  1. 转换同步或系统复位 Conversion Synchronization or System Reset (SYNC/RESET)
    SYNC/RESET引脚是一个多功能数字输入引脚,主要用于允许主机将转换同步到外部进程或复位器件

SPI通信帧

ADS131M02上的 SPI 通信以帧形式执行。每个 SPI 通信帧都由几个字组成。

通过在MODE寄存器中对WLENGTH[1:0]位进行编程,字长可配置为16位、24位或32位。ADS131M02实现了 SPI 通信的超时功能。使用 MODE 寄存器中的 TIMEOUT 位启用或禁用超时。启用后,整个 SPI 帧(第一个 SCLK 到最后一个 SCLK)必须在 215 个 CLKIN 周期内完成,否则 SPI 将复位。此功能是为了在 CS 绑定低的情况下恢复 SPI 同步而提供的方法。该接口是全双工的,这意味着该接口能够在DOUT上传输数据,同时在DIN上接收数据。主机在 DIN 上发送的输入帧始终以命令开头。设备在 DOUT 上传输的输出帧上的第一个字始终以对在前一个输入帧上写入的命令的响应开始。命令中的字数取决于提供的命令。对于大多数命令,框架中有四个单词。在 DIN 上,主机提供命令,如果启用了输入 CRC,则提供命令 CRC,如果禁用了输入 CRC,则提供一个零字,以及另外两个零字。同时在DOUT上,该器件输出来自前一帧命令的响应、代表两个ADC通道的ADC数据字和一个CRC字。图 8-18 展示了一个典型的命令框架结构。
在这里插入图片描述

SPI通信字
带有ADS131M02的SPI通信帧由单词组成。DIN上的字可以包含命令、寄存器写入期间的寄存器设置或输入数据的CRC。DOUT上的字可以包含命令响应、寄存器读取期间的寄存器设置、ADC转换数据或输出数据的CRC。字可以是 16、24 或 32 位。字长由MODE寄存器中的WLENGTH[1:0]位配置。设备默认为 24 位字长。命令、响应、CRC 和寄存器始终包含 16 位实际数据。这些字始终是最高有效位 (MSB) 对齐的,因此最低有效位 (LSB) 是零填充的,以适应 24 位或 32 位字的大小。ADC转换数据标称值为24位。当器件配置为 16 位通信时,ADC 会截断其 8 个 LSB。对于由MODE寄存器中的WLENGTH[1:0]位配置的ADC数据,有两种32位通信选项。ADC数据可以是用零填充的LSB,也可以是MSB符号扩展的数据。

疑问2:在调试中发现无论发送什么数据都回复0xFF22
论坛相关问题:ADS131M04: 任何指令的回复第一个字节都是FF24

ADS131M02: 周期DRDY_n低脉冲,之后立即受到0xFF22数据输出
后续经过仔细对时序并修改,再用示波器测量发送数据的波形发现24bits,3字节的数据原本是一次发送的,但分了两次,先发送16bits,再发送8bits,很奇怪官方库的接口就是有问题,后续将底层读写寄存器的代码直接拷过来操作,并在发送结束拉高片选前多延时一点确保在一个完整24bits发送完毕再拉高片选信号,最终解决。
其底层无非即是读写,spib_addr + 0x8 位置的寄存器完成发送,粗略封的调试接口如下:

uint16_t Send24bits(uint16 spi_data1, uint16 spi_data2, uint16 spi_data3)
{uint8 dataRx[4] = { 0 };   while(((*((volatile uint16_t *)(spib_addr + 0x2)))& 0x20) != 0U){}(*((volatile uint16_t *)(spib_addr + 0x8)))= spi_data1;   // Send the first 8 bits of the datawhile(((*((volatile uint16_t *)(spib_addr + 0x2)))& 0x40) == 0U) {}dataRx[0] = (*((volatile uint8_t *)(spib_addr + SPI_O_RXBUF)));  // Check for data to read.while(((*((volatile uint16_t *)(spib_addr + 0x2)))& 0x20) != 0U){}(*((volatile uint16_t *)(spib_addr + 0x8)))= spi_data2;while(((*((volatile uint16_t *)(spib_addr + 0x2)))& 0x40) == 0U) {}dataRx[1] = (*((volatile uint8_t *)(spib_addr + SPI_O_RXBUF)));while(((*((volatile uint16_t *)(spib_addr + 0x2)))& 0x20) != 0U){ }(*((volatile uint16_t *)(spib_addr + 0x8)))= spi_data3;while(((*((volatile uint16_t *)(spib_addr + 0x2)))& 0x40) == 0U) {}dataRx[2] = (*((volatile uint8_t *)(spib_addr + SPI_O_RXBUF)));while(((*((volatile uint16_t *)(spib_addr + 0x2)))& 0x20) != 0U){}uint16_t adcResponse = combineBytes(dataRx[0], dataRx[1]);return adcResponse;
}

通信协议:指令与回复
在这里插入图片描述
其余不多解释,参照途中格式即可,着重说明一下读写寄存器的命令:
读寄存器: RREG (101a aaaa annn nnnn)
RREG 用于读取器件寄存器。命令字的二进制格式为 101a aaaa annn nnnn,其中a aaaa a 是开始读取的寄存器的二进制地址nnn nnnn 是要读取的连续寄存器的无符号二进制数减 1。在ADS131M02上读取寄存器有两种情况。当读取单个寄存器(nnn nnnn = 000 0000b)时,设备在下一帧的命令响应字中输出寄存器内容。如果使用单个命令 (nnn nnnn > 000 0000b) 读取多个寄存器,则设备将按地址顺序顺序输出请求的寄存器数据。
在这里插入图片描述

举例:如果要读取地址为0x2,即MODE寄存器(默认值0x0510)时,地址a aaaa a 部分应该为0 0001 0,读取寄存器个数为1,nnn nnnn 即为 1-1=0,所以发送的命令就是 1010 0001 0000 0000 , 然后回复的是读寄存器指令的回复,接着下一个再发送NULL(即全0),这是读回来的就是,0x2地址寄存器的值,为0x0510。

读取多个寄存器时,当 nnn nnnn 在 RREG 命令字中被指定为大于零的数字时,将从器件中读取多个寄存器。与ADS131M02上的所有 SPI 命令一样,响应发生在命令后面帧的输出上。响应不是单个确认词,而是跨越多个词,以便移出所有请求的寄存器。继续切换 SCLK 以适应整个数据流的输出。ADC转换数据不会在RREG命令之后在帧中输出,以读取多个寄存器。图 显示了读取多个寄存器的示例在这里插入图片描述

// 读取地址为 0x3的CLOCK寄存器,默认值为 0x030ESend24bits(0xA1FF, 0x80FF, 0x00FF);    // 1010 0001 1000 0000 0000 0000Send24bits(0x00FF, 0x00FF, 0x00FF);   // 应返回0x030E

写寄存器 WREG (011a aaaa annn nnnn)
与读寄存器指令同理,WREG 命令允许写入任意数量的连续设备寄存器。命令字的二进制格式是 011a aaaa annn nnnn,其中 aaaa a 是要开始写入的寄存器的二进制地址,nnn nnnn 是要写入的连续寄存器的无符号二进制数减 1。在命令字之后立即发送要写入的数据。将每个寄存器的预期内容写入单独的单词,MSB 对齐。如果使能了输入CRC,则在寄存器数据之后写入此CRC。当寄存器被转换为 DIN 时,它们被写入器件。因此,CRC错误并不能阻止将错误值写入寄存器。WREG 命令期间的输入 CRC 错误会在 STATUS 寄存器中设置CRC_ERR位。设备会忽略对只读寄存器或越界地址的写入。寄存器映射地址空间中的间隙仍包含在参数 nnn nnnn 中,但不可写入,因此不会对它们进行任何更改。在以下帧中出现的对 WREG 命令的响应显示为 010a、aaaa、ammm mmmm,其中 mmm mmmm 是实际写入的寄存器数减去 1。主机可以根据 nnn nnnn 检查此数字,以确保写入预期的寄存器数。

显示了典型的 WREG 序列。在本例中,要写入的寄存器数量大于ADC通道的数量,因此,帧延伸到ADC通道和输出CRC字之外。确保在每次有新数据可用的事务处理期间,所有ADC数据和输出CRC都被移出。因此,在某些情况下,帧必须扩展到发送寄存器数据所需的字数之外。在这里插入图片描述

举例:

// 给地址为 0x3的CLOCK寄存器,写为 0x0302Send24bits(0x61FF, 0x80FF, 0x00FF);     // 0110 0001 1000 0000 0000 0000Send24bits(0x03FF, 0x02FF, 0x00FF);

未完待续。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你还在手动构建Python项目吗?PyBuilder让一切自动化!

在 Python 项目开发中,构建和管理项目是一项繁琐但必不可少的工作。你可能需要处理依赖项、运行测试、生成文档等。这时候,PyBuilder 出场了。它是一个强大的构建自动化工具,可以帮助你简化项目管理,让你更专注于编写代码。 什么…

学习SQL权限管理的基础知识

学习SQL权限管理的基础知识 一、前言1. 授予权限2. 刷新权限3. 撤销权限4. 注意事项 一、前言 在使用MySQL或其他关系型数据库时,管理用户权限是确保数据安全和访问控制的关键部分。本文将介绍如何使用SQL语句来管理MySQL数据库中的用户权限。 1. 授予权限 首先&…

白骑士的PyCharm教学基础篇 1.4 版本控制与集成

Git集成与基本操作 Git集成 配置Git 打开PyCharm,依次点击 “File” -> “Settings” -> “Version Control” -> “Git”;在 “Path to Git executable” 中,确保Git的路径正确。如果未安装Git,可以从Git官网下载并安…

PHP 安装指南

PHP 安装指南 PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,特别适用于网页开发。本指南将详细介绍如何在不同的操作系统上安装PHP,包括Windows、Linux和macOS。 Windows系统上的PHP安装 使用Windows安装程序 下载PHP安装程序:访问PHP官方网站(p…

Unity Meta Quest 开发:如何在每只手指上添加 Poke 交互

XR 开发社区: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 找到玩家物体 OVRCameraRig 下的子物体 HandInteractorsRight/Left(分别管理左右手的 Interactor)下的 HandPokeInteractor 子物体&#x…

JMX 反序列化漏洞

前言 前段时间看到普元 EOS Platform 爆了这个洞,Apache James,Kafka-UI 都爆了这几个洞,所以决定系统来学习一下这个漏洞点。 JMX 基础 JMX 前置知识 JMX(Java Management Extensions,即 Java 管理扩展&#xff0…

程序的机器级表示(一)汇编,汇编格式和数据传输指令

系列文章 : 深入理解计算机系统笔记 文章目录 系列文章3 程序的机器级表示3.1 历史观点3.2 程序编码3.2.1 机器级代码3.2.2 代码示例3.2.3 关于格式的注解 3.3 数据格式3.4 访问信息3.4.1 操作数指示符3.4.2 数据传送指令3.4.3 数据传送示例3.4.4 压入和弹出栈数据 3 程序的机…

centos/rocky容器中安装xfce、xrdp记录

最近需要一台机器来测试rdp连接,使用容器linuxxfcexrdp来实现,在此记录下主要步骤 启动rockylinux容器(其他linux发行版步骤应该相似) docker run -it -p 33891:3389 rockylinux:9.3 bash容器内操作 # 省略替换软件源步骤 ...# …

WHAT - Tailwind CSS 的数值机制

目录 一、间距比例二、尺寸:宽高宽度 (w-)高度 (h-)示例用法 三、尺寸:最大宽高min-w- 和 max-w-min-h- 和 max-h-常用类名min-w-max-w-min-h-max-h- 使用示例固定宽度和高度最小和最大宽度最小和最大高度 综合示例 四、响应式设计Breakpoint prefix配置…

达梦数据库系列—30. DTS迁移Mysql到DM

目录 1.MySQL 源端信息 2.DM 目的端信息 3.迁移评估 4.数据库迁移 4.1源端 MySQL 准备 4.2目的端达梦准备 初始化参数设置 兼容性参数设置 创建迁移用户和表空间 4.3迁移步骤 创建迁移 配置迁移对象及策略 开始迁移 对象补迁 5.数据校验 统计 MySQL 端对象及数…

Unity: TextMeshPro生成中文字体(附3.5k,7k,2w常用字集)

免费常用3千5,7千字,2万字中文字体包 1.选择Window/TextMeshPro/Font Asset Creator 注:准备字体:从字体库或其他来源获取中文字体文件,通常为.ttf、.otf或.ttc格式。最简单的方式是从Windows系统文件的Font文件夹里…

应用层自定义协议与序列化

个人主页:Lei宝啊 愿所有美好如期而遇 协议 简单来说,就是通信双方约定好的结构化的数据。 序列化与反序列化 我们通过一个问题引入这个概念,假如我们要实现一个网络版的计算器,那么现在有两种方案,第一种&#x…

C语言超市管理系统UI界面

以下是部分代码。需要源码的私信 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 //字体宽度 #define font_h 90 //字体高度typedef struct node {char name[100];//名字char number[1…

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块&#xff08;XD-MDEP100&#xff09;是一种用于将Modbus协议转换为Ethernet/IP协议的设备。它可以将Modbus RTU和Modbus TCP两种不同格式的Modbus数据包转换为Ethernet/IP协议的数据包&#xff0c;实现不同厂家的设备之间的数据交换和共享。在汇川P…

C#实现数据采集系统-查询报文处理和响应报文分析处理

发送报文处理 增加一个功能码映射关系 //功能码映射关系public readonly Dictionary<string, byte> ReadFuncCodes = new Dictionary<string, byte>();<

Codeforces Round 960 (Div. 2)(ABCD)

C o d e f o r c e s R o u n d 960 ( D i v . 2 ) \Huge{ Codeforces Round 960 (Div. 2)} CodeforcesRound960(Div.2) 文章目录 Problems A. Submission Bait题意思路标程 Problems B. Array Craft题意思路标程 Problems C. Mad MAD Sum题意思路标程 Problems D. Grid Puzzle…

软件测试----概念篇(笔试相关,一般考察开发模型和测试模型的特点及适用场景)

文章目录 前言一、需求二、开发模型1.什么是“模型”2.软件的生命周期3.常见开发模型瀑布模型螺旋模型增量模型、迭代模型敏捷模型 三、测试模型V模型W模型(双V模型&#xff09; 前言 在当今软件行业飞速发展的时代&#xff0c;软件测试已成为软件质量保障的重要环节。它贯穿于…

数字转换(树形DP)

如何对一个问题挖掘信息把它变成已知的问题十分重要&#xff0c;这一题恰恰体现这一点&#xff1a; https://www.acwing.com/problem/content/1077/ 首先&#xff0c;对于一个数x&#xff0c;它对应一个其约数之和y&#xff0c;同时他们可以相互转换&#xff0c;于是我们可以…

WhisperX

文章目录 一、关于 WhisperX新闻 &#x1f6a8; 二、设置⚙️1、创建Python3.10环境2、安装PyTorch&#xff0c;例如Linux和Windows CUDA11.8&#xff1a;3、安装此repo4、Speaker Diarization 三、使用&#x1f4ac;&#xff08;命令行&#xff09;1、English2、他语言例如德语…

前端TS高阶篇

本次一共推出三篇文章,TS基础篇、TS高阶篇、TS习题篇,三篇文章均已发布。 语法篇 1. 联合类型的问题 interface a1{kind:circle | squarerad?:numberside?:number }function getAre(a:a1){// return a.rad*3 //此处报错,因为 rad 为可选参数,可能未定义return a.rad…