M5 ATOM Matrix 连接 ADS1256 采集卡 SPI 通信代码示例
#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;
}
原文地址: https://www.cveoy.top/t/topic/nCxO 著作权归作者所有。请勿转载和采集!