This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS1255: SPI connection to ADS1255 does not work

Part Number: ADS1255

Hi,

I've been trying to control the ADS1255 for a while now and trying to read out the values. Unfortunately I still have problems.

To the setup: I have a board where an ATmega88 is the interface between ADS1255 and RS485 communication. The circuitry is taken from the schematic for the NIRscanNano and looks like this:



I read the following thread () and took the code from this post ().

#define F_CPU 11059200

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>

#define BAUD 115200UL
#define UBRR0_Value (F_CPU/(16*BAUD)-1)
#define CS_LOW PORTB &= ~(1 << PB2);
#define CS_HIGH PORTB |= (1 << PB2);

//UART functions_________________________________________________________________

//________ Configure UART _______
void UART_init()
{
	UBRR0H = (unsigned char) (UBRR0_Value >> 8);
	UBRR0L = (unsigned char) UBRR0_Value;
	UCSR0B = (1<<TXEN0) | (1<<RXEN0);
	UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
	
}

// _____ Send char via UART ______
static void UART_transmit_char (unsigned char ch)
{
	while (!(UCSR0A & (1<<UDRE0)))
	{
		;
	}

	UDR0 = ch;
}

// ______ Send string via UART _____
static void UART_transmit_string (char * s)
{
	while (*s)
	{
		UART_transmit_char (*s);
		s++;
	}
}

// _____ Receive Byte via UART ____
char UART_receive(void)
{
	while(!(UCSR0A & (1<<RXC0)));
	return UDR0;
}

//end UART functions______________________________________________________________

// SPI functions__________________________________________________________________

// _____ Configure SPI ______
void SPI_Init()
{
	DDRB |= (1<<5)|(1<<3)|(1<<2);			 // MOSI, !CS , SCK as Output
	SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA);     // SPI Enable, SPI = Master, Prescaler = 16
}

// ____ Send SPI Data and return the received byte _____
unsigned char ADS1255_transceive (unsigned char data)
{
	SPDR = data;
	while(!(SPSR & (1<<SPIF) ));    // Wait until transmission complete
	_delay_us(20);					// wait for 10µ until DOUT (t6)
	return(SPDR);
}

//end SPI functions______________________________________________________________

// _____ Read register of ADS1255 and return register value _____
void ADS1255_Init()
{

	CS_LOW;
	
	ADS1255_transceive(0xFE);
	UART_transmit_string("ADS1255 RESET");
	UART_transmit_char('\r');
	_delay_us(5);
	
	ADS1255_transceive(0xF);
	UART_transmit_string("ADS1255 SDATAC");
	UART_transmit_char('\r');
	_delay_us(10);
	
	CS_HIGH;
	
}

int32_t ADS1255_Read_Data()
{
	
	int32_t result = 0;
	uint8_t ADC_bytes[3];
	
	CS_LOW;
	_delay_us(5);
	ADS1255_transceive(0x01);
	
	ADC_bytes[0] = ADS1255_transceive(0);
	ADC_bytes[1] = ADS1255_transceive(0);
	ADC_bytes[2] = ADS1255_transceive(0);
	_delay_us(10);
	
	CS_HIGH;
	_delay_us(5);
	
	if (ADC_bytes[0] & 0x80)     //  negativ
	{
		result = (int32_t) (((0xFF)<<24)|((ADC_bytes[0]&0xFF)<<16)|
		((ADC_bytes[1]&0xFF)<<8)|
		((ADC_bytes[2]&0xFF)<<0));
	}
	else						 // positiv
	{
		result = (int32_t) (((0x00)<<24)|((ADC_bytes[0] & 0xFF)<<16)|
		((ADC_bytes[1] & 0xFF)<<8)|
		((ADC_bytes[2] & 0xFF)<<0));
	}
	
	return result;
}


// Main funcion _____________________________________________________________________
int main(void)
{	
	_delay_ms(3000);   // startup delay
	
	UART_init();
	SPI_Init();
	ADS1255_Init();
	
	while(1)
	{
		ADS1255_Read_Data();				// read ADC data
		_delay_ms(1000);
	}
}

Unfortunately I get an answer from the converter, which I did not expect and after that I don't get any answers anymore. The DRDY signal is always high. Maybe somebody else has tips or advice on how to get reasonable values from the ADS1255.

Here are the first three commands recorded with my LogicAnalyser:

Command: 0xFE (RESET)

Command: 0x0F (SDATAC)


Command: 0x01, 0x00, 0x00 0x00 (RDATA, Read, Read, Read)

I hope someone has some advice or tips for me.

Best regards
Michael

  • Hi Michael,

    I would recommend probing the crystal to check if it is oscillating.

    If the ADC is powered, clocked, and the /PWDN, /RESET pins are held high, then you ought to see /DRDY pulsing. If not, then the device is not active. You might also need to check each of the supply voltages and check that there is a good connection between AGND and DGND (maybe there is a poor solder connection somewhere?).

  • Hi Michael,

    If DRDY is always high, that generally indicates a hardware issue. Have you checked to make sure your crystal is working and actually supplying a clock signal to the ADC?

    If possible, you might try an external clock oscillator instead of a crystal to see if you can get data out.

    -Bryan

  • Dear Chris,

    thank you for your support. One of the supply voltages was not stable and this caused the error data. Now it is working as expected.

    Best regards,
    Michael