stm32 AD7606 芯片驱动 hal库 spi通讯

这篇具有很好参考价值的文章主要介绍了stm32 AD7606 芯片驱动 hal库 spi通讯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

         这两天用来个ad7606 的芯片,结果硬件出来个问题,花了不少时间看这个芯片手册,干脆分享一下。

        引脚定义

spi ad7606 rtos,stm32,嵌入式硬件,单片机

        OS0 OS1 OS2

        这个三个引脚用于配置芯片的采样频率,只要不设置为111即可正常采样;

spi ad7606 rtos,stm32,嵌入式硬件,单片机

CONVSTA CONVSTB 这两个引脚用于启动芯片采集转换,默认高电平,上升沿后,采样芯片开始数据采集

spi ad7606 rtos,stm32,嵌入式硬件,单片机

RESET 用于开始采样前对芯片的复位,如果没有复位,后续采集的数据可能是乱码,只需要在开机的时候复位一次即可。

spi ad7606 rtos,stm32,嵌入式硬件,单片机

RD引脚即数据通讯时钟

spi ad7606 rtos,stm32,嵌入式硬件,单片机

CS引脚通讯使用,低电平有效

spi ad7606 rtos,stm32,嵌入式硬件,单片机

BUSY引脚,默认低电平,下降沿表示数据转换成功

spi ad7606 rtos,stm32,嵌入式硬件,单片机

DOUTA,DOUTB 使用spi通信只需要这两个引脚。

spi ad7606 rtos,stm32,嵌入式硬件,单片机

RANGE引脚,低电平表示转换的是5v的电压,高电平表示转换的是10v的电压,后续电压转换时后用到。

通讯时序

该芯片支持串行通讯和并行通讯,我使用的是串行通讯,即spi,时序图如下

spi ad7606 rtos,stm32,嵌入式硬件,单片机

其通讯的时序和spi一样,其中FRSTDATA引脚在串行通讯的时候可以忽略,没有明确说明spi的配置,但是根据时序图可以判断,sclk默认高电平,在下降沿读取数据,串行读取数据有两种方式,一种是如上的一条数据线(DOUTA 或者 DOUTB),直接读取八个数据,每个数据两个字节,另外一种是DOUTA 和 DOUTB 各读取四个数据,我使用的是第一种方式。

spi ad7606 rtos,stm32,嵌入式硬件,单片机

我们再看如何驱动AD7606芯片,如上时序,首先需要复位芯片,RESET引脚保持最少50ns的高电平,之后CONVSTA /B触发一个上升沿,开始数据转换,此时busy引脚拉高,表示在采集的数据的过程中,当busy引脚拉低,表示书采集结束,之后边可以通过spi通讯获取数据

以上是芯片的基本内容,介绍一下相关配置和代码

HAL配置

spi ad7606 rtos,stm32,嵌入式硬件,单片机

spi配置如上,需要注意的两点,通信的数据为16个字节,第二个使用的MSB模式。

代码讲解

代码部分,因为我的代码是使用了两个ad7606,所以我挑核心部分来讲解,以免混淆。 


#define AD7606Cs1_High()   HAL_GPIO_WritePin(CARD1_CS_GPIO_Port, CARD1_CS_Pin, GPIO_PIN_SET)
#define AD7606Cs1_Low()    HAL_GPIO_WritePin(CARD1_CS_GPIO_Port, CARD1_CS_Pin, GPIO_PIN_RESET)

#define AD7606Rst_High(GPIO,GPIO_PIN)  		HAL_GPIO_WritePin(GPIO, GPIO_PIN, GPIO_PIN_SET)
#define AD7606Rst_Low(GPIO,GPIO_PIN)     	HAL_GPIO_WritePin(GPIO, GPIO_PIN, GPIO_PIN_RESET)

#define AD7606CONVST_High(GPIO,GPIO_PIN)    HAL_GPIO_WritePin(GPIO, GPIO_PIN, GPIO_PIN_SET)
#define AD7606CONVST_LOW(GPIO,GPIO_PIN)    	HAL_GPIO_WritePin(GPIO, GPIO_PIN, GPIO_PIN_RESET)

typedef enum
{
	AD7606_OS_0 = 0,
	AD7606_OS_1,
	AD7606_OS_2,
	AD7606_OS_4,
	AD7606_OS_8,
	AD7606_OS_16,
	AD7606_OS_32,
	AD7606_OS_64,
	AD7606_OS_NULL,

}AD7606_OS;

static void AD7606_Set_Os(AD7606_OS os_type)
{
	GPIO_TypeDef 	*GPIO_OS0;
	GPIO_TypeDef 	*GPIO_OS1;
	GPIO_TypeDef 	*GPIO_OS2;
	
	uint16_t 		GPIO_PIN_OS0;
	uint16_t 		GPIO_PIN_OS1;
	uint16_t 		GPIO_PIN_OS2;
	
	uint8_t  		type = (uint8_t)os_type;
	

    GPIO_OS0 = MCU_OS0_card1_GPIO_Port;
	GPIO_OS1 = MCU_OS1_card1_GPIO_Port;
	GPIO_OS2 = MCU_OS2_card1_GPIO_Port;
	GPIO_PIN_OS0 = MCU_OS0_card1_Pin;
	GPIO_PIN_OS1 = MCU_OS1_card1_Pin;
	GPIO_PIN_OS2 = MCU_OS2_card1_Pin;


	
	HAL_GPIO_WritePin(GPIO_OS0,GPIO_PIN_OS0,(GPIO_PinState)(type&0x01));
	type = type>>1;
	HAL_GPIO_WritePin(GPIO_OS1,GPIO_PIN_OS1,(GPIO_PinState)(type&0x01));
	type = type>>1;
	HAL_GPIO_WritePin(GPIO_OS2,GPIO_PIN_OS2,(GPIO_PinState)(type&0x01));
	type = type>>1;


}

配置采样频率


typedef enum
{
	AD7606_5V = 0,
	AD7606_10V,

}AD7606_RANGE;

static void AD7606_Set_Range(AD7606_RANGE RANGE)
{
	GPIO_TypeDef 	    *GPIO_RAGE;
	uint16_t 			GPIO_PIN_RAGE;
	

    GPIO_RAGE = MCU_RANGE_card1_GPIO_Port;
	GPIO_PIN_RAGE = MCU_RANGE_card1_Pin;

	
	HAL_GPIO_WritePin(GPIO_RAGE,GPIO_PIN_RAGE,(GPIO_PinState)RANGE);	
}

配置采样范围

void AD7606Reset()
{
	GPIO_TypeDef 	*GPIO_RST;
	uint16_t 		GPIO_PIN_RST;


	GPIO_RST = MCU_RESET_card1_GPIO_Port;
	GPIO_PIN_RST = MCU_RESET_card1_Pin;

	
    AD7606Rst_Low(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_Low(GPIO_RST,GPIO_PIN_RST);
	
}

复位芯片代码,其中的    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);事实上只是在凑时间,如果你的芯片时钟频率很高的话,建议量一下这边RESET引脚复位时间够不够。

void AD7606Init(AD7606_CARD drv)
{
		AD7606_Set_Os(AD7606_OS_0,drv);
		AD7606_Set_Range(AD7606_5V,drv);
		AD7606Cs1_High();
		AD7606CONVST_High(MCU_CONVST_card2_GPIO_Port,MCU_CONVST_card2_Pin);
		AD7606Reset(drv);

}

初始化芯片,配置采样频率,采样范围,拉高对应的引脚,复位芯片。

void AD7606Start(AD7606_CARD drv)
{
	
	GPIO_TypeDef 	*GPIO_CONVST;
	uint16_t 		GPIO_PIN_CONVST;


	GPIO_CONVST = MCU_CONVST_card1_GPIO_Port;
	GPIO_PIN_CONVST = MCU_CONVST_card1_Pin;

	AD7606CONVST_High(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_High(GPIO_CONVST,GPIO_PIN_CONVST);


}

启动芯片采样转换

uint16_t 	AD7606_values[8];

void AD7606BusyIrqCallback(uint16_t *ad7606Val,uint8_t ad7606Chl)
{


	    AD7606Cs1_Low();
		HAL_SPI_Receive(&hspi5,(uint8_t *)ad7606Val,ad7606Chl,0x100);
		AD7606Cs1_High();

		
		AD7606Start(drv);

}

这边有两个注意点,ad芯片在转换期间也是可以读取数据,但是有相关的时序限制,我这边没有对busy进行判断是因为在实际使用的情况下,我是有延时的,足够芯片的数据转换,第二个注意点,我们是要读取16位的数据,所以需要定义uint16_t 类型的数组,在实际通过HAL_SPI_Receive读取的时候在强制转换成uint8类型的指针。

最后是数据转化,我简单说一下

spi ad7606 rtos,stm32,嵌入式硬件,单片机

简单来说,你采集的数值是 一个二级制补码,你需要将采集值转换成原码,再通过

Vin =  RANGE * ADC_NUM / 32768;

这个式子中,Vin是我们要采集的电压,RANGE为我们设置的数值,为5v或者10v,ADC_NUM是我们采集的数值并且转换成源码。

避坑

在实际过程中,驱动代码倒是没有说明特别大的问题,但是,我卡了好几天,因为获取的数据是0x7fff,无论怎么样都是这个数据,最后发现是硬件原理图画的有问题,并且REFGNG也不对,如果有朋友遇到类似的情况,优先检查硬件,尤其是几个GND是否共地;

感谢大家看到这里,祝大家生活愉快。文章来源地址https://www.toymoban.com/news/detail-859148.html

到了这里,关于stm32 AD7606 芯片驱动 hal库 spi通讯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32(HAL库)驱动AD8232心率传感器

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置  2.4 GPIO配置  2.5 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代码整合 4 硬件连接 5 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对AD8232心率

    2024年02月16日
    浏览(16)
  • STM32模拟SPI协议获取24位模数转换(24bit ADC)芯片AD7791电压采样数据

    STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。AD7791是亚德诺(ADI)半导体一款用于低功耗、24位Σ-Δ型模数转换器(ADC) ,适合低频测量应用,提供50 Hz/60 Hz同步抑制。 这里介绍基于AD7791的24位ADC采样实现。 AD7791的管脚

    2024年02月09日
    浏览(28)
  • 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器

    大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片——AD9833。 AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波、三角波和方波输出。 通俗来讲,DDS是一种把波形预先存储在芯片内部的DAC,只要设置好它的工作频率,就能按这个频率来输出特定的波形

    2024年02月02日
    浏览(19)
  • STM32H7并行读取AD7606数据以及片内AD值不准解决办法

    先了解一下AD7606,16位,单电源,200k采样率,8路,除了贵没有其他缺点,数据相当的稳,一个5V供电,不用运放的情况下采集电压精度可以达到1mv,非常Nice 与单片机相连 单片机 调用代码 测试发现AD采集到的电压要远小于实际电压,H7的AD还是16位的,不能这么拉跨吧,在网上

    2024年02月11日
    浏览(22)
  • AD7606与STM32F103ZET6的串行通信

      本文是AD7606与STM32的串行通信的学习心得,可帮助你快速入门AD7606。   图一   图二   图三   图四   根据图一,一些引脚在置高或置低时的上升或下降沿会受时间影响,因此在编写代码时,一些对引脚的操作需要放在一起,且延时函数不能随意使用。   图

    2024年02月08日
    浏览(38)
  • stm32+AD9910 并口驱动

    搞了好几天DAC芯片AD9910 ,找到多数资料时SPI控制内部RAM或者DDS输出波形,这里总结一下STM32 FMSC 总线输出到AD9910 ,由于AD9910 的PDCLK 为输出,这里采用PWM输入捕获模式获取 AD9910 PDCLK 的下降沿,采用捕获信号触发DMA2  ,DMA 在将数据搬移到总线上,具体代码如下: 使用方法:

    2024年02月13日
    浏览(16)
  • STM32驱动AD9833模块

    淘宝上买了个AD9833模块,stm32用商家的例程代码可以调频,可以调相,就是调不了幅度。换了几块不同32开发板都不行,重新以正点原子F103的工程为基础把驱动移植进去,最后实现了调幅的功能。这里把代码放上来,希望能帮助遇到相同问题的同学。 开发板: stm32f103c8t6核心

    2024年02月12日
    浏览(22)
  • STM32驱动ADS1256串口输出-AD转换

    ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电

    2024年02月16日
    浏览(25)
  • STM32F103硬件SPI驱动ADS1256

    最近实验室有几个项目都需要用到高分辨率AD转换,于是就开始了ADS1256的开发。 新手,焊得丑,见谅(能用就行) 二: 本以为很容易就能做完,结果被采样速率的问题困扰了很久。 代码如下,使用2.5V基准源进行测试,结果在读ADS时经常出现读出0xFFFFFF的情况,只能忍住悲伤

    2024年02月12日
    浏览(48)
  • [HAL]STM32 SPI+DMA驱动WS2812

    该程序是纯手敲,非Cube生成!所有代码均注释。 源码在文章后面获取 Keyword: 单线通讯、归零码、Reset、RGB顺序 RGB一共有24bit位 -相当于驱动一个灯要24bit位 -驱动若干个灯要24* n bit位,通过Reset码决定数据终止(保持) 24bit位应该如何发送? 可见: 表示低电平需要 T0H和T0L的配

    2024年02月09日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包