Interfaz SPI manual en Raspberry PI

Estoy tratando de controlar un potenciómetro digital MCP4131 desde mi Raspberry Pi usando esta biblioteca .

Usando los pines GPIO, estoy "emulando" una interfaz SPI. Llevo el pin ChipSelect a bajo, escribo mi byte y luego lo vuelvo a subir.

Cuando conecto 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 : los 3 pines GPIO funcionan como deberían.

Ya que está haciendo esto manualmente, debería poder hacerlo en un solo paso (¿quizás con la tecla de retorno?) y sondear las líneas (conectar LED a ellas, etc.) y verificar que están cambiando en la secuencia necesaria. O una vez que haya verificado el control de las líneas, puede simplemente imprimir una tabla de las configuraciones en la consola cada vez que las cambie y verificar a partir de eso.
¿Qué frecuencia de reloj estás generando allí? De la hoja de datos, parece que el MCP4131 espera una velocidad de reloj máxima de 10 MHz, ¿una Raspberry Pi que funciona a 700 MHz no generaría un reloj un poco más rápido que con el código anterior?
No veo retrasos en su rutina SetValue. Está alternando las líneas SPI a la máxima velocidad, lo que probablemente sea más rápido de lo que puede manejar el esclavo SPI.
BusPirate es tu amigo. O simplemente un osciloscopio.
@microtherion ¿Necesito dormir entre dos cloclpin.writelíneas?
Podría ser mejor dormir después de cada uno clockpin.Write. Comience con un sueño de 1 µs más o menos, y si eso funciona, intente moverse hacia el mínimo teórico de 50 ns.
Pasé a través de él ... una línea a la vez, y todos los valores se escriben correctamente. Pedí un autobús pirata en Amazon, con suerte eso ayudará.
@microtherion He aumentado el retraso de tiempo y no hay cambios... todavía no funciona.
Muestre un esquema de cómo se conecta el potenciómetro digital.
Usted sabe que necesita aplicar voltaje a través de la olla antes de medir un voltaje en el limpiaparabrisas, ¿verdad? No es un DAC.
Chris: ¿podría publicar sus pinouts de trabajo finales y el código para el MCP4131 y Raspberry Pi? La comunidad realmente lo apreciaría, ¡gracias!

Respuestas (1)

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

ingrese la descripción de la imagen aquí

Para escribir en el MCP4131, no puede escribir solo 8 bits. Necesitas escribir 16 bits. Se describen en la hoja de datos.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

Además, verifique dos veces el voltaje entre P0A y P0B (los extremos de la resistencia). Si no tiene voltaje allí, cambiar el grifo del potenciómetro no cambiará el voltaje del limpiaparabrisas.

Impresionante, eso funcionó. ¡Muchas gracias! ¿Cuál es el propósito de la implementación "multiplexada"? ¿Por qué lo hacen?