Ein AD5293 bzw. 16-bit SPI

Hemi

Aktives Mitglied
Premium Benutzer
30. Nov. 2008
1.103
19
38
Korntal-Münchingen, Germany
Sprachen
  1. ANSI C
  2. C++
  3. PHP
  4. Java
Hallo zusammen,

ich versuche gerade einen AD5293 zum Laufen zu überreden, aber er wehrt sich.

Das SPI Format ist:

CPOL = 0; CPHA = 1 (spi mode 1)
MSB First

Die SPI_Init sieht so aus:



CodeBox C
void spi_init(void)
{
    // spi master, 16 divider = 921,6kHz spi freq
    DDR_SPI |= (1 << DD_MOSI)|(1 << DD_SCK)|(1 << DD_CS);
    SELECT_CS();
    SPCR |= (1 << SPE)|(1 << DORD)|(1 << MSTR)|(0 << CPOL)|(1 << CPHA)|(1 << SPR0);    // SPI enable, Master mode, divider 16, cpol = 0, cpha = 1, msb first
    // SPCR |= (1 << SPE)|(1 << MSTR);    // SPI enable, Master mode, divider 4
}


Der Chip ist nach dem reset in einem write protect Modus, der erstmal gelöscht werden muss. Dazu sendet man ein 0x1802 an den Chip und damit ist er aus dem Write protect raus.

Alles klar, kein Problem, hier der Code dazu:



CodeBox C
void ad5293_init (void)
{
    uint16_t data = 0;
    data |= (1 << 12)|(1 << 11)|(1 << 1);
    DESELECT_CS();
    spi_write16(data);
    SELECT_CS();
}


Mein uint16_t data hat den Wert 0x1802, also raus damit.

Und die SPI 16-bit Senderoutine sieht so aus:



CodeBox C
void spi_write16 (uint16_t data)
{
    SPDR = ((uint8_t) (data >> 8));
    while(!(SPSR & (1<<SPIF)));
    SPDR = ((uint8_t) (data  & 0xff));
    while(!(SPSR & (1<<SPIF)));
}


Nur interessiert es den Chip herzlich wenig. Nun habe ich drei Leitungen angelötet und einen LA dran gehängt:

1589573686251.png

Warum ist der LA der Meinung, dass da 0x1840 gesendet wurde und nicht 0x1802? Hat es was mit der Wartezeit in der Mitte der Übertragung zu tun?

Danke Euch!
 
Hallo Heinrich,

die "Wartezeit" darf da keinen Einfluss haben. Da das MSB (0x18) vom LA erkannt wird, gehe ich davon aus, dass CPOL und CPHA richtig eingestellt sind.

Im Moment sehe ich keinen Fehler. Ich würde direkt in der spi_write16 Funktion beim LSB mit kontanten Werten spielen und schauen was der LA sagt, vielleicht kommt man dann auf die Ursache.

Dirk :ciao:
 
Hallo Dirk,

danke für die schnelle Antwort.

Das sieht für mich irgendwie so aus, als wäre der zweite Byte invertiert. Beim ersten Byte sieht man es nicht, weil 00011000 ja invertiert genau so ist.

Ich sehe den Fehler, der Bit DORD im Register SPCR ist gesetzt... das heißt: When the DORD bit is written to one, the LSB of the data word is transmitted first. Was natürlich Blödsinn ist, das sollte 0 sein und somit MSB first...

EDIT: Nach der Anpassung sieht es dann so aus:

1589606403489.png

Und die SPI_Init():


CodeBox C
void spi_init(void)
{
    // spi master, 16 divider = 921,6kHz spi freq
    DDR_SPI |= (1 << DD_MOSI)|(1 << DD_SCK)|(1 << DD_CS);
    SELECT_CS();
    SPCR |= (1 << SPE)|(1 << MSTR)|(0 << CPOL)|(1 << CPHA)|(1 << SPR0);    // SPI enable, Master mode, divider 16, cpol = 0, cpha = 1, msb first
    // SPCR |= (1 << SPE)|(1 << MSTR);    // SPI enable, Master mode, divider 4
}
 
Zuletzt bearbeitet:
Genau das war es am Ende auch.

Was aber irgendwie etwas komisch ist, dass die errechnete Werte für D (Datenregister) um 2 bis 3 daneben liegen.

Hier sind die berechneten Werte:

1589741250034.png

Tabellenspalten:
  • Spalte A: mein benötigter Widerstand um ein Befehl beim Radio auszulösen
  • Spalte B: Wert von D über die Formel berechnet
  • Spalte C: Wie B nur gerundet
  • Spalte D: ist die Rückwärtsrechnung von D zum Widerstand
Ich nehme den Widerstand zwischen Terminal A und Wiper, also gild für mich diese Gleichung:

1589741506178.png

Wobei Rab 100k ist. Aufgelöst nach D heißt es dann: D= 1024-((Rwa/Rab)*1024), bzw. D = 1024-((Rwa/100000)*1024).

Wenn ich jetzt ins Register wirklich die 1001 schreibe, bekomme ich 2k46, für 2k2 brauche ich 1003... und was auch noch sehr spannend ist, dass der Wert schwimmt, mein Multi springt von 2k2 bis über 6k, mal hoch, mal runter. Wenn ich dann eine Klemme vom Multi anfasse, geht der Wert wieder auf 2k2 runter...

Kann es an den fehlenden Kerkos C23 und C25 liegen?
1589788583512.png

Die C3 und C26 sind drin, aber ich hatte keine 10µF Kerkos gerade da.
 
Hallo Heinrich,

ich habe mir gerade das Datenblatt angesehen ...

Ich denke deine Betriebsspannung stimmt nicht.

Single Supply Power Range VDD = 9V ... 33V, du nutzt 5V

5V für VLOGIC ist in Ordnung, VDD muss höher sein.

Dirk :ciao:
 
Hallo Dirk,
genau das ist das Problem, ich bin echt zu blöd Datenblätter zu lesen... es ist eindeutig zu viel los.... :fie: :help:

Die Beschaltung von AD5293 sieht jetzt so aus:

1589963301750.png

C25 und C26 sind an VLOGIC und /RESET angeschlossen.

SAFT kommt von hier:

1589962407857.png

SAFT ist Ubat, also zwischen 11,5V und 13,8V, wenn der Motor läuft. Glaube, so passt es nun.
 

Ü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)