Interfaz SPI manual en Raspberry PI

4

Estoy tratando de controlar un pote digital MCP4131 desde mi Raspberry Pi usando esto biblioteca .

Al usar los pines GPIO, estoy "emulando" una interfaz SPI. Traigo el pin ChipSelect a bajo, escribo mi byte, luego lo coloco de nuevo.

Cuando enchufo mi medidor en el limpiaparabrisas, obtengo un voltaje constante. No está cambiando. ¿Hay algún problema con mi código en 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);
    }
}

Tenga en cuenta : todos los 3 pines GPIO funcionan como deberían.

    
pregunta Chris Kooken

1 respuesta

4

El MCP4131 usa una implementación SPI "multiplexada" molesta.

ParaescribirenelMCP4131,nopuedesimplementeescribir8bits.Necesitasescribir16bits.Sedescribenenlahojadedatos.

Querrá usar la dirección 0 (limpiador volátil # 0) y el comando 0, con los datos siendo su valor prefijado por ceros. En otras palabras, anote ocho bits cero antes de su valor y estará bien.

Desearía que Microchip no pusiera todas sus ollas digitales SPI en una hoja de datos. Hace que la hoja de datos sea más difícil de leer.

También, verifique dos veces el voltaje en P0A y P0B (los extremos de la resistencia). Si no tiene voltaje allí, al cambiar la toma del recipiente no cambiará el voltaje del limpiador.

    
respondido por el markrages

Lea otras preguntas en las etiquetas