#ifndef ADS1256_H #define ADS1256_H

#include <stdint.h>

#define ADS1256_DRAEY_PIN 22

#define ADS1256_CMD_WAKEUP 0x00 #define ADS1256_CMD_RDATA 0x01 #define ADS1256_CMD_RDATAC 0x03 #define ADS1256_CMD_SDATAC 0x0F #define ADS1256_CMD_RREG 0x10 #define ADS1256_CMD_WREG 0x50 #define ADS1256_CMD_SELFCAL 0xF0 #define ADS1256_CMD_SELFOCAL 0xF1 #define ADS1256_CMD_SELFGCAL 0xF2 #define ADS1256_CMD_SYSOCAL 0xF3 #define ADS1256_CMD_SYSGCAL 0xF4 #define ADS1256_CMD_SYNC 0xFC #define ADS1256_CMD_STANDBY 0xFD #define ADS1256_CMD_RESET 0xFE

#define ADS1256_MUXP_AIN0 0x00 #define ADS1256_MUXP_AIN1 0x10 #define ADS1256_MUXP_AIN2 0x20 #define ADS1256_MUXP_AIN3 0x30 #define ADS1256_MUXP_AIN4 0x40 #define ADS1256_MUXP_AIN5 0x50 #define ADS1256_MUXP_AIN6 0x60 #define ADS1256_MUXP_AIN7 0x70

#define ADS1256_MUXN_AIN0 0x00 #define ADS1256_MUXN_AIN1 0x01 #define ADS1256_MUXN_AIN2 0x02 #define ADS1256_MUXN_AIN3 0x03 #define ADS1256_MUXN_AIN4 0x04 #define ADS1256_MUXN_AIN5 0x05 #define ADS1256_MUXN_AIN6 0x06 #define ADS1256_MUXN_AIN7 0x07

#define ADS1256_GAIN_1 0x00 #define ADS1256_GAIN_2 0x01 #define ADS1256_GAIN_4 0x02 #define ADS1256_GAIN_8 0x03 #define ADS1256_GAIN_16 0x04 #define ADS1256_GAIN_32 0x05 #define ADS1256_GAIN_64 0x06

void ADS1256_Init(void); void ADS1256_SetPGA(uint8_t pga); void ADS1256_SetChannel(uint8_t channel); void ADS1256_StartScan(void); int32_t ADS1256_ReadData(void);

#endif

#include <SPI.h>
#include 'ADS1256.h'

#define ADS1256_CS_PIN 26

SPIClass ADS1256_SPI(HSPI);

void ADS1256_SendCmd(uint8_t cmd)
{
    digitalWrite(ADS1256_CS_PIN, LOW);
    ADS1256_SPI.transfer(cmd);
    digitalWrite(ADS1256_CS_PIN, HIGH);
}

void ADS1256_WriteReg(uint8_t reg, uint8_t data)
{
    digitalWrite(ADS1256_CS_PIN, LOW);
    ADS1256_SPI.transfer(ADS1256_CMD_WREG | reg);
    ADS1256_SPI.transfer(0x00);
    ADS1256_SPI.transfer(data);
    digitalWrite(ADS1256_CS_PIN, HIGH);
}

uint8_t ADS1256_ReadReg(uint8_t reg)
{
    uint8_t result;
    digitalWrite(ADS1256_CS_PIN, LOW);
    ADS1256_SPI.transfer(ADS1256_CMD_RREG | reg);
    ADS1256_SPI.transfer(0x00);
    result = ADS1256_SPI.transfer(0x00);
    digitalWrite(ADS1256_CS_PIN, HIGH);
    return result;
}

void ADS1256_Reset(void)
{
    ADS1256_SendCmd(ADS1256_CMD_RESET);
    delay(10);
}

void ADS1256_WaitDRDY(void)
{
    while (digitalRead(ADS1256_DRAEY_PIN) == 1);
}

void ADS1256_Init(void)
{
    pinMode(ADS1256_CS_PIN, OUTPUT);
    digitalWrite(ADS1256_CS_PIN, HIGH);
    pinMode(ADS1256_DRAEY_PIN, INPUT);
    ADS1256_SPI.begin();
    ADS1256_SPI.beginTransaction(SPISettings(5000000, MSBFIRST, SPI_MODE1));
    ADS1256_Reset();
    ADS1256_WriteReg(0x01, 0x20);
    ADS1256_WriteReg(0x02, 0x00);
    ADS1256_WriteReg(0x03, 0x80);
    ADS1256_SetPGA(ADS1256_GAIN_1);
}

void ADS1256_SetPGA(uint8_t pga)
{
    uint8_t reg = ADS1256_ReadReg(0x01);
    reg &= 0xF8;
    reg |= pga;
    ADS1256_WriteReg(0x01, reg);
}

void ADS1256_SetChannel(uint8_t channel)
{
    uint8_t reg = ADS1256_ReadReg(0x01);
    reg &= 0xE3;
    reg |= (channel << 2);
    ADS1256_WriteReg(0x01, reg);
}

void ADS1256_StartScan(void)
{
    ADS1256_SendCmd(ADS1256_CMD_SDATAC);
    ADS1256_SendCmd(ADS1256_CMD_SELFCAL);
    ADS1256_SendCmd(ADS1256_CMD_SYNC);
    ADS1256_SendCmd(ADS1256_CMD_WAKEUP);
    ADS1256_SetChannel(0);
    ADS1256_SendCmd(ADS1256_CMD_RDATAC);
}

int32_t ADS1256_ReadData(void)
{
    ADS1256_WaitDRDY();
    uint8_t data[3];
    digitalWrite(ADS1256_CS_PIN, LOW);
    ADS1256_SPI.transfer(ADS1256_CMD_RDATA);
    data[0] = ADS1256_SPI.transfer(0x00);
    data[1] = ADS1256_SPI.transfer(0x00);
    data[2] = ADS1256_SPI.transfer(0x00);
    digitalWrite(ADS1256_CS_PIN, HIGH);
    int32_t result = ((int32_t)data[0] << 16) | ((int32_t)data[1] << 8) | (int32_t)data[2];
    if (result & 0x800000)
    {
        result |= 0xFF000000;
    }
    return result;
}
M5 ATOM Matrix 连接 ADS1256 采集卡 SPI 通信代码示例

原文地址: https://www.cveoy.top/t/topic/nCxO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录