- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: SPI Kommunikation des ads1243 mit dem ATMega

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2007
    Beiträge
    15

    SPI Kommunikation des ads1243 mit dem ATMega

    Anzeige

    Praxistest und DIY Projekte
    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.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    54
    Beiträge
    524
    Hallo,

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

    Gruß

    Jens

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2007
    Beiträge
    15
    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.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2006
    Beiträge
    144
    hast du den fehler mit dem ADS und deinen µc gefunden?
    habe ein ähnliches problem mit einen TI ic.

    mfg
    low
    meine aktuellen Projekte
    Sternenhimmel
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31439
    BuBoter - Roboter mit Antikolision
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31632

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress