ADS1259 是TI推出的一款24位高速ADC芯片,主要使用SPI接口与MCU通讯,本驱动已测试通过,现和大家分享一下。
技术文档参考
数据手册中软件相关重要部分摘录:
驱动代码
头文件:
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
/* public define ------------------------------------------------------------*/
//命令
#define ADS1259_CMD_WAKEUP 0x02
#define ADS1259_CMD_SLEEP 0x04
#define ADS1259_CMD_RESET 0x06
#define ADS1259_CMD_SRART 0x08 //START conversion
#define ADS1259_CMD_STOP 0x0A
#define ADS1259_CMD_RDATAC 0x10 //Set Read Data Continuous mode
#define ADS1259_CMD_SDATAC 0x11 //Stop Read Data Continuous mode
#define ADS1259_CMD_RDATA 0x12 //Read data by opcode
//Read nnnn register at address rrrr, 0010 rrrr (20h + 0000 rrrr), 0000 nnnn (00h + nnnn)
#define ADS1259_CMD_RREG 0x20
//Write nnnn register at address rrrr, 0100 rrrr (40h + 0000 rrrr), 0000 nnnn (00h + nnnn)
#define ADS1259_CMD_WREG 0x40
#define ADS1259_CMD_OFSCAL 0x18 //Offset calibration
#define ADS1259_CMD_GANCAL 0x19 //Gain calibration
//寄存器地址
#define ADS1259_REG_CFG0 0x00
#define ADS1259_REG_CFG1 0x01
#define ADS1259_REG_CFG2 0x02
#define ADS1259_REG_OFC0 0x03
#define ADS1259_REG_OFC1 0x04
#define ADS1259_REG_OFC2 0x05
#define ADS1259_REG_FSC0 0x06
#define ADS1259_REG_FSC1 0x07
#define ADS1259_REG_FSC2 0x08
//寄存器定义
//内部基准源 Bit 2
#define REG_CFG0_RBIAS_DISABLE 0x00
#define REG_CFG0_RBIAS_ENABLE 0x04
//參考基准 Bit 3
#define REG_CFG1_REF_INT 0x00
#define REG_CFG1_REF_EXT 0x08
//转换速率 Bits 2-0
#define REG_CFG2_SPS_10 0x00
#define REG_CFG2_SPS_16 0x01
#define REG_CFG2_SPS_50 0x02
#define REG_CFG2_SPS_60 0x03
#define REG_CFG2_SPS_400 0x04
#define REG_CFG2_SPS_1200 0x05
#define REG_CFG2_SPS_3600 0x06
#define REG_CFG2_SPS_14400 0x07
/* public typedef -----------------------------------------------------------*/
/* public constants --------------------------------------------------------*/
/* public variables ---------------------------------------------------------*/
/* public functions prototypes ---------------------------------------------*/
void Ads1259SendCmd(uint8_t Cmd);
void Ads1259WriteReg(uint8_t RegAddr,uint8_t RegNum,uint8_t *pBuf);
void Ads1259ReadReg(uint8_t RegAddr,uint8_t RegNum,uint8_t *pBuf);
void Ads1259SetSPS(uint8_t Val);
bool IsAds1259DataReady(void);
int32_t Ads1259ReadData(void);
void Ads1259Init(uint8_t CfgSps);
源文件:
/* Includes ------------------------------------------------------------------*/
#include "ads1259.h"
#include <string.h>
/* Private define ------------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
/* Private constants --------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* public constants --------------------------------------------------------*/
/* public variables ---------------------------------------------------------*/
/* public function -----------------------------------------------*/
void Ads1259SendCmd(uint8_t Cmd)
{
SpiSend(&Cmd,1);
}
void Ads1259WriteReg(uint8_t RegAddr,uint8_t RegNum,uint8_t *pBuf)
{
uint8_t aBuf[12] = {0};
aBuf[0] = ADS1259_CMD_WREG|RegAddr;
aBuf[1] = 0x0F & (RegNum - 1);
for(uint8_t i = 0; i < (RegNum & 0x0F) ; i++)
{
aBuf[2 + i] = pBuf[i];
}
SpiSend(aBuf,2 + RegNum);
}
void Ads1259ReadReg(uint8_t RegAddr,uint8_t RegNum,uint8_t *pBuf)
{
uint8_t aBuf[2] = {0};
aBuf[0] = ADS1259_CMD_RREG|RegAddr;
aBuf[1] = 0x0F & (RegNum - 1);
SpiSend(aBuf,2);
SpiRecv(pBuf,RegNum & 0x0F);
}
bool IsAds1259DataReady(void)
{
return (GetInputLevel(E_IO_IN_IDX_AD_DRDY) < 1);
}
int32_t Ads1259ReadData(void)
{
uint8_t aBuf[3] = {0};
SpiRecv(aBuf,3);
int32_t Data = ((aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8)) >> 8;
return Data;
}
void Ads1259Init(uint8_t CfgSps)
{
DebugPrintf("%s\n",__func__);
BspSpiInit(); //Ads1259最高4MHz,
SetOutputLevel(E_IO_OUT_IDX_AD_RESET);
ResetOutputLevel(E_IO_OUT_IDX_AD_START);
ResetOutputLevel(E_IO_OUT_IDX_AD_RESET);//AD复位
delay1ms(1);
SetOutputLevel(E_IO_OUT_IDX_AD_RESET);
delay1ms(10);
Ads1259SendCmd(ADS1259_CMD_SDATAC);
uint8_t aRegWriteBuf[3] ={REG_CFG0_RBIAS_ENABLE,REG_CFG1_REF_INT,CfgSps}; //内部參考
//uint8_t aRegWriteBuf[3] ={REG_CFG0_RBIAS_DISABLE,REG_CFG1_REF_EXT,CfgSps}; //外部參考
Ads1259WriteReg(ADS1259_REG_CFG0,sizeof(aRegWriteBuf),aRegWriteBuf);
DebugPrintf("RegWriteBuf:\n");
DebugHexPrint(aRegWriteBuf,sizeof(aRegWriteBuf));
#if 0
uint8_t aRegReadBuf[3] ={0};
Ads1259ReadReg(ADS1259_REG_CFG0,sizeof(aRegReadBuf),aRegReadBuf);
DebugPrintf("RegReadBuf:\n");
DebugHexPrint(aRegReadBuf,sizeof(aRegReadBuf));
#endif
SetOutputLevel(E_IO_OUT_IDX_AD_START);
Ads1259SendCmd(ADS1259_CMD_RDATAC);
}
void Ads1259SetSPS(uint8_t Val)
{
ResetOutputLevel(E_IO_OUT_IDX_AD_START);
Ads1259SendCmd(ADS1259_CMD_SDATAC);
uint8_t Temp = Val&0x0F;
Ads1259WriteReg(ADS1259_REG_CFG2,1,&Temp);
SetOutputLevel(E_IO_OUT_IDX_AD_START);
Ads1259SendCmd(ADS1259_CMD_RDATAC);
}
小结
提示:需要自己实现SPI读写和IO输出功能
驱动不够完美,有问题请反馈。