DAC8552 SPI Programm

Gast #6126842
Lesenswert?
• ▲
▼
Hallo zusammen.
Ich bin Anfänger in Programmieren und hab auch schon Paar Dinge mit I2C 
gemeistert. Jezt bin ich mit SPI dran. Ich habe einen DAC8552 der mit 
SPI angesteuert wird von einem ATmega2560. Dazwischen ist ein LSF0204 
Pegelwandler. Ich versuche momentan lediglich auf einem der zwei kanäle 
ein Analog Signal heraus zu geben. Dafür habe ich mal den Standart SPI 
Code für dieses Projekt gewählt. Jetzt bin ich im Datenblatt die genaue 
Ansteuerung zu ermittteln. Irgendwie fällt mir das unheimlich schwer. 
Als ich mal was mit I2C gemacht habe war dies ein wenig organisiert mit 
Adressen und Kommandos. Hier blicke ich leider nicht ganz durch was ich 
falsch mache. Sieht jemand ev. was ich falsch mache oder ich da einen 
kompletten falschen Ansatz habe im Programm.
Danke im Voraus!
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#pragma GCC optimize 2    //Optimierung
4

5
#define F_CPU 16000000UL
6

7

8
#define DD_MISO    PB3
9
#define DD_MOSI    PB2
10
#define DD_SCK     PB1
11
#define DD_SS      PB0
12
#define DDR_SPI    DDRB
13

14
void SPI_MasterInit(void)
15
{
16
  // Set MOSI and SCK output, all others input
17
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK) |(1<<DD_SS);
18
  // Enable SPI, Master, set clock rate fck/16
19
  SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
20
}
21
uint8_t SPI_MasterTransmit(char Data)
22
{
23
  SPDR = Data;
24
  while(!(SPSR & (1<<SPIF)));
25
  return(SPDR);
26
}
27
//****************************************************************************
28
//Hauptprogramm
29
//****************************************************************************
30
int main(void)
31
{
32
    InitDriverColor();            //Einstellungen initialisieren
33
  SPI_MasterInit();            //SPI 
34
    wait_5ms(350);              //Warten bis start Programm LCD Profil
35
  clear_lcd_f();
36
  
37
    while(1)
38
    {
39
      write_text(0,3,"AO-Output Test");
40
      SPI_MasterTransmit(0x00);    //Standard Modus
41
      SPI_MasterTransmit(0x10);    //Kanal 1
42
      SPI_MasterTransmit(0x33);    //MSB
43
      SPI_MasterTransmit(0x00);    //LSB
44
      _delay_ms(100);
45
  }    
46
}
Gast #6126877
Lesenswert?
• ▲
▼
Tany schrieb:
> Tany schrieb:
>> DD_SS Leitung, je nachdem mit H oder L Pegel
> Bei DAC8552 wäre L Pegel...

Wen ich versuche das DD_SS auf H zu setzen motzt der Kompiler das dies 
nicht gehe. Wie würdest du dies setzen damit dieser Pin auf H  ist.

Und versteh ich soweit richtig solange ich die Befehle sende muss DD_SS 
L sein?
Gast #6126895
Lesenswert?
• ▲
▼
Tany schrieb:
> Martin R. schrieb:
>> Wie würdest du dies setzen damit dieser Pin auf H  ist
>
> PORTB &=~(1<<DD_SS): Set DD_SS auf L
> PORTB |=(1<<DD_SS):  Set DD_SS auf H
>
>> Und versteh ich soweit richtig solange ich die Befehle sende muss DD_SS
>> L sein
>
> Ja.

Oke soweit so gut dies sehe ich jezt auch mit dem Analizer. Im 
Datenblatt sind mehrere Kommandos angegeben 0x00 Standard modus 0x10 
Kanal1  dan noch LSB und MSB. So sende ich das ja auch aber was mir hir 
fehlt ich hab keine bestätigung über das Kommando wie bie I2C. Den am 
Ausgang tut sich trotzdem nichts. Ausser ich verstehe das Datenblatt mit 
den Kommandos und der Reihenfolge komplett falsch.
Gast #6126934
Lesenswert?
• ▲
▼
Tany schrieb:
> So ungefähr...
>
>      PORTB &=~(1<<DD_SS);
>       SPI_MasterTransmit(0x10);    //Kanal 1
>       SPI_MasterTransmit(0x33);    //MSB
>       SPI_MasterTransmit(0x00);    //LSB
>       PORTB |=(1<<DD_SS);

Das habe ich schon einmal ausprobiert. Leider klappt es so auch nicht. 
Irgendwo müsste doch noch die Konfiguration sein 0x00 für Standard 
Betrieb nicht. Aber selbst dan versteht der Chip die Kommandos nicht.
Gast #6126978
Lesenswert?
• ▲
▼
Tany schrieb:
> Martin R. schrieb:
>> Irgendwo müsste doch noch die Konfiguration sein 0x00 für Standard
>
> Nein.
> Schaue mal auf Seite 16. Dort sind alle beschrieben.

Ja das habe ich auch soweit herausgelesen auber irgendwie kommt es nicht 
auf den Punkt. Soweit habe ich die übertragung herausgelese trotzdem 
funktioniert es nicht und jetzt ist die Frage ob jemand den Fehler der 
kommuniktion mit den Kommandos sieht. Den wen ich noch einmal durch gehe 
seh ich trotzdem keinen Unterscheid.
Gast #6126982
Lesenswert?
• ▲
▼
Na probiere mal aus:

      PORTB &=~(1<<DD_SS);
      SPI_MasterTransmit(0x10);
      SPI_MasterTransmit(0x33);
      SPI_MasterTransmit(0x00);
      PORTB |=(1<<DD_SS);
      wait...

      PORTB &=~(1<<DD_SS);
      SPI_MasterTransmit(0x34);
      SPI_MasterTransmit(0x33);
      SPI_MasterTransmit(0x00);
      PORTB |=(1<<DD_SS);
Gast #6126992
Lesenswert?
• ▲
▼
Tany schrieb:
> Na probiere mal aus:
>
>       PORTB &=~(1<<DD_SS);
>       SPI_MasterTransmit(0x10);
>       SPI_MasterTransmit(0x33);
>       SPI_MasterTransmit(0x00);
>       PORTB |=(1<<DD_SS);
>       wait...
>
>       PORTB &=~(1<<DD_SS);
>       SPI_MasterTransmit(0x34);
>       SPI_MasterTransmit(0x33);
>       SPI_MasterTransmit(0x00);
>       PORTB |=(1<<DD_SS);

Wen ich diesen Code ausprobiere da erscheint tatsächlich für ms eine 
Spannung verschwindet aber sofort wieder und kommt dan nie mehr obwohl 
in While(1).
Somit nicht mal so falsch aber korrekt ist es dennoch leider nicht...
Gast #6127031
Lesenswert?
• ▲
▼
Ich hab noch rausgefunden das wen ich den ersten der Beiden Teile ins 
main und nicht While(1) setze zeigt es mir eine Spannung an aber startet 
mit 1,25V statt 0V mit 0x00MSB und 0x00LSB. Und wieso funktioniert 
dieser code nur ein mal auch im While(1)?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.