Manuelle SPI-Schnittstelle auf Raspberry PI

Ich versuche, mit dieser Bibliothek einen digitalen Topf MCP4131 von meinem Raspberry Pi aus zu steuern .

Mit den GPIO-Pins "emuliere" ich eine SPI-Schnittstelle. Ich bringe den ChipSelect-Pin auf Low, schreibe mein Byte und bringe ihn dann wieder auf High.

Wenn ich mein Messgerät an den Scheibenwischer anschließe, bekomme ich eine konstante Spannung. Es ändert sich nicht. Stimmt etwas mit meinem Code in nicht POT.cs?

class Program {
    static void Main(string[] args) {

        GPIOMem cs = new GPIOMem(GPIOPins.GPIO_17);
        GPIOMem clock = new GPIOMem(GPIOPins.GPIO_23);
        GPIOMem sdisdo = new GPIOMem(GPIOPins.GPIO_22);

        var pot = new POT(clock, sdisdo, cs);

        while (true) {
            for (uint level = 0; level <= 127; level++) {
                pot.SetValue(level);
                Thread.Sleep(100);
            }

            for (uint level = 127; level >= 0; level--) {
                pot.SetValue(level);
                Thread.Sleep(100);
            }
        }           
    }
}

Pot.cs

public class POT {
    private GPIO clockpin;
    private GPIO mosipin;        
    private GPIO cspin;

  public POT(GPIO SPICLK, GPIO SPIMOSI, GPIO SPICS) {
        clockpin = SPICLK;
        mosipin = SPIMOSI;
        cspin = SPICS;
    }

    public void SetValue(uint value) {
        Console.WriteLine("here");
        cspin.Write(true);

        clockpin.Write(false); // #start clock low
        cspin.Write(false); // #bring CS low

        BitArray b = new BitArray(BitConverter.GetBytes(value));
        Console.WriteLine(value);
        for (int i = 8; i > 0; i--) {
            mosipin.Write(b[i]);
            clockpin.Write(true); //cycle the clock
            clockpin.Write(false); //yucle the clock
        }
        cspin.Write(true);
    }
}

Bitte beachten Sie : Alle 3 GPIO-Pins funktionieren wie sie sollten.

Da Sie dies manuell tun, sollten Sie in der Lage sein, es in einem einzigen Schritt zu machen (vielleicht mit der Eingabetaste?) und die Leitungen zu prüfen (LEDs mit ihnen zu verdrahten usw.) und zu überprüfen, ob sie sich in der erforderlichen Reihenfolge ändern. Oder sobald Sie die Kontrolle über die Leitungen überprüft haben, können Sie jedes Mal, wenn Sie sie ändern, einfach eine Tabelle der Einstellungen auf der Konsole ausdrucken und anhand dieser überprüfen.
Welche Taktrate erzeugst du da? Aus dem Datenblatt geht hervor, dass der MCP4131 eine maximale Taktrate von 10 MHz erwartet. Würde ein Raspberry Pi, der mit 700 MHz arbeitet, mit dem obigen Code nicht einen wesentlich schnelleren Takt erzeugen?
Ich sehe keine Verzögerungen in Ihrer SetValue-Routine. Sie schalten die SPI-Leitungen mit maximaler Geschwindigkeit um, was sehr wahrscheinlich schneller ist, als der SPI-Slave verarbeiten kann.
BusPirate ist dein Freund. Oder einfach ein Oszilloskop.
@microtherion Muss ich zwischen zwei cloclpin.writeZeilen schlafen?
Vielleicht ist es am besten, nach jedem zu schlafen clockpin.Write. Beginnen Sie mit einem Schlaf von etwa 1 µs, und wenn das funktioniert, versuchen Sie, sich dem theoretischen Minimum von 50 ns zu nähern.
Ich bin es durchgegangen ... eine Zeile nach der anderen, und alle Werte werden korrekt geschrieben. Ich habe bei Amazon einen Buspirat bestellt, hoffentlich hilft das.
@microtherion Ich habe die Timing-Verzögerung erhöht und keine Änderung ... funktioniert immer noch nicht.
Bitte zeigen Sie schematisch, wie der digitale Topf angeschlossen ist.
Sie wissen, dass Sie eine Spannung über den Topf anlegen müssen, bevor Sie eine Spannung am Schleifer messen, richtig? Es ist kein DAC.
Chris - Würden Sie bitte Ihre endgültigen funktionierenden Pinbelegungen und den Code für den MCP4131 und den Raspberry Pi posten? Die Community würde sich sehr darüber freuen - thx!

Antworten (1)

Der MCP4131 verwendet eine störende "gemultiplexte" SPI-Implementierung.

Geben Sie hier die Bildbeschreibung ein

Um in den MCP4131 zu schreiben, können Sie nicht einfach 8 Bit schreiben. Sie müssen 16 Bit schreiben. Sie sind im Datenblatt beschrieben.

Geben Sie hier die Bildbeschreibung ein

Sie sollten die Adresse 0 (flüchtiger Wischer Nr. 0) und den Befehl 0 verwenden, wobei die Daten Ihr Wert mit vorangestellten Nullen sind. Mit anderen Worten, takten Sie acht Nullbits vor Ihrem Wert aus, und Sie sind in Ordnung.

Geben Sie hier die Bildbeschreibung ein

Ich wünschte, Microchip hätte nicht alle seine digitalen SPI-Pots in einem Datenblatt zusammengefasst. Das macht das Datenblatt schwerer lesbar.

Überprüfen Sie auch die Spannung an P0A und P0B (den Enden des Widerstands). Wenn Sie dort keine Spannung haben, ändert das Ändern des Topfhahns die Schleiferspannung nicht.

Super, das hat funktioniert. Vielen Dank! Was ist der Zweck der "gemultiplexten" Implementierung. Warum tun sie es überhaupt?