SPI - A/D Wandler AD7124 Kommunikation

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo,

habe ein Problem mit dem oben genannten A/D Wandler "SPI".
Vermuten tue ich mal, dass es an dem Kommando liegt was ich ihm schicke.
Auslesen möchte ich erstmal das "ID" Register.

Dies liegt bei Adresse "0x05"....
Senden tue ich ihm eine "0x45"... Soweit ich das im Datenblatt auf Seite 78 lesen kann?!

www.analog.com/media/en/technical-documentation/data-sheets/AD7124-8.pdf

Ist das so korrekt?
 
Zuletzt bearbeitet:
Hmmm...,
Hast du in der initialisierung spi mode 3 benutzt, wie gefordert?
Addi
 
Ja habe ich.

"2"



CodeBox C
/* config "Clock Polarity and "Clock Phase" */


switch(clock_option)

{

case 0 : {SPCR &= ~((1<<CPOL) | (1<<CPHA)); }break; // mode 1


case 1 : {SPCR |= (1<<CPHA); }break; // mode 2


case 2 : {SPCR |= (1<<CPOL); }break; // mode 3


case 3 : {SPCR |= ((1<<CPOL) | (1<<CPHA)); }break; // mode 4


default: {return 0; }; // error


}
 
Ok...
Verdrahtung entspricht der master / slave bedingung?
Cs entsprechend gewaehlt? (pin)
Addi
 
Hoffe ich doch. Sollte passen.
Wenn ich MISO und MOSI Brücke empfange ich auf jeden fall, dass was ich auch sende...
Chip Select passt auch, habe ich mit dem Oszilloskope nach gemessen.
 
Hier ist die Leseroutine.



CodeBox C


[I]uint8_t[/I] AD7124_read_uint8([I]uint8_t[/I] reg)


{

[I]uint8_t[/I] buffer[1] = {0};

/* build command */


buffer[0] = (AD7124_COMM_REG_WEN | AD7124_COMM_REG_RD | AD7124_COMM_REG_RA(reg));



chip_enable_high(); // \CS High


chip_disable_low(); // \CS Low -> start transmission condition


spi_master_transmit(buffer[0]); // register address


spi_master_transmit(0x00); // dummy byte


buffer[0] = ([I]uint8_t[/I])spi_receive(); // result




chip_enable_high(); // \CS High -> stop transmission condition




return ([I]uint8_t[/I])buffer[0];


}





Also beim "Command" zusammen basteln, bekomme ich auf jeden fall die "0x45"...
 
Zuletzt bearbeitet:
Hast du das communication register entsprechend vorbelegt ? (Siehe seite 78 des manuals)
 
Womit vorgelegt?
 
Aehhhh...vorbelegt sollte es heissen.
Bit7 =0, bit6=1 (da gelesen werden soll) und bit5 bis bit0 enthaelt die register address bits. Siehe tabelle 63 im pdf
 
Hallo Janiiix,
dein Code oben sieht soweit in Ordnung aus.
Allerdings kann ja niemand wissen, was die aufgerufenen Funktionen genau machen, man kann nur vermuten. Ein Fehler ist also schwer zu finden, da man nicht genug vom Sourcecode sieht.

Die 0x45 erscheint mir richtig. Bit 6 gesetzt für Leseoperation und Bit 5..0 ist die Adresse 5 für das ID Register. Es sollte also 0x14 zurück kommen.

Falls das nicht funktioniert, prüfe noch einmal dein Layout bzw. Signalverlauf.
Vergleiche auch trotzdem den SPI Mode 3 in den Datenblättern von AD7124 und AVR, stimmt das überein?
SPI Frequenz reduzieren.

Sonst fällt mir nichts weiter ein. Um weiter zu helfen, müsstest du mehr Sourcecode posten.

Dirk :ciao:
 
Also mit dem Layout sollte es keine Probleme geben, da das ein Board von AnalogDevice ist.
Die Pins habe ich alle mit dem Oszilloskope nachgemessen.
Bis auf "MISO" dort kommt nichts, keine Antwort.

Hier ist die Initalisierung.:


CodeBox C
  /* ONLY FOR MEGA32U4! */
   #if defined (__AVR_ATmega32U4__)
   {
     /* set MOSI and SCK output, all others input */
     MOSI_DDR   |=   (1<<MOSI_BIT);
     MISO_DDR   &= ~(1<<MISO_BIT);
     SCK_DDR     |=   (1<<SCK_BIT);
     SS_DDR     |=   (1<<SS_BIT);    // software slave select signal
     SS_HA_DDR   |=   (1<<SS_HA_BIT);  // hardware slave select signal
     
     
     /* enable SPI, Master */
     SPCR |= ((1<<SPE) | (1<<MSTR));
     
     /* clear the bit´s (for multi init) */
     SPCR &= ~((1<<SPR0) | (1<<SPR1)); // fclk/4
     SPSR &= ~(1<<SPI2X);
     
     /* clear the bit´s (for multi init) */
     SPCR &= ~((1<<CPOL) | (1<<CPHA));
     
     /* config "Clock Polarity and "Clock Phase" */
     switch(clock_option)
     {
       case 0 : {SPCR &= ~((1<<CPOL) | (1<<CPHA)); }break; // mode 1
       case 1 : {SPCR |=  (1<<CPHA);         }break; // mode 2
       case 2 : {SPCR |=  (1<<CPOL);         }break; // mode 3
       case 3 : {SPCR |=  ((1<<CPOL) | (1<<CPHA));   }break; // mode 4
       default: {return 0;               }; // error
     }
     
     /* config SPI Bus Speed fclk/prescaler */
     switch (prescaler)
     {
       case 0:     {SPSR |=  (1<<SPI2X);               }break; // 2
       case 1:     {SPCR |=  (1<<SPR0); SPSR |=  (1<<SPI2X);     }break; // 8
       case 2:     {SPCR |=  (1<<SPR1); SPSR |=  (1<<SPI2X);     }break; // 32
       case 3:     {SPCR |=  (1<<SPR0); SPSR |=  (1<<SPI2X);     }break; // 64
       case 4:     {SPCR |=   ((1<<SPR1) | (1<<SPR0));       }break; // 128
       default:   {return 0;                     }; // error
     }
     return 1;
   }
   #endif


So Initalisiere ich.:



CodeBox C
  spi_master_init(PRESCALER_SPI_128,2);


Und hier mit versuche ich was zu lesen.:


CodeBox C
uint8_t AD7124_read_uint8(uint8_t reg)
{
   uint8_t buffer[1] = {0};

   /* build command */   
   buffer[0] = (AD7124_COMM_REG_WEN | AD7124_COMM_REG_RD | AD7124_COMM_REG_RA(reg));
   
   chip_enable_high();  // \CS High
   chip_disable_low(); //  \CS Low  -> start transmission condition

   spi_master_transmit(buffer[0]); // register address
   spi_master_transmit(0x00);   // dummy byte
   buffer[0] = (uint8_t)spi_receive();  // result
   
   chip_enable_high(); // \CS High -> stop transmission condition
   
   return (uint8_t)buffer[0];
}


Chip Enable klappt auch...

Wo ich mir noch nicht sicher bin, was mache ich mit dem SYNC Pin ? Muss ich den zwingend bedienen nur um erstmal die ID aus zu lesen?

Achja.. Ich arbeite aktuell mit 16MHz
 
Wo ich mir noch nicht sicher bin, was mache ich mit dem SYNC Pin ? Muss ich den zwingend bedienen nur um erstmal die ID aus zu lesen?

Ich denke nicht.

Synchronization Input. This pin is a logic input that allows synchronization of the digital filters and analog
modulators when using a number of AD7124-8 devices. When SYNC is low, the nodes of the digital filter,
the filter control logic, and the calibration control logic are reset, and the analog modulator is held in a
reset state. SYNC does not affect the digital interface but does reset RDY to a high state if it is low.
 
Hier sieht man mal die MISO Leitung.
Es sieht für mich fast so aus, als gäbe es ein Pegel Problem. Sieht zumindest so aus als wenn der Chip versuchen würde, die Pegel bereit zu stellen, es aber nicht schafft...?!
 

Anhänge

  • 20160817_0857176546456456450.jpg
    20160817_0857176546456456450.jpg
    711,9 KB · Aufrufe: 7
Ich weiß nun nicht, welchen Mikrocontroller du verwendest und wie du den programmierst. Falls du bei dem Mikrocontroller ISP Programmierung nutzt und die ISP Schnittstelle an den SPI-Pins liegt (ist so bei den "kleineren" AVRs), könnte es sein, dass ein verbundener Programmer das MISO-Signal belastet. Dies würde den aktuellen Pegel erklären.

Weitere Ursache wäre, wenn der MISO Slave-Ausgang Open-Drain wäre (ich denke ist er aber nicht). Oder das Signal hast du an einem falschen Mikrocontroller-Pin, der auf Low ist.

EDIT:
Ist es ein ATmega32U4? Wenn ja, dann ist das PDI ISP Signal am SPI-MISO.
 
Zuletzt bearbeitet:
Ja es ist ein MEGA32U4.
Wenn ich den ISP nicht richtig verdrahtet hätte, könnte ich nicht programmieren oder?
 
PB2 = MOSI
PB3 = MISO

Habe auch schon einen PullUP dran gehauen... > 50kOhm.
Bringt alles nichts...


Ach ja...
Für CS tue ich einen anderen PIN Benutzen, also nicht die Hardware SS Pin.
Ist das dramatisch? Muss der unbedingt benutzt werden, damit die interne SPI Hardware einwandfrei arbeitet?
 
Zuletzt bearbeitet:
Für CS tue ich einen anderen PIN Benutzen, also nicht die Hardware SS Pin.
Ist das dramatisch? Muss der unbedingt benutzt werden, damit die interne SPI Hardware einwandfrei arbeitet?
Nein, das ist egal, da du das SPI Modul als Master nutzt.

Verwendest du den ATmega32U4?
 
Vielleicht ist die spi-initialisierung im mode 3 fuer den adc doch etwas spezieller als es die implementierung fuer den atmega hergibt?
Addi
 

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