STM32——软件SPI控制AD7705[通俗易懂]

一、AD7705简介AD7705为差分输入的16位ADC,拥有两组差分输入通道。自带可编程增益,增益可在1到128调节。支持SPI接口。AD7705功能框图如图所示:AD7705的主要寄存器有通信寄存器(CommunicationRegister)、时钟寄存器(ClockRegister)、建立寄存器(SetupRegister)和数据寄存器(DataRegister)。在这些寄存器中,只有数据寄存器是16位的。通信寄存器负责寄存器寻址、读写控制…

大家好,又见面了,我是你们的朋友全栈君。

一、AD7705简介

    AD7705为差分输入的16位ADC,拥有两组差分输入通道。自带可编程增益,增益可在1到128调节。支持SPI接口。

    AD7705功能框图如图所示:

STM32——软件SPI控制AD7705[通俗易懂]

    AD7705的主要寄存器有通信寄存器(Communication Register)、时钟寄存器(Clock Register)、建立寄存器(Setup Register )和数据寄存器(Data Register)。在这些寄存器中,只有数据寄存器是16位的。

    通信寄存器负责寄存器寻址、读写控制、通道选择等。设置通信寄存器为0x20时,表示为写命令模式,并指向时钟寄存器,选择AIN1(+),AIN1(-)作为输入通道。

    时钟寄存器负责时钟分频、输出速率选择等。设置时钟寄存器为0x07时,表示不分频主时钟(由于使用的主时钟为2.4576MHz,不用分频,使用4.9152MHz作为主时钟时需要分频),输出速率为500Hz。AD7705的最大输出速率为500Hz,2ms输出一个有效数据,因此只试用与低频信号的采样。

    建立寄存器负责ADC模式、增益选择、缓冲输出、数字滤波等。设置建立寄存器为0x40时,表示设置增益为1,差分输入模式,无输出缓冲,无数字滤波。

二、AD7705控制

    AD7705的控制就是对上述的几个寄存器进行操作,以什么样的循序来操作呢?

    首先,对通信寄存器操作,设置通道,并选择时钟寄存器,作为下一个操作目标,通信寄存器命令执行完毕后就会连线到时钟寄存器,再输入操作时钟寄存器的命令。此时,AD7705的地址指针又指向了通信寄存器,因此,操作建立寄存器,就需要再次对通信寄存器操作,选择到建立寄存器,再对建立寄存器操作。这三个寄存器操作完成后,就完成了对AD7705的初始化,之后转换完成信号DRDY有效,发送读取数据命令,读取数据寄存器值。

    初始化:通信寄存器->时钟寄存器->通信寄存器->建立寄存器

    读取:等待DRDY为低电平->发送读取数据命令->读取数据

三、软件SPI

    AD7705读写SPI操作时序如图所示:

STM32——软件SPI控制AD7705[通俗易懂]

    从SPI时序中可以看到,SCLK在空闲时为高电平,且在SCLK的第二个边沿采样数据,因此此SPI的模式为CPOL=1,CPHA=1。

    软件SPI代码如下所示:

/*
软件SPI
CPOL = 1 ,空闲状态为高电平
CPHA = 1 ,在第二个边沿采样
*/
//AD7705写数据
void Writetoreg(uint8_t byteword)
{
	uint8_t i;
	
	AD7705_CS_Pin_RESET;       //片选
	for(i=0;i<8;i++)
	{
		if(byteword & 0x80)
			AD7705_DIN_Pin_SET;
		else 
			AD7705_DIN_Pin_RESET;
		byteword <<= 1;
		AD7705_SCLK_Pin_RESET;
		__NOP();                   //以72MHz系统时钟计算,大概延时时间在10ns-20ns
		__NOP();
		__NOP();
		__NOP();
		__NOP();
		AD7705_SCLK_Pin_SET;
		__NOP();
		__NOP();
		__NOP();
		__NOP();
		__NOP();
	}
	AD7705_SCLK_Pin_SET;       //空闲
	AD7705_DIN_Pin_SET;
	AD7705_CS_Pin_SET;
}

//AD7705读数据
uint16_t Read(void)
{
	uint8_t i;
	uint16_t data = 0x00;
	
	AD7705_CS_Pin_RESET;       //片选
	for(i=0;i<16;i++)
	{
		AD7705_SCLK_Pin_RESET;
		__NOP();
		__NOP();
		__NOP();
		__NOP();
		__NOP();
		AD7705_SCLK_Pin_SET;
		__NOP();
		__NOP();
		__NOP();
		__NOP();
		__NOP();
		data <<= 1;
		if( AD7705_DOUT_Pin_State )
			data |= 0x01;
	}
	AD7705_SCLK_Pin_SET;      //空闲
	AD7705_CS_Pin_SET;
	
	return data;
}

    代码中的__NOP()是为了满足AD7705对SPI时间间隔的要求,而增加的延时。

四、AD7705初始化与数据读取代码

    使用HAL函数库,代码如下所示:

/*
AD7705初始化
设置输入差分端口、时钟、增益等
*/
void AD7705_Init(void)
{
	uint8_t i;
	
	HAL_GPIO_WritePin(GPIOA,AD7705_CS_Pin|AD7705_SCLK_Pin,GPIO_PIN_SET);
	
	Writetoreg(0x20);      //向通信寄存器写入数据。选择下一个操作的寄存器为时钟寄存器,选择AIN1+/AIN1-数据通道
	Writetoreg(0x07);      //向时钟寄存器写入数据。接入的外部时钟为2.4576MHz,使能时钟,不对其分频,输出速率为500Hz
	Writetoreg(0x10);      //向通信寄存器写入数据。选择下一个操作的寄存器为配置寄存器,选择AIN1+/AIN1-数据通道
	Writetoreg(0x40);      //向配置寄存器写入数据。增益为1,差分模式,缓冲输出关闭
	
	HAL_Delay(1);
}

/*
读取AD7705输出的16为数据
*/
uint16_t AD7705_GetData(void)
{
	uint16_t AD7705_data;
	
	while( AD7705_DRDY_Pin_State );  //等待DRDY为低电平
	
	Writetoreg(0x38);     //向通信寄存器写入数据。定位到数据寄存器,并设置为读模式。
	AD7705_data = Read();
}  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128632.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是重载什么是覆盖_java覆盖和重载的关系

    什么是重载什么是覆盖_java覆盖和重载的关系java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限

    2022年8月2日
    6
  • sql的隐式转换_js强制转换和隐式转换

    sql的隐式转换_js强制转换和隐式转换什么叫做隐式转换? 显示转换,就是你使用转换函数进行操作。隐式转换,就是你不使用转换函数,默认就给转换了。比如定义一个int型的变量@a,然后给变量符值set@a=’2’,这个就会隐式转换,把字符转换成数字了。Oracle隐式转换1     Oracle 隐式转换           Oracle中对不同类型的处理具有显式类型转换(Explicit)和隐式类型转换(Implicit…

    2022年10月11日
    4
  • Linux三剑客 grep sed awk 详细使用方法

    Linux三剑客 grep sed awk 详细使用方法Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。在说这三个命令前我们要插入一个小插曲就是“正则表达式”。一、正则表达式所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实…

    2022年7月11日
    17
  • 2021JavaScript面试题(最新)不定时更新(2021.11.6更新)

    2021JavaScript面试题(最新)不定时更新(2021.11.6更新)介绍JavaScript的数据类型。1.有两种2.分两种展开说JavaScript的数据类型分为俩种,一种是基本数据类型,一种是引用数据类型1.基本数据类型js一共有六种基本数据类型,分别是Undefined、Null、Boolean、Number、String,还有在ES6中新增的Symbol类型。Symbol代表创建后独一无二且不可变的数据类型,它的出现我认为主要是为了解决可能出现的全局变量冲突的问题。2.引用数据类型引用数据类型统称为Object对象,主要包括对象

    2022年6月29日
    22
  • Windows下如何强制删除文件夹及文件的命令「建议收藏」

    Windows下如何强制删除文件夹及文件的命令「建议收藏」点击Win输入cmd以管理员身份打开输入命令:rd/s/q盘符:\某个文件夹(强制删除文件文件夹和文件夹内所有文件)例如rd/s/qF:\AdobePhotoshop\AdobePhotoshopCS6del/f/s/q盘符:\文件名(强制删除文件,文件名必须加文件后缀名)例如del/f/s/qF:\护眼精灵\huyanjingling.rarhttps://blog.csdn.net/hanhanwanghaha欢迎关注这个超级无敌可爱的人鸭,有什么问

    2022年6月10日
    358
  • 来测测你是不是一个合格的前端工程师

    来测测你是不是一个合格的前端工程师

    2021年9月10日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号