当前位置:网站首页>STM32——软件SPI控制AD7705[通俗易懂]
STM32——软件SPI控制AD7705[通俗易懂]
2022-07-31 12:49:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
一、AD7705简介
AD7705为差分输入的16位ADC,拥有两组差分输入通道。自带可编程增益,增益可在1到128调节。支持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操作时序如图所示:
从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.cn/128632.html原文链接:https://javaforall.cn
边栏推荐
猜你喜欢

架构实战营|模块8

深圳某游戏研发公司每个工位都装监控,网友:堪比“坐牢”!

Architecture Camp | Module 8

Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记

通过斐波那契数再谈函数递归2.0

AMBA APB学习记录(AMBA 2.0)

NPM 使用介绍

ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your

365天挑战LeetCode1000题——Day 044 最大层内元素和 层次遍历

chroot命令
随机推荐
Encapsulation of conversion between Json and objects (Gson)
关于我放弃考研这件事儿
基本语法(二)
【CPU设计实战】简单流水线CPU设计
查看Mysql数据库版本
SAP 电商云 Spartacus UI 和 Accelerator UI 里的 ASM 模块
SAP 电商云 Spartacus SSR Optimization Engine 几处 timeout 的执行顺序
集群的安全模式
docker部署完mysql无法连接
AMBA APB学习记录(AMBA 3/4)
Chrome开发自定义右键菜单实现快速跳转到指定页面
串的基本概念与操作
查看Oracle数据库的用户名和密码
The function of SQL GROUP BY dependence
[Shader] Shader official example [easy to understand]
centos7安装mysql5.7
0x80070570 The file or directory is damaged and cannot be deleted (how to delete 0x80070091)
PAT exam summary (exam experience)
纷享销客罗旭对话元气森林黄晓枫:零售数字化的终点不是创新,而是数据
立一个flag