一、代码
根据芯片的数据手册编写部分驱动,首先看部分引脚的波形:
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文件:文章来源:https://www.toymoban.com/news/detail-727814.html
#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模板网!