C DAC1220 (Digital Analog Wandler)

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Guten Abend :cool:

ich werde aus diesem Chip nicht schlau oder verstehe das Pinning nicht ganz.
Ist das kein "normales" SPI? Es gibt einen Pin für "In/Out" Ich kenne bis jetzt nur "MOSI & MISO".

Lesen will ich eigentlich gar nichts bzw. brauche ich den Chip nicht auslesen (will nur Daten schreiben)... Das scheint aber nicht ganz hin zu hauen.

Hier mein Source

Schreiben in das INSR Seite 12


CodeBox C
void DAC1220_INSR_Write(uint8_t NumOfBytes, uint8_t Addr)
{
   uint8_t cmd = 0x00;
   cmd |= ((NumOfBytes << 5) | (Addr & 0x0F));
   cmd &= ~((1<<7) | (1<<4)); // R/W & Bit 4 must be "0"
   
   SpiSlaveSelectHigh(); // <-
   SpiSlaveSelectLow();  // Select Slave
   SpiMasterTx(cmd);
   SpiSlaveSelectHigh(); // <-
}


Und einfach mal einen Wert in das Commando-Register schreiben Seite 15


CodeBox C
void DAC1220_Set_Output_16Bit(uint16_t ADC_Val)
{
   DAC1220_INSR_Write(BYTEx2,DATA_INPUT_REGISTER_BYTE2);
   
   SpiSlaveSelectHigh(); // <-
   SpiSlaveSelectLow();  // Select Slave
   SpiMasterTx((ADC_Val & 0xFF00)); // Bit 24 - 17
   SpiMasterTx((ADC_Val & 0x00FF)); // Bit 16 - 9
   SpiSlaveSelectHigh();
   
}


Der SPI zappelt auch, Signale sind soweit richtig vorhanden (Oszi)...

:eek: Bestimmt wieder ein "dummer" Fehler.
 
Hi Janiiix,

überträgst du hier jeweils 16 Bit oder nur 8 Bit?



CodeBox C
SpiMasterTx((ADC_Val & 0xFF00)); // Bit 24 - 17
SpiMasterTx((ADC_Val & 0x00FF)); // Bit 16 - 9
 
Mist... Ich habe das schieben vergessen... Argh
 
Und was hat es mit den Pins auf sich?
 
Und was hat es mit den Pins auf sich?
Auf Seite 12 ist die relevante Stelle:

Commands
Communication with the DAC1220 consists entirely of Registers commands, which access the DAC1220 registers.
Commands consist of a command byte followed by one, two or three data bytes. The data bytes can be
sent to the DAC1220 or read from the DAC1220, depending on whether the command is a read command or a write command.

command_byte.png
 
Ich bekomme ständig das zurück was ich ihm schicke?! 0.o
Es ist kein Schluss zwischen MISO und MOSI... Da es ein SPI Bus mit Bidirektionaler Funktion ist, wird der ja ein bisschen anders gehandelt... Ich habe SDI mit MOSI verbunden und SDIO mit MISO...

dac.jpg
 
Ich bekomme ständig das zurück was ich ihm schicke?! 0.o
Es ist kein Schluss zwischen MISO und MOSI... Da es ein SPI Bus mit Bidirektionaler Funktion ist, wird der ja ein bisschen anders gehandelt... Ich habe SDI mit MOSI verbunden und SDIO mit MISO...

MOSI und MISO sind sicher Signale von deinem AVR Mikrocontroller
SDIO ist das Control/Daten-Signal des ADC, das ist je nach Kommando auch mal Output.

Was ist SDI? Ich finde das Signal nicht.
 
Bei der Dokumentation heißen die Pins alle anders -->

dac.jpg

Hier mal mein Code... Der anscheinend nicht funktioniert -->


CodeBox C
/* write 2 Bytes to DIR Reg 2 - 1 */

[I]uint8_t[/I] cmd = 0x00;
cmd |= ((0x01 << 5) | (0x00 & 0x0F));
cmd &= ~((1<<7) | (1<<4)); // R/W & Bit 4 must be "0"

// cmd = 32

SpiSlaveSelectHigh(); // <-

SpiSlaveSelectLow(); // Select Slave

SpiMasterTx(cmd);
SpiMasterTx(0xff); // Bit 24 - 17

SpiMasterTx(0xff); // Bit 16 - 9

SpiSlaveSelectHigh();

[I]sprintf[/I](Buffer,"Tx_Cmd.: %"[I]PRIu16[/I],cmd); 

LCD_SendString(Buffer,0,0);

[I]_delay_ms[/I](1000);

LED_YELLOW_ON;
[I]_delay_ms[/I](5);
LED_YELLOW_OFF;
[I]_delay_ms[/I](5);
 
Auf dem Board ist ein TristateBuffer (U3 wenn ich das richtig sehe). Über den muss das Signal MOSI vom AVR hochohmig geschaltet werden, wenn du Daten vom ADC empfangen möchtest, sonst wirkt das MOSI Signal direkt auf das MISO Signal und du liest das was du sendest.

Das Control-Signal für den Buffer liegt an dem FSR Pin.


Wenn du das Eval-Board später mal nicht verwendest und den ADC auf dem eigenen Board hast, kannst du den TristateBuffer weg lassen und das direkt über den AVR machen. Ich würde dann SoftwareSPI verwenden. Den 100Ohm Widerstand trotzdem sicherheitshalber in der Datenleitung lassen.
 
So versuche ich zu lesen, dass klappt jedoch nicht.



CodeBox C
uint8_t cmd = 0x00;
cmd |=  (1<<7 | (0x01 << 5) | (0x04 & 0x0F)); // 2 Bytes lesen in Adresse 0x04 (CMD Register)
cmd &= ~(1<<4); // Bit 4 must be "0"

SpiSlaveSelectHigh(); // <-
SpiSlaveSelectLow();  // Select Slave
 
SpiMasterRxTx(cmd);

SDIEN_PORT |= (1<<SDIEN_bp);
uint8_t retByte = SpiMasterRxTx(0xDD); // Dummy-Byte
SDIEN_PORT &= ~(1<<SDIEN_bp);
 
SpiSlaveSelectHigh(); // <-
 
sprintf(Buffer,"RxD -> %"PRIu16,retByte);
LCD_SendString(Buffer,0,0);


Ich kann auch schon Spannungen ausgeben... Noch nicht gezielt aber es ändert sich schon was...

Was genau meinen die mit Datenformat : zweierkomplement?
 
Zuletzt bearbeitet:
Du könntest hier noch mal schauen ...

  1. Ist SDIEN Port und Pin richtig definiert, als Ausgang geschaltet, richtig angeschlossen.
  2. Passen Logikpegel zusammen?
  3. Passt der SPI Mode (CPOL, CPHA)
  4. Testweise Delays einbauen
 
Wie sieht denn meine Routine aus? Kannst du das nachvollziehen? Sieht das inordnung aus?
 
Wie sieht denn meine Routine aus? Kannst du das nachvollziehen? Sieht das inordnung aus?

Dies finde ich ein bisschen durcheinander ...


CodeBox C
uint8_t cmd = 0x00;
cmd |=  (1<<7 | (0x01 << 5) | (0x04 & 0x0F)); // 2 Bytes lesen in Adresse 0x04 (CMD Register)
cmd &= ~(1<<4); // Bit 4 must be "0"


müsste aber passen. Ergibt hier cmd = 0b10100100

Wenn SDIEN bei high den Treiberausgang hochohmig schaltet, stimmt es.
Der Zustand des Signals muss vor der Funktion eindeutig sein.

Ansonsten sieht man nicht viel (kein SPI, keine Initialisierung)
 
Das SPI Modul habe ich von einem anderen Projekt genommen (das hat schon funktioniert, sind auch die gleichen Pins).
Genau... Ich Initalisiere den Chip nicht... Muss ich das unbedingt?
 
Ich Initalisiere den Chip nicht... Muss ich das unbedingt?
Soweit habe ich mir es nicht angesehen, das kann ich leider nicht sagen. Ich meinte die Initialisierung eher bezogen auf IO Ports, SPI.
 
#14, SPI läuft...
Ich bin immer noch nicht sicher ob ich den SPI Mode richtig gewählt habe...
Habe aktuell den 3 genommen.
Wie erkenne ich das? Irgendwie wann die Daten übernommen oder nicht... Passt das mit 3? Habe oben das Datenblatt verlinkt...

Und was genau ist der Unterschied zwischen Zweierkomplement und dem normalen Binären System?
 
Danke @addi das ist dort echt sehr gut beschrieben.

Im Datenblatt steht ziemlich viel vom Sleep Mode. Ich bin mir mega unsicher ob der IC wenn ich ihn einschalte, direkt in den Sleep Mode geht oder nicht. Wenn er direkt in den Sleep Mode geht, muss ich mich auch nicht wundern das ich nichts gescheites Lese.

Zum Tristate: Auf low ziehen klappt, ich bekomme auch eine Antwort wenn er auf low ist, nämlich meine Daten die ich ihn sende, genau das gleiche mit high...
 
Wenn wir davon ausgehen, dass die Pins alle so tun wie sie solln... Ist der Ablauf den korrekt?
Daten schreiben


CodeBox C
    uint8_t cmd = 0x00;
   cmd |= ((NumOfBytes << 5) | (Addr & 0x0F));
   cmd &= ~((1<<7) | (1<<4)); // R/W & Bit 4 must be "0"
   
   SendEnable_ReadDisable();
   SpiSlaveSelectHigh(); // <-
   SpiSlaveSelectLow();  // Select Slave
   SpiMasterTx(cmd);
   SpiMasterTx((ADC_Val & 0xFF00) >> 8); // Bit 24 - 17
   SpiMasterTx((ADC_Val & 0x00FF)); // Bit 16 - 9
   SpiSlaveSelectHigh();



Daten lesen


CodeBox C
   uint8_t cmd       = 0x00;
   uint8_t retByte = 0x00;

   cmd |=  (1<<7 | (NumOfBytes << 5) | (Addr & 0x0F));
   cmd &= ~(1<<4); // Bit 4 must be "0"
   
   SendEnable_ReadDisable(); // Tristate Buffer = Low

   SpiSlaveSelectHigh(); // <-
   SpiSlaveSelectLow();  // Select Slave
   SpiMasterTx(cmd);

   ReadEnable_SendDisable(); // Tristate Buffer = High
   retByte = SpiMasterRx();
   SpiSlaveSelectHigh(); // <-

   return(retByte);
 
Das schreiben funktionierte schon die ganze Zeit. Es war nur der Fehler mit dem Zweierkomplement. Jetzt kann ich Spannungen ausgeben!

vielen lieben Dank nochmal ;)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)