Hallo,
ich implementiere in meinem FPGA (Digilent CMOD7 mit einem Artix7 35)
eine Hardware, die ich als ein SPI Slave ansteuern will. Dazu benutze
ich dieses Modul
https://github.com/nandland/spi-slave/blob/master/Verilog/source/SPI_Slave.v
Als Master benutze ich ein Nucleo Board mit einem STM32L552. Mein
Problem ist, das ich zwischen FPGA und MCU keine zuverlässige Verbindung
aufbauen kann. Ständig passieren Übertragungsfehler (nach ~100kB an
Daten). Bei Debug Versuchen haben ich mir die Clock von dem SPI Slave im
always Block ausgeben lassen, mit diesem Testcode:
1 | always @(posedge i_SPI_Clk or posedge i_SPI_CS_n)
|
2 | begin
|
3 | if (i_SPI_CS_n)
|
4 | begin
|
5 | o_SPI_DBG <= 0;
|
6 | end
|
7 | else
|
8 | begin
|
9 | o_SPI_DBG <= ~o_SPI_DBG;
|
10 | end
|
11 | end
|
und dabei festgestellt, das manchmal auch zur fallenden Flanke von
i_SPI_Clk getacktet wird. Gemessen habe ich alles über einen Logic
Analyzer. Das ist nicht immer der Auslöser von Übertragungsfehlern, aber
sehr oft.
Dabei ist auch kurrios: SPI Frequenzen von unter 1MHz scheinen
problemlos zu funktionieren, dadrüber bekomme ich ziemlich sicher
Übertragungsfehler. Auch Kurios: Mit einem RPi Pico funktioniert es
problemlos, auch bei Frequenzen um die 30MHz.
Die SPI Verbindung ist über Jumper Wires auf einem Breadboard
ausgeführt. Kabellängen sind ca 20cm.
Der i_SPI_Clk benutzt einen clock eingang im FPGA.
Ich muss ehrlich sagen, ich bin gerade ziemlich Ratlos was hier schief
läuft und hoffe, hier ein paar Ideen zu bekommen, was ich ausprobieren
könnte. Leider habe ich kein Oszi um mir die Clockleitung genau
anzuschauen. Ich kann sie nur mit 50MHz mit dem Logic Analyzer
absamplen. Das reicht sicherlich um eine Idee von dem Signal zu
bekommen, aber reicht wohl bei weitem nicht für eine Analyse.
Ein weiterer Versuch war ein Serienwiderstand in die Clockleitung rein
zu setzen. Das hat ein wenig geholfen, habe werte von 22-39Ohm
ausprobiert, aber der große Schuss wars jetzt nicht. Bei den Versuchen
habe ich den Widerstand direkt ins Nucleoboard gesteckt und bin dann
über ein Jumperwire zum FPGA.
So, nun bitte ich um Hilfe, was könnte hier schief laufen? Mache ich
hier was grundsätzlich falsch? Wie sieht es z.B. aus, das der SPI Slave
das Clock Signal vom SPI als Clock benutzt? Wäre es besser den SPI
direkt mit dem FPGA Clock zu samplen?
Vielen Dank
Tobias