Deel 4: Communicatie via SPI
Dit deel is specifiek voor de combinatie van Raspberry Pi en LitexCNC. Een PC heeft normaliter geen SPI-poort en kan daarom alleen via ethernet met de LED-kaart communiceren.
De voordelen van SPI boven ethernet zijn:
- Minder overhead. Via ethernet kost het verzenden en ontvangen van data tijd. Het verzenden en ontvangen van data (een zogeheten round-trip) kost ongeveer 0,2 ms. Je kan dit controleren door ping <ip-adres> uit te voeren op een ethernet-versie van de LED-kaart. Voor iedere cyclus van LinuxCNC zijn in totaal 3 round-trips nodig: 1) lezen van gegevens van de kaart (2 round-trips) en 2) schrijven van nieuwe gegevens naar de kaart (1 round-trip). Dit betekent dat in totaal circa 0,6 ms van de cyclus wordt besteed aan communicatie! Dat is best wel veel voor een cyclus die in totaal 1 ms duurt.
- Makkelijkere firmware. De firmware zonder ethernet is lichter, waardoor de LED-kaart op een hogere frequentie kan draaien en het compileren van de firmware sneller gaat.
Er is ook een nadeel: SPI loopt via de HUB75 headers van de LED-kaart en bestaat uit input en output. De buffers op de LED-kaart moeten daarom vervangen worden.
De firmware
Onderstaand is de firmware voor het voorbeeld, noem het bestand 'blink_spi.json'.
Code: Selecteer alles
{
"board_name": "blink",
"board_type": "5A-75E v6.0",
"clock_frequency": 35000000,
"connection": {
"connection_type": "spi",
"mosi": "j5:14",
"miso": "j5:12",
"clk": "j5:13",
"cs_n": "j5:11"
},
"modules": [
{
"module_type": "gpio",
"instances": [
{"direction": "in", "pin":"j1:0"},
{"direction": "out", "pin":"j1:2"},
]
}
]
}
Bovenstaande indeling is gelijk aan de verbindingen op de HU75HAT!
De firmware kan nu gebouwd worden met het volgende commando:
Flashen firmware
Na het bouwen van de firmware is de gecompileerde firmware the vinden in de map
/blink_spi/gateware (relatief gezien vanaf de plaats waar de configuratie staat). Om de firmware te gebruiken we de GPIO van de Raspberry Pi. De volgende links moeten worden gelegd, dit kan met jumper wires:
- GPIO header pin 36 -> J27 (TCK)
- GPIO header pin 31 -> J31 (TMS)
- GPIO header pin 35 -> J32 (TDI)
- GPIO header pin 37 -> J30 (TDO)
- GPIO GND naar GND van de LED kaart
Bovenstaande indeling is gelijk aan de verbindingen op de HU75HAT!
Wanneer de verbinding is gelegd kan de firmware worden geflasht met het volgende commando:
Code: Selecteer alles
litexcnc flash_firmware /blink_spi/gateware/colorlight.svf
De volgende output zal worden gegenereerd (paden kunnen verschillen) wanneer het flashen goed gaat:
Code: Selecteer alles
Open On-Chip Debugger 0.12.0+dev-00290-g2e60e2eca (2023-08-21-22:34)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
SysfsGPIO nums: swclk = 11, swdio = 25
jtag
Info : SysfsGPIO JTAG/SWD bitbang driver
Info : JTAG tap: ecp5.tap tap/device found: 0x41111043 (mfg: 0x021 (Lattice Semi.), part: 0x1111, ver: 0x4)
Warn : gdb services need one or more targets defined
svf processing file: "/home/emco5/git/emco5/firmware/emco5_spi/gateware/colorlight.svf"
95%
Bedraden
Wanneer gebruik wordt gemaakt van de HUB75HAT, dan kan deze stap worden overgeslagen: alle verbindingen worden dan geregeld door de HBU75HAT.
Onderstaande afbeelding geeft de SPI op de RasberryPi weer.
De volgende links moeten worden gelegd, dit kan met jumper wires:
- GPIO header pin 19-> J5, pin 15 (MOSI)
- GPIO header pin 21-> J5, pin 13 (MISO)
- GPIO header pin 23 -> J5, pin 14 (CLOCK)
- GPIO header pin 24 -> J5, pin 12 (CS)
- GPIO GND naar GND van de LED kaart
LET OP: In bovenstaande lijst worden pin-nummer gebruikt (start bij pin 1), terwijl in de configuratie gestart wordt bij 0!
LED aansturen met halrun
Met
halrun kunnen HAL-commando's worden uitgetest en kan worden opgestart met:
In de terminal die vervolgens verschijnt kunnen vervolgens commando's worden ingegeven. Om de LED aan te sturen, maken we eerst verbinding met de LED-kaart en zorgen dat deze in het proces van de HAL komt te hangen. Hierbij is het van belang dat de status LED-kaart eerst wordt gelezen, daarna kan de HAL met deze informatie de nieuwe gewenste staat berekenen, waarna deze wordt weggeschreven naar de LED-kaart.
Code: Selecteer alles
loadrt litexcnc connections="pigpio:0:1000000"
loadrt threads name1=test-thread period1=1000000
# Add litexcnc to the thread
addf blink.read test-thread
addf blink.write test-thread
start
Vervolgens kan de LED worden aangezet met het volgende commando:
En weer worden uitgezet met:
Type
exit om
halrun weer te verlaten.
Uitleg connection string
In bovenstaand voorbeeld wordt de connection string
pigpio:0:1000000 gebruikt om verbinding te leggen via SPI. Deze string bestaat uit drie delen
<driver>:<cs>:<speed>:
- driver: voor SPI zijn er twee drivers beschikbaar. Voor de Raspberry Pi levert pigpio de beste resultaten.
- cs: op welke CS-pin is de kaart aangesloten. De Raspberry Pi heeft twee CS pinnen: 0 en 1. In dit voorbeeld is de LED-kaart aangesloten op CS0.
- speed: de communicatiesnelheid in Hz. In dit voorbeeld is de snelheid dus 1 MHz. Een te hoge snelheid leidt tot informatie die niet goed aankomt. Als dit het geval is, dan zal de kaart niet worden herkend en wordt een foutmelding gegeven. Aanbevolen snelheid ligt tussen 1 MHz en 2 MHz voor de huidige firmware.
Assumptions are the mother of all $%^& ups.
Twee keer meten is zeker weten, als je weet wat je meet...