PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI Kommunikation des ads1243 mit dem ATMega



todo
11.12.2008, 11:57
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:


#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:



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:



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:



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.

McJenso
11.12.2008, 14:48
Hallo,

welche SPI Frequenz kann der Wandler? Ich würde zum Testen die Frequenz deutlich runter nehmen.

Gruß

Jens

todo
11.12.2008, 15:29
Könnte ein Fehler sein. Ich sende bei einer SPI-Frequenz von 4 MHz (f_sclk).

Der AD-Wandler läuft ebenfalls mit einer Frequenz von 4 MHz (f_osc). Dabei sollte die Periode der SPI-Frequenz des Senders maximal 4*T_osc sein. Habe wohl das SPI des ATMegas falsch konfiguriert.

Werde das gleich mal austesten.

lowtzow
12.10.2009, 19:56
hast du den fehler mit dem ADS und deinen µc gefunden?
habe ein ähnliches problem mit einen TI ic.

mfg
low