最近时间,由于项目需求用到了AD7908的AD采集芯片,通过查阅其相关的技术手册之后,成功的实现了其AD采集的功能,下面分享一下我的一些经验。

AD7908是一个8位高速、低功耗、8通道的ADC芯片,可处理8MHz以上的输入频率,然而AD7918和AD7928分别是10位和12位的,具有更高的精度,但是这三款芯片之间的驱动方式以及芯片引脚的功能都是一样的,没什么区别!!!那么先来介绍一下AD7908芯片的使用。

一、硬件电路部分:

AD7908/18/28引脚说明
引脚标号 引脚名称 说明

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芯片相关推荐

  1. STM32模拟IIC协议驱动AD7991/AD7995/AD7999芯片

    STM32模拟IIC协议驱动AD7991/AD7995/AD7999芯片 AD7991/AD7995/AD7999是12位/10位/8位 4通道模拟输入的AD转换芯片 通信方式采用的是:I2C 芯片供 ...

  2. STM32通过SPI协议驱动OLED屏

    坚持就是胜利 一.SPI协议介绍 01 简介 02 SPI物理层 03 SPI基本通讯过程 二.OLED显示器介绍 01 简介 02 接口定义 03 与STM32接线图 三.汉字取模软件介绍 01 下 ...

  3. STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出

    STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出 STM32部分芯片具有12位DAC输出能力,要实现16位及以上DAC输出需要外挂DAC转换ASIC. D ...

  4. 【STM32】SPI协议通信详解

    目录 一.SPI协议简介 二.SPI物理层 三.SPI协议层 1.通讯的起始和停止信号 2.数据有效性 3.时钟信号的相位和极性(重点) 四.SPI 特性及架构(重点) 1.通信引脚 2.时钟控制逻辑 ...

  5. STM32的SPI模式读写FLASH芯片全面讲解

    SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,SCK,MOSI, ...

  6. spi 协议驱动设计

    spi 协议驱动设计 MISO– Master Input Slave Output,主设备数据输入,从设备数据输出. MOSI– Master Output Slave Input,主设备数据输出, ...

  7. 织女星开发板RISC-V核通过SPI协议驱动ARDUINO LCD模块(触屏)

    前言 之前写了一个通过SPI协议初始化LCD屏幕并显示字符串和图片的文章,这次再尝试一下触屏的功能. 准备工作 1,焊接织女星开发板J1,J2,J3,J4的双排母座,以便与LCD屏通信.前段时间免费申 ...

  8. STM32F103软件模拟SPI接口驱动ILI9486液晶屏

    STM32F103软件模拟SPI接口驱动ILI9486液晶屏 ILI9486的工作模式 ILI9486的SPI总线方式简介 ILI9486的3线SPI总线底层驱动配置步骤 ILI9486的工作模式 I ...

  9. STM32模拟SPI时序

      STM32模拟SPI时序的代码如下: #define MOSI_H GPIO_SetBits ( GPIOA, GPIO_Pin_7 ) #define MOSI_L GPIO_ResetBits ...

最新文章

  1. 别人以为搞AI的高大上,我却觉得自己是个骗子
  2. spring@Transactional注解事务不回滚不起作用无效的问题处理
  3. C语言实例第3期:在控制台打印出著名的杨辉三角
  4. 格式化json_在Spring Boot中格式化JSON日期
  5. 【web】Good ad ~
  6. Waymo真·无人车上路了!没司机的出租车推出在即 | 多图实拍
  7. topcoder srm 699 div1 -3
  8. Eprime Feedback state激活错误 其他报错
  9. 字体,字号与尺寸对应表
  10. 视频课程:CMOS模拟集成电路版图设计
  11. 不需要死记硬背,看一遍就能记住单词的意思,一起了解单词背后的有趣故事(6)
  12. 利用Druid Monitor做数据库连接异常排查
  13. Maven基础-认识Maven
  14. 石头剪子布(字符串)c语言,石头、剪刀、布程序,C语言模拟
  15. Redis缓存雪崩与解决方案
  16. mib browser读取飞塔mib文件的oid
  17. proteus元件图片_proteus元件对照表(经典详细)
  18. 机器学习笔记——模型选择与正则化
  19. ORACLE恢复truncate的表-转载
  20. 字体大宝库:15款免费英文艺术字体下载

热门文章

  1. 信息安全与技术——(十二)内容安全技术
  2. 10个基于python的的BBS论坛的源码
  3. easyExcel 数据导入
  4. 内生性问题的产生和解决办法
  5. 最新用友U8V15.0全产品培训视频教程合集
  6. SQL Server2000安装过程中出现“挂起”操作的解决方法
  7. 史上争议最大的一本Java书籍,到底值不值得我们一读?
  8. LeetCode 860. 柠檬水找零 (简单)greedy
  9. 扫描身份证自动识别ocr技术
  10. 纯css制作钟表(会走动)