Forum: FPGA, VHDL & Co. Vivado SDK: Registerlesen


von derVerzweifelte (Gast)


Lesenswert?

Hallo zusammen,
ich habe ein Zybo Z7-20 und möchte damit eine AD Wandlung im Event-Modus 
durchführen.
Dazu hab ich mich ein bisschen eingelesen und festgestellt, dass man um 
die Wanldung zu aktivieren im Register 0x0C das LSB 1 setzen muss. Ich 
verwende die Library xadcps.h
1
XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), 0x0C, 0x1);

Nun debugge ich das ganze und lese das Register aus und stelle fest, 
dass die 1 im LSB nicht übernommen wurde.

Hat jemand von Euch Erfahrungen damit, wo ich meinen Fehler habe?
Übrigens Ich setzte das Signal anschließend sofort wieder zurück!

Hoffe jemand kann dem Verzweifelten helfen :P
VG Andi

von VHDL hotline (Gast)


Lesenswert?

Laut PG901 ist das Register write-only und ein Zurücklesen liefert 
"undefined values".

von VHDL hotline (Gast)


Lesenswert?

Edit: PG091

von derVerzweifelte (Gast)


Lesenswert?

Ahh oke. Das erklärt aber noch lange nicht, weshalb dann meine AD 
Wandlung nicht läuft.
Also weshalb EOS anschließend nie high wird!

von VHDL-Polizei (Gast)


Lesenswert?

Wenn du uns ein wenig mehr Code überlassen könntest könnte man dir 
eventuell helfen. So ist es Fischen im Trüben.

von derVerzweifelte (Gast)


Lesenswert?

Sehr gerne!

Vivado+SDK 2018.2 mit Zybo Z7-20.
XADC mit event-driven Mode.

So laut PG091 kann ich über CONVST den XADC sampeln.
In das Register 0x0C kann ich die Konvertierung starten lassen. Der Code 
dazu zum Auslesen ist ja oben abgebildet.

Und danach warte ich eigentlich nur noch auf EOS (ist ja mit CONVST 
verbunden). Und hier passiert nichts mehr. Der Interrupt wird nie 
erkannt.
1
#include <stdio.h>
2
#include "xadcps.h"
3
#include "sleep.h"
4
#include "xtime_l.h"
5
6
#define XADCPS_DEVICE_ID  XPAR_PS7_XADC_0_DEVICE_ID
7
8
XAdcPs XAdcPtr;
9
XTime stamp[1];
10
u32  test=0;
11
12
int main(void)
13
{
14
  XAdcPs_Config *ConfigPtr;
15
  int status;
16
17
  ConfigPtr = XAdcPs_LookupConfig(XADCPS_DEVICE_ID);
18
  if (ConfigPtr == NULL)
19
  {
20
    return XST_FAILURE;
21
  }
22
  status = XAdcPs_CfgInitialize(&XAdcPtr, ConfigPtr, ConfigPtr->BaseAddress);
23
  if (status != XST_SUCCESS)
24
  {
25
    return XST_FAILURE;
26
  }
27
28
  //set CONVST first time high
29
  XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET, 0x0);    //set CONVST to 0
30
  usleep(500);
31
  XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET, 0x1);    //set CONVST to 1 (rising edge)
32
  usleep(2);
33
  XAdcPs_WriteReg((&XAdcPtr)->Config.BaseAddress, XADCPS_MSTS_OFFSET, 0x0);    //set CONVST back to 0
34
  usleep(1000);
35
36
37
  while(1)
38
  {
39
    if (((XAdcPs_ReadReg((&XAdcPtr)->Config.BaseAddress, XADCPS_INT_STS_OFFSET)) & 0x20) == 0x20) //if EOS is high
40
    {
41
      XTime_GetTime(&stamp[0]);
42
      break;
43
    }
44
    test++;
45
  }
46
47
  printf("%llu\n", (unsigned long long)stamp[0]);
48
  printf("Successful!\n");
49
50
  return XST_SUCCESS;
51
}

von derVerzweifelte (Gast)


Lesenswert?

So ich habe jetzt gerade einen Test gemacht.
Wenn ich das kontinuierliche Samplen aktiviere, dann ich auf dem Oszi 
das EOS/EOC Signal sehen, aber ein Auslesen über XAdcPs_ReadReg aus dem 
Statusregister ist nicht möglich.

Verwende ich den Event-getriggerten Modus, funktioniert XAdcPs_WriteReg 
in das 0x0C Register (Aktivierung der Konvertierung zu Beginn durch 
CONVST) nicht und somit läuft die ganze Konvertierung nicht.

von VHDL hotline (Gast)


Lesenswert?

Hast du das externe CONVST-Signal belegt?
Das CONVST startet den Samplingprozess bei einer steigenden Flanke. 
Allerdings wird das CONVST, das du ins Register schreibst, mit dem 
externen CONVST verODERt. Wenn auf dem externen Signal bereits ein high 
liegt, bekommst du keine steigende Flanke durchs Registerschreiben.

von derVerzweifelte (Gast)


Lesenswert?

Wie muss ich das externe CONVST-Signal belegen? Ich habe in meinem 
Blockdiagramm von EOS eine Verbindung zu CONVST (XADC_Wiz-Block) 
gezogen.

Wie im Programmcode zu sehen ist, schreibe ich zuerst eine 0 in das Bit 
des Registers und dann erst die 1 und dann wieder die Null.

derVerzweifelte schrieb:

>   XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET,
> 0x0);    //set CONVST to 0
>   usleep(500);
>   XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET,
> 0x1);    //set CONVST to 1 (rising edge)
>   usleep(2);
>   XAdcPs_WriteReg((&XAdcPtr)->Config.BaseAddress, XADCPS_MSTS_OFFSET,
> 0x0);    //set CONVST back to 0
>   usleep(1000);

Das Auslesen des Bits (im kontinuierlichen Sampling-Modus) -hier kann 
ich mit dem Oszi EOS messen- funktioniert zudem nicht.
Also habe ich irgendwie keinen Schreib-/Lesezugriff

von derVerzweifelte (Gast)


Lesenswert?

Mal eine spontane Frage dazu, brauche ich als Interface DRP oder kann 
ich auch AXI verwenden, bei Registerzugriffen (wie ja hier benötigt)?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.