ESP32S3 SPI发送间隔频率 驱动ADS8326

news2024/10/2 8:30:32

ESP32S3 SPI发送间隔频率

    • 驱动ADS8326
    • esp32s3 spi例程 代码
    • 测试
    • 用寄存器方式实现spi发送
    • 寄存器描述

驱动ADS8326

ads8326驱动时序
我们看ads8326驱动时序
首先CS信号拉低,然后clk发送6个时钟,ads8326开始启动转换。
最后clk发送16个时钟,就会读取到两个字节的数据(高位在前)

esp32s3 spi例程 代码

//SPI总线配置结构
static  spi_bus_config_t buscfg={
        .miso_io_num = PIN_NUM_MISO,    //设置主机输入
        .mosi_io_num = -1,              //设置主机输出
        .sclk_io_num = PIN_NUM_CLK,     //设置时钟引脚
        .quadwp_io_num = -1,            //不使用wp信号线
        .quadhd_io_num = -1,            //不使用hd信号线
        .max_transfer_sz = SOC_SPI_MAXIMUM_BUFFER_SIZE,
        // .intr_flags,//中断指示位   
};

// 设备配置结构 配置SPI数据传输参数(可以新建多个结构体变量,相当于挂载spi设备,一个spi最多挂载3个设备,需要设置不同的片选引脚)
static  spi_device_interface_config_t devcfg={
        .command_bits=1,                        //默认控制位长度,设置为0-16
        .address_bits=5,                        //默认地址位长度,设置为0-64
        // .dummy_bits,//在地址和数据位段之间插入的dummy位长度,用于匹配时序,一般可以保持默认
        .clock_speed_hz=5*1000*1000,            //20Mhz  时钟频率,设置的是80MHz的分频系数,单位为Hz
        .mode=0,                                //SPI 模式(0,1,2,3)
        // .flags = SPI_DEVICE_RXBIT_LSBFIRST,     //半双工通信

        // .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_POSITIVE_CS,  //半双工通信
        // .cs_ena_pretrans,//传输前CS信号的建立时间,只在半双工模式下有用
        // .cs_ena_posttrans,//传输时CS信号的保持时间
        .spics_io_num=PIN_NUM_CS,               //设置cs引脚
        .queue_size=7,                          //We want to be able to queue 7 transactions at a time
        //.pre_cb=lcd_spi_pre_transfer_callback,  //Specify pre-transfer callback to handle D/C line
};

void SPI_Init(void)
{

esp_err_t ret;
// uint8_t test_str[10];
    ESP_LOGI(TAG, "SPI初始化");
    //初始化配置SPI总线(配置HSPI)最后设置为0不启用DMA 
    ret = spi_bus_initialize(SPI2_ADS8326, &buscfg, SPI_DMA_DISABLED);  //SPI_DMA_CH_AUTO
    ESP_ERROR_CHECK(ret);
    ret = spi_bus_add_device(SPI2_ADS8326, &devcfg, &spi2_handle);
    ESP_ERROR_CHECK(ret);
    AD_SPI_CS_H;
}

esp_err_t spi_read(spi_device_handle_t spi, uint8_t *data)
{
    spi_transaction_t t;
    memset(&t, 0, sizeof(t));
    t.length=8*2;             //数据总长度,单位:比特
    t.tx_buffer=NULL;
    t.rx_buffer=data;
    // t.flags = SPI_TRANS_USE_RXDATA;
    // t.user = (void*)0;
    esp_err_t ret = spi_device_polling_transmit(spi, &t);
    assert( ret == ESP_OK );
    return ret;
}
//在一个线程上读取数据
    spi_read(spi2_handle, &ads8326_val.Data[0]);
    ESP_LOGI(TAG, "Data1:0x%x%x",ads8326_val.Data[0],ads8326_val.Data[1]);
    ads8326_val.ADCdata=((uint16_t)ads8326_val.Data[0]<<8)|ads8326_val.Data[1];
    ESP_LOGI(TAG, "ads8326AD值:%d",ads8326_val.ADCdata);
    AD8326val=ads8326_val.ADCdata*3.3123/65535;
    ESP_LOGI(TAG, "电压值:%fV",AD8326val);

当然你的主频要调到240Mhz

测试

两个发送间隔是9us
两个发送间隔是9us 但是这个是不满足我们的要求的

用寄存器方式实现spi发送

      1.初始配置还是采样之前的
      2.在线程初始化前我们调用读取,目的是让api去设置寄存器,如果我们自己去设置工作量就会很大。
      3.然后在我们线程中 触发寄存器去读。
      4.然后去GPSPI2.data_buf[0]里面去读,里面是个GPSPI2.data_buf[16];
      5.测试最快可以达到980ns一次。
//2.步代码
spi_read(spi2_handle, &ads8326_val.Data[0]);
///3.步代码
    GPSPI2.user.usr_mosi=0;                      //清除 SPI_USR_MOSI。 置位此位,使能一次操作的读数据 (DIN) 阶段
    GPSPI2.dma_conf.dma_afifo_rst=1;             //置位 SPI_DMA_AFIFO_RST、SPI_BUF_AFIFO_RST 和 SPI_RX_AFIFO_RST 复位 buffer。 
    GPSPI2.dma_conf.buf_afifo_rst=1; 
    GPSPI2.dma_conf.rx_afifo_rst=1; 
    GPSPI2.cmd.update = 1;
    while (GPSPI2.cmd.update);
    GPSPI2.cmd.usr = 1;

寄存器描述

则具体的寄存器配置如下:
1. 配置 CMD 状态相关寄存器。
• 配置 SPI_USR_COMMAND_VALUE 为需要的命令值;
• 配置 SPI_USR_COMMAND_BITLEN。SPI_USR_COMMAND_BITLEN 为所需要的命令位长 - 1;
• 置位 SPI_USR_COMMAND;
• 清除 SPI_FCMD_DUAL 和 SPI_FCMD_QUAD。
2. 配置 ADDR 状态相关寄存器。
• 配置 SPI_USR_ADDR_VALUE 为需要的地址值;
• 配置 SPI_USR_ADDR_BITLEN。SPI_USR_ADDR_BITLEN 为所需要的地址位长 - 1;
• 置位 SPI_USR_ADDR 和 SPI_FADDR_DUAL;
• 清除 SPI_FADDR_QUAD。
3. 配置 DUMMY 状态相关寄存器。
• 在 SPI_USR_DUMMY_CYCLELEN 中配置 DUMMY 周期,其中 SPI_USR_DUMMY_CYCLELEN 的值
等于 DUMMY 阶段所需要的时钟周期数 - 1;
• 置位 SPI_USR_DUMMY。
4. 配置 DIN 状态相关寄存器。
• 在 SPI_MS_DATA_BITLEN 中配置读数据的位长。SPI_MS_DATA_BITLEN 的值等于所需要的位长 - 1;
• 置位 SPI_FREAD_QUAD 和 SPI_USR_MISO;
• 清除 SPI_FREAD_DUAL;
• 如果选择了 DAM 控制的传输模式,则需要配置 GDMA。如果选择了 CPU 控制的传输模式,则无需
任何操作。
5. 清除 SPI_USR_MOSI。
6. 置位 SPI_DMA_AFIFO_RST、SPI_BUF_AFIFO_RST 和 SPI_RX_AFIFO_RST 复位 buffer。
7. 置位 SPI_USR 开始 GP-SPI 传输。

最后上完整工程连接吧
esp32s3寄存器工程
这个我搞了好久被逼出来了的。有不对的请谅解。欢迎多多指教。
最后给你们推荐个:
一键 自动下载器
店主很好有啥问题可以互相交流,就是他帮助了我,感谢!

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

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

相关文章

Spring扫描逻辑原码解析(带图好理解)

先上流程图 再上类图 再上代码 public static void main(String[] args) {XsmApplicationContext applicationContextnew XsmApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("userService"));System.out.println(applicationCo…

Laravel框架学习笔记——Laravel环境配置及安装(Ubuntu20.04为例)

目录引言1、安装Nginx2、安装PHP3、安装Composer4、搭建Laravel框架项目5、修改Nginx映射6、安装MySQL引言 好久没写博客了&#xff0c;因为个人需要&#xff0c; 所以要涉及到Laravel框架的学习&#xff0c;所以会出一系列的关于PHP的Laravel框架学习笔记&#xff0c;希望能够…

【平台数仓设计——2023】

平台数仓设计——2023前言一、选取大数据平台1、CDH大数据平台2、HDP大数据平台3、CDP大数据平台4、各种云数据中台二、选取调度平台1、DolphinScheduler(海豚调度)2、AzKaban3、Oozie4、Airflow5、corntab命令三、选取数仓设计方案1、离线数仓2、实时数仓3、离线实时一体化数仓…

尚医通 (二十二)预约下单

目录一、预约下单功能(一)1、需求2、搭建订单模块3、封装Feign调用获取就诊人接口4、封装Feign调用获取排班下单信息接口二、预约下单功能(二)1、实现生成订单接口三、预约下单功能(三)四、预约下单功能(四)1、生成订单后处理逻辑-封装短信接口2、生成订单后处理逻辑-更新排班数…

cracklib与libpwquality 评估密码的安全性

一、cracklib 检测密码强弱linux中采用pam pam_cracklib module来实现对密码强度的检测&#xff0c;可以通过配置让linux系统自动检测用户的密码是否为弱密码。yuminstall cracklib # centos apt-get install libcrack2 # ubuntu # 如果需要依赖此库做开发的话需要安装这个 y…

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源 1.选择合适的文件上传 2.可以看到为*.asp文件 3.可以推测出此站点为IIS 4.上传shell.asp试试 5.上传报错&#xff0c;将其改名为shell.asp.txt上传&#xff0c;发现上传成功 6.有个问题就是服务器将我们所…

Node 10.0.8.6:9003 is unknown to cluster

解决方案解决方案一解决方案一 ① 概念介绍 公网ip&#xff1a;就是任意两台连接了互联网的电脑可以互相ping ip,能够通的ip 内网ip&#xff1a;只是在内网中使用无法与外网连接的ip ②问题背景 在腾讯云上搭建的一个redis集群&#xff0c;集群启动后 可以看到启动节点…

腾讯企微、泛微、契约锁举办的这场大会,超1000人共商数字化转型

全程数字化运营平台体验大会 2月23日下午&#xff0c;腾讯企业微信、泛微、契约锁在上海联合举办了全程数字化运营平台体验大会&#xff0c;旨在推动政企客户的数字化转型。 活动以“智能、协同、高效”为主题&#xff0c;吸引了上千位政府及企事单位的信息化负责人参与。 在…

Tapdata 和 Databend 数仓数据同步实战

作者&#xff1a;韩山杰https://github.com/hantmacDatabend Cloud 研发工程师基础架构在云计算时代也发生着翻天地覆的变化&#xff0c;对于业务的支持变成了如何能利用好云资源实现降本增效&#xff0c;同时更好的支撑业务也成为新时代技术人员的挑战。 本篇文章通过&#xf…

含泪推荐5款小体积,超实用的工具

大家好&#xff0c;我又来啦&#xff0c;今天给大家带来的5款软件&#xff0c;共同特点都是体积小、无广告、超实用&#xff0c;大家观看完可以自行搜索下载哦。 1.文字自动验证工具——LanguageTool LanguageTool是一款文字自动验证工具&#xff0c;不仅支持中英文&#xff…

如何将虚拟机ubuntu设置网路连接为桥接模式

当将虚拟机的网络适配器设置为NAT模式时&#xff0c;一切正常&#xff0c;可以ping通所有ip, 但是当设置为桥接模式时&#xff0c;ping命令会提示ubuntu connect: Network is unreachable 这是因为桥接模式没有设置正确&#xff0c;通过下面的步骤可以将桥接模式配置正确。 1…

iOS 生命周期 (最新最完整)

要知道APP的生命周期&#xff0c;首先要了解一下生命周期的5种状态&#xff0c;结合状态理解生命周期的使用。 一、应用的状态 应用的状态包括&#xff1a; 1.1 未运行&#xff08;Not running&#xff09; 程序没启动 1.2 未激活&#xff08;Inactive&#xff09; 程序在…

尚医通 (二十一)预约挂号功能

目录一、预约挂号详情1、需求2、预约挂号详情接口3、预约挂号详情前端二、预约确认1、需求2、预约确认接口3、预约确认前端一、预约挂号详情 1、需求 接口分析 &#xff08;1&#xff09;根据预约周期&#xff0c;展示可预约日期数据&#xff0c;按分页展示 &#xff08;2&…

JAVA设计模式之工厂模式讲解

目录 前言 开始表演 前言 Java中使用工厂模式的主要原因是为了实现代码的灵活性和可维护性。工厂模式是一种创建型设计模式&#xff0c;它提供了一种将对象的创建和使用进行分离的方式。具体来说&#xff0c;工厂模式可以将对象的创建过程封装在一个独立的工厂类中&#xff…

自动微分记录

计算图(数据流图):AI系统化问题 - 计算图的提出 计算图和自动微分 单算子切分、图的切分和调度 前端->统一表示->优化层->运行时态->底层库 语言 计算网络模型中间表示 计算图 自动微分 计算图优化 内存管理、计算图调度和执行 内核代码优化与编译 多硬件支持…

ip-guard如何在控制台上判断策略是否下发成功?

方法1.看控制台策略设置是否带*号,一般带*,然后刷新控制台依旧带*,说明策略没下发。可以点击刷新按钮进行刷新。 方法2.运行cmd,将控制台程序拖入命令行中,加参数-ad,回车运行。 然后,选中指定客户端,在维护-命令行,输入policy,

骨传导耳机是怎么发声的,骨传导耳机值得入手嘛

现在市面上除了我们平时比较常见的有线耳机、头戴耳机、真无线耳机&#xff0c;近两年还涌现出了一种有着黑科技之称的特别耳机——骨传导耳机&#xff0c;并且因其在运动场景下的优势过于明显而得到了众多运动爱好者的大力追捧。那么今天我们就来聊聊这款所谓的黑科技骨传导耳…

webform如何升级mvc

1.创建项目 给项目起名字然后指定存储位置 选择asp.net 空项目 2.新建model namespace WebFormToMvc {/// <summary>/// 用户模型/// </summary>public class UserModel{/// <summary>/// id/// </summary>public int Id { get; set; }/// <sum…

解决Chrome浏览器内置翻译无法使用的问题

hosts文件 hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开&#xff0c;主要作用是定义IP地址和主机名的映射关系&#xff0c;是一个映射IP地址和主机名的规定。当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从hosts文件中寻找对应…

上海亚商投顾:沪指收跌0.62% 东数西算板块逆势领涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日震荡调整&#xff0c;盘中集体跌超1%&#xff0c;随后沪指跌幅有所收窄。东数西算概念午后走强&#xf…