ADS1259驱动程序

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输出功能
驱动不够完美,有问题请反馈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值