Ich versuche, ein SPI-Gerät auf meinem Angstrom Linux (Kernel-Version 3.10) zu registrieren, um einen ADC-Chip (LTC2258) für mein benutzerdefiniertes Board zu verwenden. Der Prozessor, den I2m verwendet, ist Cyclone V, und die FPGA-Übergaben scheinen korrekt zu sein (SPI Master 1 wird an HPS übergeben). Also habe ich meine .dtb-Datei wie folgt bearbeitet:
spi@0xfff01000 {
compatible = "snps,dw-spi-mmio-15.0", "snps,dw-spi-mmio";
reg = <0xfff01000 0x100>;
interrupt-parent = <0x3>;
interrupts = <0x0 0x9b 0x4>;
clocks = <0x21>;
#address-cells = <0x1>;
#size-cells = <0x0>;
bus-num = <0x0>;
num-chipselect = <0x4>;
status = "okay";
spidev@0 {
compatible = "spidev";
reg = <0x0>;
spi-max-frequency = <0x5f5e100>;
};
};
Beim Kernel-Boot sagt es nur Folgendes über SPI:
root@cyclone5:~# dmesg | grep -i spi
[ 0.652554] dw_spi_mmio fff01000.spi: master is unqueued, this is deprecated
Aber spidev0.0
der Eintrag erscheint unter /dev
. Mit dem Standardprogramm spidev_test
sehe ich diese Ausgabe:
root@cyclone5:~# ./spi_d -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF
Und da ist die Sache: Die SPI-Schnittstelle dieses ADC wird zur Konfiguration verwendet. Der Testfall für mich besteht also darin, Konfigurationswerte in Register mit angegebenen Adressen zu schreiben und sie erfolgreich zurückzulesen. Also ändere ich den tx-Puffer aus dem Quellcode; Ich schreibe und lese die Register zurück. Aber es gibt mir das gleiche Ergebnis, volle FFs.
Im Datenblatt von ADC steht:
Also habe ich den Code entsprechend angepasst. Ich verwende meinen modifizierten spidev_test mit diesen Parametern:
./spi_d2 -D /dev/spidev0.0 -b 16 -s 100000000
Aber wie ich schon sagte, das Ergebnis ist voll. Auch das Ändern von Parametern Bits pro Wort wirkt sich nicht auf das Ergebnis aus.
Wie kann ich das debuggen? Wo soll ich suchen? Jede Hilfe ist willkommen. Vielen Dank im Voraus.
Es stellte sich heraus, dass ich über den Chip-Select-Pin des ADC falsch informiert war. Das Ändern des Werts des untergeordneten Spidev-Knotens reg
auf 1 löste das Problem. Letzte Parameter, die ich verwende, sind:
./spi_d -D /dev/spidev0.1 -b 16 -H -O
Entschuldigen Sie die Zeitverschwendung und danke für Ihre Hilfe!
Schließen Sie einen Logikanalysator oder ein Oszilloskop an, um zu sehen, ob sich die Signale tatsächlich ändern (CS, SCK und MOSI), und verbinden Sie dann MOSI mit MISO, um zu sehen, ob Sie empfangen können, was Sie senden. Stabiles 0xFF oder 0x00 zeigt normalerweise an, dass die Leitung feststeckt und nirgendwo verbunden ist.
Stellen Sie sicher, dass die Taktgeschwindigkeit nicht schneller als 25 MHz (aus dem Datenblatt) ist und die Taktpolarität und -phase richtig eingestellt ist (CPOL = 0, CPHA = 0)
CapnJJ
spi mode: 0
passt das für dich (?)ddyn