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

一、代码

根据芯片的数据手册编写部分驱动,首先看部分引脚的波形:
DRDY:
在这里插入图片描述
CS:
在这里插入图片描述
首先在代码初始化时连续写入三个寄存器:

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及其外围电路,学习芯片的SPI部分"中2.3节。
下面是波形图:
在这里插入图片描述
下面是放大后的数据波形图(注意,该芯片采用SPI第一种模式,CLK空闲时间为低,第一个上升沿采集数据):
①起始地址(data[0] = 0x00):
在这里插入图片描述
②要写入的寄存器个数(data[1] = 0x02):
在这里插入图片描述
③寄存器1(data[2] = 0x00):
在这里插入图片描述
④寄存器2(data[3] = 0x40):
在这里插入图片描述
⑤寄存器3(data[4] = 0x08):
在这里插入图片描述
不过目前读取数据时还存在问题,读取的数据不正确,还需要继续阅读数据手册,然后代码。
再次补充一点,前面代码写的有些错误,具体还是得看数据手册
在这里插入图片描述
在这里插入图片描述
目前还是有问题,需要后续继续查看手册,解决问题
驱动代码部分:
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部分

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致虚守静~归根复命

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值