STM32模拟SPI协议驱动AD7908芯片
最近时间,由于项目需求用到了AD7908的AD采集芯片,通过查阅其相关的技术手册之后,成功的实现了其AD采集的功能,下面分享一下我的一些经验。
AD7908是一个8位高速、低功耗、8通道的ADC芯片,可处理8MHz以上的输入频率,然而AD7918和AD7928分别是10位和12位的,具有更高的精度,但是这三款芯片之间的驱动方式以及芯片引脚的功能都是一样的,没什么区别!!!那么先来介绍一下AD7908芯片的使用。
一、硬件电路部分:
引脚标号 | 引脚名称 | 说明 |
---|---|---|
1 |
SCLK | 串行时钟 |
2 | DIN | 逻辑输入、向AD芯片写数据 |
3 | CS | 片选引脚。低电平有效 |
4、8、17、20 | AGND | 模拟地 |
5、6 |
AVDD |
模拟电源输入。(4.75V-5.25V) |
7 | REF | 基准电压输入,2.5V(±1%) |
16-9 | VIN0-VIN7 | 模拟输入通道0-7。(输入范围。RANGE位为1时:0-REF,0时:0-2*REF,详情参考下方寄存器的配置) |
18 | DOUT | 逻辑输出、AD芯片向外输出数据 |
19 | VDRIVE | 逻辑电源输入 |
芯片外围电路设计:
二、AD7908内部控制寄存器配置
AD7908的控制寄存器是12位的只写寄存器,在CS引脚为低电平的有效信号,且SCLK时钟信号位于下降沿的时候,通过芯片的DIN引脚向内部寄存器写入1位数据。但是完成整个12位寄存器的写入需要在CS为低电平有效状态下,且SLCK提供16个串行时钟,只有前12个时钟下降沿提供的信息才会被载入控制寄存器。
高位 低位
位 | 名称 | 功能 |
11 | WRITE | 写控制位。1:将后续11位数据写入寄存器;0:后续11位数据不写入寄存器,控制寄存器保持不变。 |
10 | SEQ | 配合下面的SHADOW位使用。 |
9 | 无关位 | 不管 |
8-6 | ADD2、ADD1、ADD0 | AD芯片的通道控制位,ADD2为高位 |
5、4 | PM1、PM0 | 电源管理位。一般设置为:1,1。 |
3 | SHADOW | 配合SEQ位使用。1,1:对通道0到通道(ADD2~ADD0)进行连续转换;0,0:仅对(ADD2~ADD0)通道进行转换。 |
2 | 无关位 | 不管 |
1 | RANGE | 选择AD通道的模拟输入范围。0:0V~2*REF;1:0V~REF。 |
0 | CODING | 0:DOUT输出二进制补码;1:DOUT输出标准二进制 |
三、AD7908时序图
根据时序图,可以看出AD7908芯片的DOUT引脚和DIN引脚是同时工作的。在CS引脚为低电平有效信号,且第一个SCLK下降沿时钟到来的时候,AD芯片通过DOUT向外部芯片输出第一个ZERO数据,然后外部芯片通过DIN向AD芯片内部输入WRITE数据,然后经过了16个串行时钟后,完成数据的输入和输出。
需要注意的是:
1)在第13-16个时钟周期的时候,DOUT引脚和DIN引脚上的数据都是无关数据,直接忽略;
2)并且必须要在完成16个串行周期之后CS引脚才能拉高,否则此次的转换无效。
3)此时刻写入的寄存器配置所得到的结果,将会在下一次的16个串行时钟输出。
AD7908DOUT引脚输出的数据中,前4位为:前置0+3个转换通道地址位;接着后面12位为:转换的8位结果+4个尾随0;
AD7918DOUT引脚输出的数据中,前4位为:前置0+3个转换通道地址位;接着后面12位为:转换的10位结果+2个尾随0;
AD7928DOUT引脚输出的数据中,前4位为:前置0+3个转换通道地址位;接着后面12位为:转换的12位结果。
四、STM32模拟SPI配置AD7908
ad7908.c文件
#include "ad7908.h"//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ad7908 代码
//修改日期:2019/9/26
//版本:V1.0
//版权所有,盗版必究。
//作者:GGber
//All rights reserved
//void AD7908_Init(void)//引脚初始化
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //PORTA时钟使能 片选引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // PA8 推挽GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_13; // PB13 15 推挽GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; // PA14 推挽GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);AD7908_CS = 1; //SPI AD7908不选中AD7908_CLK = 1; }uint16_t SPI_AD7908_Write_Control(uint8_t writeread, uint8_t Channel)//配置AD7908的内部寄存器
{u16 dat_16 = 0;if (writeread == 1) //writedat_16 = SPI_AD7908_WRITE(writeread) | \SPI_AD7908_ADD(Channel) | \SPI_AD7908_PM(3) | \SPI_AD7908_SEQ(1) | \SPI_AD7908_SHADOW(1) | \SPI_AD7908_RANGE(0) | \SPI_AD7908_CODING(1);else //readdat_16 = SPI_AD7908_WRITE(writeread) | \SPI_AD7908_ADD(Channel) | \SPI_AD7908_PM(3) | \SPI_AD7908_SEQ(1) | \SPI_AD7908_SHADOW(1) | \SPI_AD7908_RANGE(0) | \SPI_AD7908_CODING(1);dat_16 <<= 4;return dat_16;}uint16_t SPI_ReadWrite(uint16_t TxData)//向AD7908寄存器写值,并读取AD7908转换的数据
{uint16_t RxData = 0;int i = 0;AD7908_CS = 0;delay_us(1);for (i = 0; i < 16; i++){AD7908_MOSI = (TxData & 0x8000) ? 1 : 0;TxData <<= 1;delay_us(1);AD7908_CLK = 0; //SCLK引脚拉低,向AD芯片内部DIN写入第一个值RxData <<= 1;RxData |= AD7908_MISO; //读取AD芯片DOUT芯片的值,并保存到RxDatadelay_us(1);AD7908_CLK = 1;}delay_us(1);AD7908_CLK = 1;AD7908_CS = 1;return RxData >> 1;
}
ad7908.h文件
#ifndef __AD7908_H
#define __AD7908_H
#include "sys.h"
#include "delay.h"#define AD7908_CS PAout(8) //AD7908片选信号,低电平有效
#define AD7908_MISO PBin(14) //AD7908DOUT引脚
#define AD7908_MOSI PBout(15) //AD7908DIN引脚
#define AD7908_CLK PBout(13) //AD7908时钟信号#define SPI_AD7908_WRITE(n) (n<<11) // 0=read 1=write
#define SPI_AD7908_ADD(n) (n<<6) // n:0~7 读取通道
#define SPI_AD7908_PM(n) (n<<4) // n:0~3 0:无效,1:自动关断,2:完全关断,3:正常工作
#define SPI_AD7908_SEQ(n) (n<<10) // 配合SHADOW使用
#define SPI_AD7908_SHADOW(n) (n<<3) // 配合SEQ使用 00:序列未使用 11:连续通道序列连续转换
#define SPI_AD7908_RANGE(n) (n<<1) // 输入范围 0:0~2*Ref , 1:0~Ref
#define SPI_AD7908_CODING(n) (n<<0) // 0:二进制补码输出, 1:二进制输出void AD7908_Init(void);
uint16_t SPI_AD7908_Write_Control(uint8_t writeread, uint8_t Channel);
uint16_t SPI_ReadWrite(uint16_t TxData);
#endif
Main函数中AD7908初始化
AD7908_Init(); //AD采集初始化 SPI_ReadWrite(SPI_AD7908_Write_Control(1, 5)); //先向AD7908寄存器写初值,前6个通道进行AD转换
while(1)中读取AD7908芯片结果
for(i=0;i<6;i++)
{AD7908_Recive = SPI_ReadWrite(SPI_AD7908_Write_Control(0, 5));//获取电压值ADnum[(AD7908_Recive>>12)&0xFF]=((float)((AD7908_Recive >> 4) & 0xFF))*5/256;//得到电压值float型delay_ms(10);
}
STM32模拟SPI协议驱动AD7908芯片相关推荐
- STM32模拟IIC协议驱动AD7991/AD7995/AD7999芯片
STM32模拟IIC协议驱动AD7991/AD7995/AD7999芯片 AD7991/AD7995/AD7999是12位/10位/8位 4通道模拟输入的AD转换芯片 通信方式采用的是:I2C 芯片供 ...
- STM32通过SPI协议驱动OLED屏
坚持就是胜利 一.SPI协议介绍 01 简介 02 SPI物理层 03 SPI基本通讯过程 二.OLED显示器介绍 01 简介 02 接口定义 03 与STM32接线图 三.汉字取模软件介绍 01 下 ...
- STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出
STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出 STM32部分芯片具有12位DAC输出能力,要实现16位及以上DAC输出需要外挂DAC转换ASIC. D ...
- 【STM32】SPI协议通信详解
目录 一.SPI协议简介 二.SPI物理层 三.SPI协议层 1.通讯的起始和停止信号 2.数据有效性 3.时钟信号的相位和极性(重点) 四.SPI 特性及架构(重点) 1.通信引脚 2.时钟控制逻辑 ...
- STM32的SPI模式读写FLASH芯片全面讲解
SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,SCK,MOSI, ...
- spi 协议驱动设计
spi 协议驱动设计 MISO– Master Input Slave Output,主设备数据输入,从设备数据输出. MOSI– Master Output Slave Input,主设备数据输出, ...
- 织女星开发板RISC-V核通过SPI协议驱动ARDUINO LCD模块(触屏)
前言 之前写了一个通过SPI协议初始化LCD屏幕并显示字符串和图片的文章,这次再尝试一下触屏的功能. 准备工作 1,焊接织女星开发板J1,J2,J3,J4的双排母座,以便与LCD屏通信.前段时间免费申 ...
- STM32F103软件模拟SPI接口驱动ILI9486液晶屏
STM32F103软件模拟SPI接口驱动ILI9486液晶屏 ILI9486的工作模式 ILI9486的SPI总线方式简介 ILI9486的3线SPI总线底层驱动配置步骤 ILI9486的工作模式 I ...
- STM32模拟SPI时序
STM32模拟SPI时序的代码如下: #define MOSI_H GPIO_SetBits ( GPIOA, GPIO_Pin_7 ) #define MOSI_L GPIO_ResetBits ...
最新文章
- 别人以为搞AI的高大上,我却觉得自己是个骗子
- spring@Transactional注解事务不回滚不起作用无效的问题处理
- C语言实例第3期:在控制台打印出著名的杨辉三角
- 格式化json_在Spring Boot中格式化JSON日期
- 【web】Good ad ~
- Waymo真·无人车上路了!没司机的出租车推出在即 | 多图实拍
- topcoder srm 699 div1 -3
- Eprime Feedback state激活错误 其他报错
- 字体,字号与尺寸对应表
- 视频课程:CMOS模拟集成电路版图设计
- 不需要死记硬背,看一遍就能记住单词的意思,一起了解单词背后的有趣故事(6)
- 利用Druid Monitor做数据库连接异常排查
- Maven基础-认识Maven
- 石头剪子布(字符串)c语言,石头、剪刀、布程序,C语言模拟
- Redis缓存雪崩与解决方案
- mib browser读取飞塔mib文件的oid
- proteus元件图片_proteus元件对照表(经典详细)
- 机器学习笔记——模型选择与正则化
- ORACLE恢复truncate的表-转载
- 字体大宝库:15款免费英文艺术字体下载