Forum: FPGA, VHDL & Co. Microblaze und Spi-Core


von Martin (Firma: Angestellt) (herki)


Lesenswert?

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

von Duke Scarring (Gast)


Lesenswert?

Hast Du eine Möglichkeit (ModelSim PE/SE o.ä.) um Dein Gesamtsystem zu 
simulieren? Inklusive MicroBlaze und Software? Versuch das mal.

Duke

von Martin (Firma: Angestellt) (herki)


Lesenswert?

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

von Duke Scarring (Gast)


Lesenswert?

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

von Martin (Firma: Angestellt) (herki)


Lesenswert?

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

von Duke Scarring (Gast)


Lesenswert?

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

von Martin (Firma: Angestellt) (herki)


Lesenswert?

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

von David (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.