历史上的今天
返回首页

历史上的今天

今天是:2025年03月09日(星期日)

正在发生

2019年03月09日 | 基于STM32的ADS8684 驱动

2019-03-09 来源:eefocus

环境:STM32F103RC,主频 72MHz(外部晶振)或64MHz(HSI)


         普通IO口模拟spi


note:自动扫描模式下改完量程,必须要增加AUTO_RST_Mode()。


代码实现:


// ADS8684.c

 

 

#define ADS8684_GLOBALS

#include "ADS8684.h"

 

/********************************************************普通IO口模拟spi驱动********************************************/

/******************************************************

函数名称:ReadWriteByte

函数描述:IO口模拟spi读写8位数据,上升沿写数据,下降沿读数据

Calls:

Called by: 

输入参数:data:需要写入的数据

返回值:读到的8位数据

******************************************************/

static uint32_t ReadWriteByte(uint32_t data)

{

uint32_t status = 0;

uint32_t result = 0;

 

for (int number = 0; number < 8; number++)

{

if (data & (1 << (7 - number)))

{

ADS8684_SDI_H;

}

else

{

ADS8684_SDI_L;

}


ADS8684_CLK_H;

ADS8684_CLK_H;

ADS8684_CLK_H;

status = ADS8684_SD0_STATUS();

ADS8684_CLK_L;


if (status)

{

result |= 1;

}


result <<= 1;              

}

 

  return (result >> 1);

}

 

/***************************************************************************************************************/

 

 

/********************************************************ADS8684驱动********************************************/

/******************************************************

函数名称:WriteCommandReg

函数描述:写ADS8688命令寄存器

Calls:

Called by: 

输入参数:command:命令寄存器

返回值:无

******************************************************/

static void WriteCommandReg(uint32_t command)

{

ADS8684_CS_L;


ReadWriteByte((command & 0xff00) >> 8);

ReadWriteByte(command & 0xff);


ADS8684_CS_H;

}

 

/******************************************************

函数名称:AUTO_RST_Mode

函数描述:进入自动扫描模式

Calls:

Called by: 

输入参数:无

返回值:无

******************************************************/

void AUTO_RST_Mode(void)

{

WriteCommandReg(AUTO_RST);

}

 

/******************************************************

函数名称:Write_Program_Register

函数描述:Program Register写操作

Calls:

Called by: 

输入参数:Addr:Program Register地址

data:写入Program Register的值

返回值:无

******************************************************/

static void Write_Program_Register(uint32_t Addr, uint32_t data)

{

ADS8684_CS_L;

ReadWriteByte((Addr << 1) | WRITE);

ReadWriteByte(data);

ADS8684_CS_H;

}

 

/******************************************************

函数名称:Read_Program_Register

函数描述:Program Register读操作

Calls:

Called by: 

输入参数:Addr:Program Register地址

返回值:Program Register的值

******************************************************/

uint32_t Read_Program_Register(uint32_t Addr)

{

uint32_t data = 0;


ADS8684_CS_L;


ReadWriteByte((Addr) << 1 | READ);

data = ReadWriteByte(0XFF);

data = ReadWriteByte(0XFF);


ADS8684_CS_H;


return data;

}

 

/******************************************************

函数名称:Set_Auto_Scan_Sequence

函数描述:设置自动扫描序列通道

Calls:

Called by: 

输入参数:seq:需要设置Auto-Scan Sequence Enable Register的值

返回值:无

******************************************************/

void Set_Auto_Scan_Sequence(uint32_t seq)

{

Write_Program_Register(AUTO_SEQ_EN, seq);

}

 

/******************************************************

函数名称:Set_CH_Range_Select

函数描述:设置各个通道的范围

Calls:

Called by: 

输入参数:ch:通道输入范围寄存器地址

  range:量程范围

返回值:无

******************************************************/

void Set_CH_Range_Select(uint32_t ch, uint32_t range) 

{

Write_Program_Register(ch, range);

}

/***************************************************************************************************************/

 

/******************************************************

函数名称:Get_AUTO_RST_Mode_Data

函数描述:读取扫描通道序列的AD转换数据

Calls:

Called by: 

输入参数:pADCData:传入gUADCData.ChADCData

chNum:总通道数

返回值:无

******************************************************/

static void Get_AUTO_RST_Mode_Data(uint16_t* pADCData, uint32_t chNum)

{

uint32_t datal = 0, datah = 0;


for (uint32_t i = 0; i < chNum; i++)

{

ADS8684_CS_L;


ReadWriteByte(0X00);

ReadWriteByte(0X00);

datah = ReadWriteByte(0XFF);

datal = ReadWriteByte(0XFF);


ADS8684_CS_H;


*(pADCData + i) = (datah << 8) | datal; //高位在前,低位在后

}

}

 

/******************************************************

函数名称:Init_ADS8684

函数描述:ADS8684的初始化代码

Calls:

Called by: main

输入参数:无

返回值:TRUE:初始化成功;FALSE:初始化失败

******************************************************/

uint32_t Init_ADS8684(void)

{

Set_Auto_Scan_Sequence(0x0F);// 通道1~通道4


if (Read_Program_Register(AUTO_SEQ_EN) != 0x0F)

{

return FALSE;

}


AUTO_RST_Mode(); // 默认通道1~通道4的量程为-10~10V

return TRUE;

}

// ADS8684.h

#ifndef __ADS8684_H

#define __ADS8684_H

 

#ifdef ADS8684_GLOBALS

#define ADS8684_EXT

#else

#define ADS8684_EXT extern

#endif

 

#include "global.h"

 

/**************************************ADS8684寄存器********************************************/

//Command Register 

#define NO_OP 0X0000

#define STDBY 0X8200

#define PWR_DN  0X8300

#define RST 0X8500

#define AUTO_RST 0XA000

#define MAN_Ch_0 0XC000

#define MAN_CH_1 0XC400

#define MAN_Ch_2 0XC800

#define MAN_Ch_3 0XCC00

#define MAN_Ch_4 0XD000

#define MAN_Ch_5 0XD400

#define MAN_Ch_6 0XD800

#define MAN_Ch_7 0XDC00

#define MAN_AUX 0XE000

 

//Program Register

#define AUTO_SEQ_EN 0X01

#define Channel Power Down 0X02

#define Feature Select 0X03

 

#define Channel_0_Input_Range 0X05

#define Channel_1_Input_Range 0X06

#define Channel_2_Input_Range 0X07

#define Channel_3_Input_Range 0X08

#define Channel_4_Input_Range 0X09

#define Channel_5_Input_Range 0X0A

#define Channel_6_Input_Range 0X0B

#define Channel_7_Input_Range 0X0C

 

#define Ch_0_Hysteresis 0X15

#define Ch_0_High_Threshold_MSB 0X16

#define Ch_0_High_Threshold_LSB 0X17

#define Ch_0_Low_Threshold_MSB 0X18

#define Ch_0_Low_Threshold_LSB 0X19

 

#define Ch_7_Hysteresis 0X38

#define Ch_7_High_Threshold_MSB 0X39

#define Ch_7_High_Threshold_LSB 0X3A

#define Ch_7_Low_Threshold_MSB 0X3B

#define Ch_7_Low_Threshold_LSB 0X3C

 

#define Command_Read_Back 0X3F

 

#define WRITE 1

#define READ 0

 

#define CH7_EN  0X80

#define CH6_EN  0X40

#define CH5_EN  0X20

#define CH4_EN  0X10

#define CH3_EN  0X08

#define CH2_EN  0X04

#define CH1_EN  0X02

#define CH0_EN  0X01

 

#define CH7_PD  0X80

#define CH6_PD  0X40

#define CH5_PD  0X20

#define CH4_PD  0X10

#define CH3_PD  0X08

#define CH2_PD  0X04

#define CH1_PD  0X02

#define CH0_PD  0X01

 

#define VREF_25_25 0X00

#define VREF_125_125 0X01

#define VREF_0625_0625 0X02

#define VREF_0_25 0X05

#define VREF_0_125 0X06

/***********************************************************************************************/

推荐阅读

史海拾趣

方向电子公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的关键设备,具有高度的专业性和广泛的应用性。从广义上讲,凡是能与电视机连接并处理音视频信号的网络终端设备均可视为机顶盒。它不仅能够接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,还能通过内置的解码器将这些信号转换为电视机可识别的格式,从而呈现出高清乃至4K的超高清画质,大大提升了观看体验。

机顶盒不仅限于基本的电视信号接收功能,还集成了多种增值服务。例如,它提供电子节目指南,让用户轻松查找和预约节目;支持因特网网页浏览,实现网络购物、在线视频观看、游戏娱乐等多元化互动体验。随着智能化技术的发展,现代机顶盒还融入了语音助手、智能推荐等功能,进一步提升了用户的操作便捷性和内容个性化程度。

在技术层面,机顶盒的发展日新月异,不断向高清化、智能化方向迈进。5G技术的应用更是为机顶盒带来了更快的传输速度和更低的延迟,为用户提供了更为流畅的观影体验。此外,虚拟现实和增强现实技术的融入,也为机顶盒的未来发展打开了新的想象空间,将为用户带来更为沉浸式和互动式的观影享受。

综上所述,机顶盒作为现代家庭娱乐的重要组成部分,不仅极大地丰富了人们的电视观看体验,还通过不断的技术创新和服务升级,满足着用户日益多样化的需求。

DURAKOOL公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,DURAKOOL公司始终保持着对创新的追求。公司不断投入研发资源,推动产品升级和技术进步。同时,公司也关注行业趋势和未来发展,积极探索新的业务领域和市场机会。展望未来,DURAKOOL将继续致力于成为全球电子行业的领先者。

请注意,以上故事均为虚构,旨在提供与DURAKOOL公司发展相关的故事概要。如需了解更多关于DURAKOOL公司的详细信息,建议查阅相关报道或公司官方资料。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司注重与高校和研究机构的合作,通过产学研合作的方式推动技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展无人机技术的研发和应用研究。这种合作模式不仅为公司提供了源源不断的技术支持和人才储备,还推动了整个电子行业的技术进步。

Auris公司的发展小趣事

在不断追求技术创新的道路上,Auris公司并未止步。近年来,该公司正在积极研发柔性机器人技术,这种技术有望在治疗喉咙、肺和肠胃疾病方面发挥重要作用。柔性机器人的研发不仅展示了Auris在技术创新方面的持续努力,也为其在未来的医疗市场中抢占先机提供了有力支持。

这五个故事展示了Auris公司在电子行业中的发展历程,从创始人的科技愿景到技术突破获得认可,再到与强生的合作以及柔性机器人的研发,每一步都体现了Auris对于技术创新和市场拓展的不懈追求。这些事实性的故事不仅展现了Auris公司的成长轨迹,也反映了电子行业中技术创新和市场竞争的激烈态势。

AMD(超微)公司的发展小趣事

在Auris公司的发展历程中,2017年夏天的一次收购事件具有重要意义。Auris以8000万美元的价格收购了Hansen Medical,这是一家专门开发工具来操控导管的公司。这次收购不仅增强了Auris在手术机器人领域的技术实力,也为其后续的产品研发和市场拓展提供了更多可能性。

Delock公司的发展小趣事

为了保持技术的领先地位,Delock公司非常重视与高校、研究机构的研发合作。公司先后与多所知名大学和研究机构建立了紧密的合作关系,共同开展电子连接技术的研发和创新。这些合作不仅为Delock公司带来了源源不断的技术创新成果,也为公司培养了一批高素质的研发人才。通过与高校、研究机构的紧密合作,Delock公司在电子连接技术领域始终保持领先地位。

问答坊 | AI 解惑

干扰I2C总线的几种情况

新型彩电很多机型已经采用IIC总线控制方式。IC总线受干扰,就会产生许多无法用常规分析硬件损坏的故障解释。所以,如遇到综合性的故障问题,或无法理解的问题,可试着用IC总线受干扰的方式来进行分析。 1. 电源输出的直流电压滤波不良,散射的 ...…

查看全部问答>

投票啦!模拟电路DIY

为了促进大家对模拟电路的学习和提升,模拟板块准备开始一系列的DIY活动,以上的的5个题目供大家来选择,可以选择多个,也可以选择一个,根据大家的投票会决定先开始某一个的DIY,当然如果大家觉得有必要,我们也可以一个一个得来DIY。大家还有什么 ...…

查看全部问答>

亚马逊统计显示:电子书销售达纸质书1.8倍

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 据外电报道,美国亚马逊公司近日宣布,该公司6月适用于电子书阅读器KINDLE的电子书销量达到了纸质图书的1.8倍。 亚马逊没有透露具体销量。4~6月的电子图书销量为纸质图书的1.4倍。今年上半年 ...…

查看全部问答>

vmware上运行vxworks,按网上说的做,>make CPU="PENTIUM" tool="gnu" ln97xe 提示make 不是内部或外部命令

而在path里,已经添加了make的位置了啊:\\Tornado\\target\\config\\82559? 把makefile ln97xEnd.c拷贝到\\Tornado\\target\\config\\82559文件夹下,make,又提示vxrm不是。。。…

查看全部问答>

如何添加自己的网卡驱动 ?

WINCE4.2没有自带我的目标板子上的网卡驱动,如果我具备这个网卡的驱动C源代码,那么我如何把这个驱动加载到WINCE PB中去? 谢谢…

查看全部问答>

AT指令是基于什么开发出来的

就是我想通过3G的网络发送自己的控制命令,但貌似AT指令不能满足,哪位高手解答一下啊!…

查看全部问答>

一个基于WLAN的嵌入式系统开发项目外包

一个基于无线局域网的远程控制系统项目,欢迎个人、团队参与,详细情况请参见以下说明 项目说明: 该项目由个人操作终端和远程接收控制终端构成,可利用ARM7或ARM9在linux下完成。 要求: 该项目要求开发者(或团队)熟悉ARM CPU, 熟悉无 ...…

查看全部问答>

microchip提供的ZIGBEE2006协议不完全,大家不要上当!

microchip提供的ZIGBEE2006协议不完全,大家不要上当!我现在好麻烦啊,不行只能该用TI的了。当时因为他们提供源码,没想到后面的麻烦不小。…

查看全部问答>

MSP430学习计划

我是理工科大三学习生,对手持仪器方面比较感兴趣,故借贵论坛申请一块板子、、、…

查看全部问答>