项目进展(八)-编写代码,驱动ADS1285

这篇具有很好参考价值的文章主要介绍了项目进展(八)-编写代码,驱动ADS1285。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、代码

根据芯片的数据手册编写部分驱动,首先看部分引脚的波形:
DRDY:
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
CS:
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
首先在代码初始化时连续写入三个寄存器:

void WriteReg(uint8_t startAddr, uint8_t *regData, uint8_t number)
{
	uint8_t  i=0;// 循环写number+1次
	// 根据手册说明,若写入number个寄存器,则该位为number-1
	uint8_t subNumber = number-1; 
	regData[1] = subNumber;  
	// 拉低CS引脚
	ADC_X_CS_LOW; 
	// 循环写nuber+2次 
	for(i=0;i<number+2;i++){
		writeData = regData[i];
		HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeData,1,10);
	}
	// 拉高CS引脚
	ADC_X_CS_HIGH;  
}

三个寄存器初始化(随便写的):

	data[0] = 0x00;// 地址
  	data[1] = 0x02;// 个数(number-1,例如若写入的寄存器为3个,则该值为2)
  	data[2] = 0x00;// 寄存器1的值
	data[3] = 0x40;// 寄存器2的值
	data[4] = 0x08;// 寄存器3的值
	WriteReg(0x00,data,3);

以上代码都是根据数据手册写的,可以参考下图:
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
或者参考上一篇博客"项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分"中2.3节。
下面是波形图:
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
下面是放大后的数据波形图(注意,该芯片采用SPI第一种模式,CLK空闲时间为低,第一个上升沿采集数据):
①起始地址(data[0] = 0x00):
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
②要写入的寄存器个数(data[1] = 0x02):
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
③寄存器1(data[2] = 0x00):
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
④寄存器2(data[3] = 0x40):
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
⑤寄存器3(data[4] = 0x08):
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
不过目前读取数据时还存在问题,读取的数据不正确,还需要继续阅读数据手册,然后代码。
再次补充一点,前面代码写的有些错误,具体还是得看数据手册
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
项目进展(八)-编写代码,驱动ADS1285,Balance项目,SPI,STM32,嵌入式
目前还是有问题,需要后续继续查看手册,解决问题
驱动代码部分:
ADS1385.c文件:

#include "ADS1285.h"
#include "MCT8316.h"
#include "spi.h"
#include "math.h"

uint8_t readData[4] ={0x00};

uint8_t data[20] = {0x00};

int32_t readDataFinal = 0x0000000;

uint8_t readData1,readData2,readData3,readData4;

// 直接读取数据
void Direct_Read_Data(uint8_t * Data)
{
	int i = 0;
	uint8_t command;
	
	while(DRDY);
	
	ADC_X_CS_LOW;  // 拉低CS引脚
	
	
	for(i=0;i<4;i++)
	{
		HAL_SPI_Receive(&hspi2,(uint8_t *)&Data[i],1,50);// 读取数据
		
	}
	readDataFinal = (Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|(Data[3]);
	
	ADC_X_CS_HIGH;  // 拉低CS引脚
}

// 读取数据,指令--0x12
void ReadConversionData(uint8_t * Data,uint8_t command)
{
	int i = 0;
	ADC_X_CS_LOW;  // 拉低CS引脚
	
	HAL_SPI_Transmit(&hspi2,(uint8_t *)&command,1,10);

	for(i=0;i<4;i++)
	{
		HAL_SPI_Receive(&hspi2,(uint8_t *)&Data[i],1,10);// 读取数据
	}
	readDataFinal = (Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|(Data[3]);
	
	ADC_X_CS_HIGH;  // 拉低CS引脚	
	
}


// 写寄存器
uint8_t  writeData = 0;
void WriteReg(uint8_t *regData, uint8_t number)
{
	uint8_t  i=0;// 要写入的数据
	uint8_t subNumber = number-1;
	
	regData[1] = subNumber;  // 将代码个数写入
	
	ADC_X_CS_LOW;  // 拉低CS引脚
	
	for(i=0;i<number+2;i++){
		writeData = regData[i];
		HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeData,1,10);
	}
	ADC_X_CS_HIGH;  // 拉高CS引脚
}

// 读寄存器的值
void ReadReg(uint8_t const startAddr, uint8_t *regData, uint8_t number)
{
	uint8_t  writeReadData = 0,i;
	
	ADC_X_CS_LOW;  // 拉低CS引脚
	
	writeReadData = 0x20|startAddr;
	HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeReadData,1,10);
	
	writeReadData = number - 1;
	HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeReadData,1,10);
	
	// writeReadData = 0x00;
	for(i=0;i<number;i++){
		HAL_SPI_Receive(&hspi2,(uint8_t *)&writeReadData,1,10);// 读取数据
		regData[i] = writeReadData;
	}
	
	ADC_X_CS_HIGH;  // 拉高CS引脚
}
//  初始化:
void ADS1285_Init(uint8_t const startAddr,uint8_t number)
{
	data[0] = 0x40|startAddr;// 地址
  	data[1] = number - 1;// 写入的寄存器个数
 	data[2] = (0x00<<7)|PULSEMODE; // 寄存器1
	data[3] = (HIGHPOWER<<6)|(SPS1000<<3)|(LINEAR_PHS<<2)|FIR;
	data[4] = 0x08;
	WriteReg(data,3);
}

// 写入单个寄存器
void SingleByteCommand(uint8_t command)
{
	ADC_X_CS_LOW;   // 拉低CS引脚
	HAL_SPI_Transmit(&hspi2,(uint8_t *)&command,1,10);
	ADC_X_CS_HIGH;  // 拉高CS引脚
}

ADS1385.h文件:

#ifndef ADS1285_H
#define ADS1285_H

#include "stm32L4xx_hal.h"

// 寄存器地址
#define	ID_SYNC_REG				0x00
#define	CONFIG0_REG 				0x01
#define	CONFIG1_REG 				0x02
#define	HPF0_REG				    0x03
#define	HPF1_REG				    0x04
#define	OFFSET0_REG				0x05
#define	OFFSET1_REG				0x06
#define	OFFSET2_REG				0x07
#define	GAIN0_REG				  0x08
#define	GAIN1_REG				  0x09
#define	GAIN2_REG				  0x0A
#define	GPIO_REG				    0x0B
#define	SRC0_REG				    0x0C
#define	SRC1_REG				    0x0C

// 命令:
#define	WAKEUP				      0x00
#define	STANDBY 				    0x02
#define	SYNC 				        0x04
#define	ADS1285_RESET			0x06
#define	RDATA				        0x12
#define	OFSCAL				      0x60
#define	GANCAL				      0x61


//  个寄存器位:
#define  PULSEMODE          0
#define  CONTINUOUSMODE    1

#define  HIGHPOWER          0
#define  MIDPOWER           1
#define  LOWPOWER           2
#define  DePOWER            3

#define  SPS125             0
#define  SPS500             1
#define  SPS1000            2
#define  SPS2000            3
#define  SPS4000            4

#define  LINEAR_PHS         0
#define  SMIN_PHS           1


#define  SINC                 1
#define  FIR                  2
#define  FIR_IIR             3



/*=====================================模拟SPI定义=========================================*/
// #define  MOSI_H  HAL_GPIO_WritePin(GPIOE, motor_2_MOSI_Pin, GPIO_PIN_SET)
// #define  MOSI_L  HAL_GPIO_WritePin(GPIOE, motor_2_MOSI_Pin, GPIO_PIN_RESET)

// #define  SCK_H   HAL_GPIO_WritePin(GPIOE, motor_2_CLK_Pin, GPIO_PIN_SET)
// #define  SCK_L   HAL_GPIO_WritePin(GPIOE, motor_2_CLK_Pin, GPIO_PIN_RESET)

// #define  MISO    HAL_GPIO_ReadPin(GPIOE, motor_2_MISO_Pin)

// #define  SCK_H  HAL_GPIO_WritePin(GPIOE, motor_2_CLK_Pin, GPIO_PIN_SET)
// #define  SCK_L  HAL_GPIO_WritePin(GPIOE, motor_2_CLK_Pin, GPIO_PIN_RESET)

// ADS1285 DRDY引脚,若是该引脚为低电平,则表示数据转换完成
#define  DRDY  HAL_GPIO_ReadPin(ADS_X_DRDY_GPIO_Port, ADS_X_DRDY_Pin)

// CS引脚
#define  ADC_X_CS_LOW  HAL_GPIO_WritePin(ADC_X_CS_GPIO_Port, ADC_X_CS_Pin,0)
#define  ADC_X_CS_HIGH HAL_GPIO_WritePin(ADC_X_CS_GPIO_Port, ADC_X_CS_Pin,1)


extern uint8_t readData[4];

// 写入单个字节
void SingleByteCommand(uint8_t command);

// 直接读取数据,DRDY引脚拉点之后,将CS引脚拉低,然后读取数据
void Direct_Read_Data(uint8_t * Data);

// 读取数据
void ReadConversionData(uint8_t * Data,uint8_t command);

// 读取寄存器,穿入起始地址和读取寄存器的个数
void ReadReg(uint8_t startAddr, uint8_t *regData, uint8_t number);

// 写入寄存器,穿入起始地址和读取寄存器的个数
void WriteReg(uint8_t *regData, uint8_t number);

// 初始化
void ADS1285_Init(uint8_t const startAddr,uint8_t number);

// 唤醒ADS1285
//void WAKEUP(void);

 同步
//void SYNC(void);


#endif



二、往期回顾

项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等
项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误
项目进展(四)-双电机均可驱动,配置模拟SPI,调平仪功能初步实现!
项目进展(五)-修复PCB电路板,学习32位ADC芯片ADS1285
项目进展(六)-继续学习32位ADC芯片ADS1285
项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分文章来源地址https://www.toymoban.com/news/detail-727814.html

到了这里,关于项目进展(八)-编写代码,驱动ADS1285的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 平衡车Car_Balance(二)——电机驱动

    目录 序: 1.为什么电机需要驱动电路? 2.驱动电路方案有哪些?(针对直流有刷电机的驱动电路) 3.电机的调速原理(PWM) 一、H桥 二、L298N驱动 1.L298N芯片 2.芯片封装图 3.芯片内部结构图 4.芯片引脚图(中、英文版)及引脚说明 5. 逻辑真值表 6.基于L298N的典型电机驱动电路

    2024年02月12日
    浏览(65)
  • web3 React dapp中编写balance组件从redux取出并展示用户资产

    好啊 上文WEB3 在 React搭建的Dapp中通过redux全局获取并存储用户ETH与自定义token与交易所存储数量中 我们拿到了用户的一个本身 和 交易所token数量 并放进了redux中做了一个全局管理 然后 我们继续 先 起来ganache的一个模拟环境 然后 我们启动自己的项目 顺手发布一下合约 然后

    2024年02月05日
    浏览(37)
  • STM32 ADS1263驱动源码

    目录 简介: ADS1263.c: ADS1263.h: 测试结果:         ADS1262 和 ADS1263 (ADS126x) 是具有集成 PGA 、 电压基准和内部故障监视器的低噪声、低漂移、 38.4kSPS、Δ - Σ ADC 。 ADS1263 集成了一个 24 位辅助 Δ- Σ ADC , 适用于后台测量。这种支持传感器的 ADC 提供了一套完备的高精度、单芯片

    2024年04月13日
    浏览(30)
  • 树莓派BCM2835芯片手册导读以及IO口驱动代码编写

    驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 树莓派使用的是BCM2835CPU(博通),芯片手册做到哪一章就看哪一章。芯片提供了54个IO口,对应了树莓派的 BCM. 根据手册知gpio在第6章,我们来看第89页 GPFSEL0是pin0 ~ pin9的配置寄存器,GPFSEL1是pin10 ~ pin19的配置寄存器

    2024年01月18日
    浏览(29)
  • ADS8866 ADC转换芯片驱动调试

    目录 ADS8866 ADC转换芯片驱动调试 开发环境: ADS8866功能简介 硬件连接 SPI3的软件驱动 ADS8866通讯时序分析 ADS8866驱动 开发环境: ADS8866功能简介 https://download.csdn.net/download/qq_45143522/89216266 硬件连接 SPI3的软件驱动 ADS8866通讯时序分析 ADS8866驱动

    2024年04月25日
    浏览(31)
  • STM32驱动ADS1256串口输出-AD转换

    ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电

    2024年02月16日
    浏览(47)
  • STM32F103硬件SPI驱动ADS1256

    最近实验室有几个项目都需要用到高分辨率AD转换,于是就开始了ADS1256的开发。 新手,焊得丑,见谅(能用就行) 二: 本以为很容易就能做完,结果被采样速率的问题困扰了很久。 代码如下,使用2.5V基准源进行测试,结果在读ADS时经常出现读出0xFFFFFF的情况,只能忍住悲伤

    2024年02月12日
    浏览(71)
  • 树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

    首先我们要知道, 驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的。Description是寄存器的功能描述。GPFSEL0(寄存器名) GPIO Function Select 0(功能选择:输入或输出);GPSET0 (寄存器名) GPIO Pin

    2023年04月27日
    浏览(35)
  • Python小项目俄罗斯方块代码基于pygame编写

    python实习作业或者期末作业,俄罗斯方块,基于pygame编写 有很多小伙伴想要找一些小项目练练手,下面是我在闲暇时写的一个俄罗斯方块的一个小游戏,它是基于pygame板块来实现的 这是它的首页界面 然后这里是它的运行界面 总共有四个速度等级,分别对应四种不同的速度,

    2023年04月08日
    浏览(36)
  • 湖仓一体电商项目(八):业务实现之编写写入ODS层业务代码

    文章目录 业务实现之编写写入ODS层业务代码 一、代码逻辑和架构图

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包