Hallo Miteinander Das ist so ziemlich mein erster Post und ich komm gleich mit einem mittelschweren Problem auf Euch zu mit der Bitte mir ein wenig unter die Arme zu greifen. Ich habe einen funktionieren MicroBlaze in einem Virtex5 zum laufen gebracht und bin nun gerade dabei das XPS SPI Interface zum Leben zu erwecken. Ich habe folgendes Problem: Mein MicroBlaze soll als master fungieren. Das SPI-Interface verfügt über die Möglichkeit MOSI und MISO intern zu brücken. Wenn ich diese Brücke aktiviere bekomme ich einen Takt an dem nach Außen gerouteten Pin. Wenn ich allerdins die Brücke deaktiviere ist der Takt tot. Hier ist meine mhs-file: PORT xps_spi_0_SS = xps_spi_0_SS, DIR = IO, VEC = [0:2] PORT xps_spi_0_SCK = xps_spi_0_SCK, DIR = IO PORT xps_spi_0_MISO = xps_spi_0_MISO, DIR = IO PORT xps_spi_0_MOSI = xps_spi_0_MOSI, DIR = IO ... BEGIN xps_spi PARAMETER INSTANCE = xps_spi_0 PARAMETER HW_VER = 2.00.b PARAMETER C_BASEADDR = 0x84418000 PARAMETER C_HIGHADDR = 0x8441807f PARAMETER C_NUM_SS_BITS = 3 PARAMETER C_SCK_RATIO = 2048 BUS_INTERFACE SPLB = mb_plb PORT SS = xps_spi_0_SS PORT SCK = xps_spi_0_SCK PORT MISO = xps_spi_0_MISO PORT MOSI = xps_spi_0_MOSI PORT SPISEL = net_vcc END Und hier ist mein C-Code: #include "xparameters.h" #include "xgpio.h" #include "xstatus.h" #include "mb_interface.h" #include "xuartlite.h" #include "stdio.h" #include "xspi.h" #include "xspi_l.h" static XUartLite RS232_1; static XGpio Testpins; static XSpi SPI_1; #define CHANNEL_1 1 #define CHANNEL_2 2 #define SPI_GROESSE 16 u32 testreg; u8 SendBuf[SPI_GROESSE], RecvBuf[SPI_GROESSE]; int main() { if (XST_SUCCESS != XGpio_Initialize ( &Testpins, XPAR_LEDS_8BIT_DEVICE_ID)) {print ("Fehlerhafte Init LCD_Pins "); return XFALSE;} //Fehlerbehandlung für nicht richtig init. Port // Setzte Datenrichtung (Ausgang) XGpio_SetDataDirection (&Testpins, CHANNEL_1, 0x00); print("\r\nInitialisierung erfolgreich"); XGpio_DiscreteWrite(&Testpins,CHANNEL_1, 0xAA); if (XST_SUCCESS != XSpi_Initialize ( &SPI_1, XPAR_XPS_SPI_0_DEVICE_ID )) {return XFALSE;} //Fehlerbehandlung für nicht richtig init. SPI XSpi_mEnable (&SPI_1); //XSpi_SetOptions (&SPI_1, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION | XSP_LOOPBACK_OPTION); XSpi_SetOptions (&SPI_1, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION ); // SPI_1 starten if (XST_SUCCESS != XSpi_Start ( &SPI_1 ) ) {print("\r\nFehler beim Starten von SPI.");} //testreg = XSpi_mGetControlReg(&SPI_1); // Disable Global SPI INT XSpi_mIntrGlobalDisable(&SPI_1); u16 count; u16 not_desired_slaves = 6; for (count = 0; count < SPI_GROESSE; count++) { SendBuf[count] = count; RecvBuf[count] = 0; } XSpi_mSetSlaveSelectReg ( &SPI_1, not_desired_slaves ) ; while (1) { XSpi_Transfer (&SPI_1,SendBuf,RecvBuf, SPI_GROESSE) ; } } Ich hoffe mir kann der ein oder andere mit einem Tipp behilflich sein. MfG Herki
Hast Du eine Möglichkeit (ModelSim PE/SE o.ä.) um Dein Gesamtsystem zu simulieren? Inklusive MicroBlaze und Software? Versuch das mal. Duke
Grüß Dich Ja ich hab Modelsim zur Verfügung. Aber ich wüsste nicht, was ich damit simulieren sollte. Ich hab auf dem MicroBlaze noch ein VIO-ChipScopeCore - IP installiert. VIO = Virtual Input Output. Damit kann ich halt die Ausgänge anschauen: LOOPBACK an : SCK toggelt LOOPBACK aus : SCK toggelt nicht Mit dem SDK kann ich ja ganz gut debuggen. Alle angesprochenen Register werden ordnungsgemäß initialisiert. Wie gesagt: Wenn ich die LOOPBACK-Option aktiviere bekomme ich am Oszi einen rel. schönen Rechteck-Clock. Wenn ich die Option weglasse bekomme ich keine Ausgangsspannung. Achja... Weil ich da am Anfang bin, soll das SPI-Modul im Polled-Mode laufen. Interrupts hab ich in dem Design überhaupt nicht. MfG Herki
1. Mit ModelSim kannst Du eine Gesamtsystem-Simulation machen. Dazu muß/kann man das Verhalten aller Komponenten die man mit seinem FPGA ansteuert in der Testbench nachbilden. Klingt sehr aufwendig, ist es auch, aber der Aufwand lohnt sich. 2. Wie bindest Du das Chipscope ein? Wird ess instanziert oder per CoreInserter nachträglich eingefügt? 3. Ich weiß nicht, wieviele Warnungen bei Deiner Synthese kommen, aber schau ggf. mal nach ob er etwas wegoptimiert. Du kannst ja auch die log-Dateien von den beiden Synthesen (mit und ohne Loopback) mal vergleichen (diff, WinMerge). Dein Problem klingt ein bisschen nach wegoptimierten Signalen. Duke
Zu 3. Beim MicroBalze ist es ja so, dass nur der Softcore (inklusieve RAM) synthetisiert wird. Für das Programm wird eine executable.elf Datei geschrieben. Das C-Programm (in dem ja die Einstellungen getroffen werden) wird in den synthetisierten BRAM geschrieben. Somit hat das Programm doch gar nichts mit der Synthese zu tun. Außerdem kann ich das Programm debuggen und sehe, dass die Bits in den SPI-Controllregistern gesetzt werden Zu 2. Das Chipscope besteht eigentlich aus 2 Teilen. Zum einen das VIO (Virtual Input Output) und das ICON (Integrated Controller (=Steuerung von VIO)) Die Chipscope-Komponenten werden im XPS-EDK unter "Debug"--> "Debug-Configuration" hinzugefügt. Es erscheint dann im System Assembly View wie der Clockgenerator. Die Werte kann ich dann über das Programm ChipscopePro Analyzer auslesen. Also es wird nicht als Core irgendwie eingefügt (denk ich). Zu 1. Wegen dem Nachbilden... Das ist so eine Sache. ;-) Ich benutze den Xilinx-SPI-Core. Prinzipiell muss der ja funktioniern. Ist immerhin schon die 5. Version. Denke, dass es eher eine Fehlbedienung meinerseits ist. Hast Du einen MicroBlaze daheim? MfG Herki
Ok, ich bin bisher davon ausgegangen, das das Loopback per Hardware oder generic aktiviert wird und nicht in Software. Somit sollten die Syntheselogfiles identisch sein. Deinen c-code habe ich mir erst jetzt angeschaut, der ganze Xmist liest sich so schlecht. zu ChipScope: Warum nimmst Du nicht den ILA (+ICON)? Der ist doch genau für sowas gemacht. Ich könnte mir vorstellen, das VIO zu langsam ist für eine SPI-Aufzeichnung. Vielleicht ackerst Du nochmal die Dokumentation zum SPI-Modul durch und schaust, ob Dir was auffällt. Oder Du verwendest mal die google-Codesuche und schaust, wie andere das gemacht haben. Nein, zu Hause habe ich keinen MicroBlaze sondern den soc-lm32. Duke
Naja... Ich soll halt den Xilinx MicroBlaze inbetriebnehmen. Ich denke schon auch, dass es eine Softwaresache ist oder dass der Core noch nie so richtig funktioniert hat. Ich habs im Moment auf später verschoben. Ich hab die Doku schon mehrmals gelesen. Ich wüsste nicht, was ich vergessen haben könnte. Wäre toll wenn sich mal jemand bei mir melden würde, der den SPI-Core von Xilinx erfolgreich inbetriebgenommen hat. MfG Herki
ich versuch auch gerade den XPS _IP Core für die Ansteuerung einer SD Card zu verwenden, aber leider tut sich gar nix. Hat es inzwischen schon jemand hinbekommen ? und den Code mal zeigen ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.