Hi all,
I am working on ADS1294 . I am unable to get proper output for test inputs. The SPI communication working properly and the programming environment has three modules
- Device Initialization.
- ADS Configuration,
- Read data from the Slave.
The register mapping configuration is
- CONFIG1 = 0x86
- CONFIG2 = 0x10
- CONFIG3 = 0xC0
- CH1SET = 0x65
- CH2SET = 0x61
- CH3SET = 0x61
- CH4SET = 0x61
Program:
#include "SPI.h" // necessary library
#define drdy 8
#define start 9
#define ss 10
#define mosi 11
#define miso 12
#define sclk 13
uint8_t serialBytes[200];
void setup()
{
Serial.begin(115200);
Serial.println("Starting process");
pinMode(drdy, INPUT);
pinMode(start, OUTPUT);
pinMode(ss, OUTPUT);
pinMode(mosi, OUTPUT);
pinMode(miso, INPUT);
pinMode(sclk, OUTPUT);
digitalWrite(start, LOW);
// SPI.setClockDivider(4);
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE1));
deviceInit();
adsConfig();
startRdata();
Serial.println("Configuration done!!!");
}
void startRdata() {
digitalWrite(start, HIGH);
delayMicroseconds(5);
digitalWrite(ss, LOW);
delayMicroseconds(5);
SPI.transfer(0x10); // send value (0~255)
delayMicroseconds(5);
// digitalWrite(ss, HIGH);
}
void adsConfig() {
//writeReg(0x14, 0);
writeReg(0x03, 0x80 | 0x40);
//FOR RLD: Power up the internal reference and wait for it to settle
// adc_wreg(CONFIG3, RLDREF_INT | PD_RLD | PD_REFBUF | VREF_4V | CONFIG3_const);
// delay(150);
// adc_wreg(RLD_SENSP, 0x01); // only use channel IN1P and IN1N
// adc_wreg(RLD_SENSN, 0x01); // for the RLD Measurement
writeReg(0x01, 0x80 |0x04 | 0x02);
writeReg(0x02, 0x10); // generate internal test signals
// Set the first two channels to input signal
writeReg(0x05, 0x65); // Test signal
writeReg(0x06, 0x61); // Input shorted
writeReg(0x07, 0x61); // Input shorted
writeReg(0x08, 0x61); // Input shorted
}
void deviceInit() {
delay(100);
spiSendData(0x11);
delay(500);
spiSendData(0x0A);
delay(50);
spiSendData(0x20);
spiSendData(0x00);
int a = readReg(0x00);
if (a == 144) {
Serial.println("Device detected successfully");
} else {
Serial.println("Device not detected");
while (1) {
}
}
}
int spiRecvData() {
digitalWrite(ss, LOW);
delayMicroseconds(5);
int a = SPI.transfer(0x00); // send value (0~255)
delayMicroseconds(5);
digitalWrite(ss, HIGH);
delayMicroseconds(2);
Serial.println(a);
return (a);
}
void spiSendData(int value)
{
digitalWrite(ss, LOW);
delayMicroseconds(5);
SPI.transfer(value); // send value (0~255)
delayMicroseconds(5);
digitalWrite(ss, HIGH);
delayMicroseconds(2);
}
int readReg(int value) {
digitalWrite(ss, LOW);
delayMicroseconds(20);
SPI.transfer(0x20 | value);
delayMicroseconds(3);
SPI.transfer(0x00);
delayMicroseconds(3);
int a = SPI.transfer(0x00); // send value (0~255)
delayMicroseconds(20);
digitalWrite(ss, HIGH);
delayMicroseconds(2);
return (a);
}
void writeReg(int add, int value) {
digitalWrite(ss, LOW);
delayMicroseconds(20);
SPI.transfer(0x40 | value);
delayMicroseconds(3);
SPI.transfer(0x00);
delayMicroseconds(3);
SPI.transfer(value); // send value (0~255)
delayMicroseconds(20);
digitalWrite(ss, HIGH);
delayMicroseconds(2);
}
void loop()
{
//deviceInit();
sendSamples();
}
inline void sendSamples(void) {
if (digitalRead(drdy) == HIGH) return;
sendSample();
}
inline void sendSample(void) {
digitalWrite(ss, LOW);
register int numSerialBytes = (3 * (1+1)); //24-bits header plus 24-bits per channel
uint8_t returnCode = spiRec(serialBytes, numSerialBytes);
digitalWrite(ss, HIGH);
//Serial.println(serialBytes);
}
uint8_t spiRec(uint8_t* buf, size_t len) {
for (size_t i = 0; i < len; i++) {
buf[i] = SPI.transfer(0XFF);
Serial.println(buf[i]);
}
return 0;
}
The output of above code configuration.
Thanks & Regards,
Jagadish B