Hallo Leute,

ich bin fast am verzweifeln. Ich versuche mit ATMega32 einen 24 Bit Analog - Digitalwandler (ads1243 von texas instruments) zum Laufen zu bringen.
Der AD-Wandler lässt sich über SPI ansteuern. Bei mir geschieht das mit dem ATMega32 als Master, der über SPI Daten an den ADS1243 schickt.
Zunächst habe ich eingestellt, dass der analoge Eingang AIN0 in das DOR (Data Output Register) schreibt. Dafür habe ich mit SPI folgendes gesendet:

Adresse: AIN0:
0001 0000

Laut Datenblatt muss man dem ads1243 zum einmaligen Auslesen des Registers folgendes senden:

0000 0001 (RDATA - Read Data, Datenblatt . 18 )

Das habe ich gemacht. Ausserdem muss man anschließend warten bis defenitiv der DRDY (Data Ready) Ausgang gesetzt ist. Auch das habe ich gemacht. In den nächsten drei Bits wird werden dann die Daten gesendet (3x8 = 24 bit). Da man bei SPI immer senden muss um Daten empfangen zu können habe ich anschließend dreimal lauter nullen gesendet. Nur leider empfange ich über den Ausgang des ADS1243 nichts, oder nur etwa jedes zehnte mal blödsinn. Ich muss dazu sagen, dass ich den Ausgang des ADS1243 nur mit dem Oszi auslese.

Hier die relevanten Defines:
Code:
#define DDR_SPI       DDRB
#define PORT_SPI      PORTB
#define DDR_DRDY	 DDRA
#define PORT_DRDY	 PINA
#define P_DRDY	 0
#define P_MISO          6
#define P_MOSI          5
#define P_SCK            7
#define P_DRDY	  0
Hier der Qelltext für die Initialisierungsfunktion des SPI:

Code:
void spi_init(void)
{
    // Aktivieren der Pins für das SPI Interface
    DDR_SPI  |= (1<<P_SCK)|(1<<P_MOSI);
    PORT_SPI &= ~((1<<P_SCK)|(1<<P_MOSI)|(1<<P_MISO));
     
    DDR_CS   |= (1<<P_CS);
    PORT_CS  |= (1<<P_CS);
   
    // Aktivieren des SPI Master Interfaces, fosc = fclk / 2 = 16 / 4 = 4 Mhz
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA);
    //SPSR = (1<<SPI2X);
}
Und die Funktion zum grundsätzlichen Senden mit SPI:

Code:
uint8_t spi_putc( uint8_t data )
{
    // Sendet ein Byte
    SPDR = data;
   
    // Wartet bis Byte gesendet wurde
    while( !( SPSR & (1<<SPIF) ) )
        ;
   
    return SPDR;
}
Und schließlich die Funktion mit der ich dem ads1243 die Daten schicke:

Code:
void ads1243_write_register(void)
{
	// MUX -> AIN0
	PORT_CS &= ~(1<<P_CS);   
    spi_putc(0x01);
    spi_putc(0x00);
    PORT_CS |= (1<<P_CS);
	long_delay(10);
	
	/*
	RDADAC -> Read the most recent conversion result from the
    Data Output Register (DOR). This is a 24-bit value.
	-> 0000 0001
	*/
	PORT_CS &= ~(1<<P_CS);   
    spi_putc(0x00);
    spi_putc(0x01);
    PORT_CS |= (1<<P_CS);
	long_delay(10);
	
	DDR_DRDY |=	(1<<P_DRDY);
	
	while(1)
	{
	PORT_CS &= ~(1<<P_CS);   
    spi_putc(0x01);

	// warten bis Das Data-Ready Signal definitiv gesetzt ist
	while(bit_is_set (PORT_DRDY, P_DRDY))
			;	

	long_delay(1);

	// dreimal senden um lesen zu können
	spi_putc(0x00);
	spi_putc(0x00);
	spi_putc(0x00);
    PORT_CS |= (1<<P_CS);
	//long_delay(1);
	}
}
Im main rufe ich dann einfach nacheinander die Funktionen spi_init() und ads1243_write_register() auf.

Wie gesagt, am Ausgang des ADS1243 sind mit Oszi meistens nur nullen zu messen. woran könnte das liegen? Hat vielleicht schon jemand Erfahrung mit dem Teil. Oder liegt der Fehler grundsätzlich an meinem Verständnis von SPI ...

Ich würde mich echt freuen wenn mir jemand weiterhelfen könnte.