-
        

Ergebnis 1 bis 4 von 4

Thema: AT90CAN128 ->SPI -> DA-Wandler MAX5105

  1. #1

    AT90CAN128 ->SPI -> DA-Wandler MAX5105

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Moin!
    Ich hoff das ist das richtige Unterforum, hab leider kein passenderes gefunden.

    Ich versuche gerade einen DA-Wandler über SPI anzusprechen. Bis jetzt
    leider ohne Erfol.

    Der DA-Wandler erwartet ein 14-bit Wort nach dem Schema:

    1 Startbit, 2 Controlbits, 3 Adressbits und 8-Datenbits.

    folgendes möchte ich Übertragen:

    1 0 1 0 0 0 1 1 , 1 1 1 1 1 1

    Das wäre meine 14-bit Information, um das zweite Byte vollzubekommen
    häng ich noch 2 0er an. Die letzten zwei Stellen sind ja eh don`t care
    für den DA-Wandler(?).

    Also übertrage ich 0xA3 und 0xFC mit folgendem Program:


    Code:
    #include <stdlib.h>
    #include <avr/io.h>
    #include <avr/signal.h>
    
    #define SS PB0
    #define MOSI   PB2
    #define SCK  PB1
    #define CS  PE6
    
    SIGNAL (SIG_SPI) {
      return;
    }
    
    void SPI_Master_TransmitInit(void)
    {
      /* Set MOSI, SS und SCK als Ausgang */
      DDRB |= (1<<MOSI) | (1<<SCK) | (1<<SS);
      DDRE |= (1<<CS);      //Chip select als Ausgang  
      PORTB |=(1<<SS);      //Slave select High
      PORTE |= (1<<CS);      //Chip select High
      /* Enable SPI Interrupt, Enable SPI, Master, f = FCPU/16 */
      SPCR = (1<<SPIE) | (1<<SPE) | (1<<MSTR) | (1<<SPR0);
    }
    
    void SPI_MasterTransmit(void)
    {
      PORTE &= ~(1<<CS);    //Chip select Low
      PORTB &= ~(1<<SS);    //Slave select Low
      SPDR = 0xA3;        //Erstes Byte senden
      while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
      SPDR = 0xFC;          //Zweites Byte senden  
      while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
      PORTE |=(1<<CS);      //Chip select High
      PORTB |=(1<<SS);      //Slave select High
    }
    
    int main (void)
    { 
      sei(); 
      SPI_Master_TransmitInit();
      SPI_MasterTransmit(); 
     
      while(1)  
      return 0;
    }
    Nicht wundern wegen SS und CS, CS geht an den DA-Wandler, SS ist über
    Widerstand auf Masse, ist Hardwaremäßig so vorgegeben.

    Weiß vielleciht jemand einen Rat was faul sein könnte?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2005
    Ort
    Obertraun
    Alter
    29
    Beiträge
    194
    Wieso hast du den SPI Interrupt aktiviert?

    Ich denke, dass hier das Problem liegt:
    SPIF is cleared by hardware when executing the corresponding interrupt Handling Vector.
    Dadurch bricht vermutlich folgende Schleife nie ab:
    while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet

  3. #3
    Also wenn ich das Program mit JTAG debugge wird das Program Zeile für Zeile durchgegangen, also die Schleife bricht ab.

    Hab jetzt aber mal den Interrupt rausgenommen, geändert hat sich aber nichts. Ich kann aber auch nicht nachvollziehen ob die SPIF wirklich gelöscht wird, weil sie ja gesetzt wird sobald die Zeile SPDR = 0xFC; ausgeführt wird. Ich sehe quasi nur das sie immer gesetzt ist.

    Oh man, ich verzweifel noch...

  4. #4
    Hat sich erledigt!

    Der DA Wandler war defekt.

    Außerdem müssen an die 14 Bit Information zweimal die 0 vorne angefügt werden.

    Die SPI hat funktioniert.

Berechtigungen

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