Saturday 10 November 2018

Manual SPI interface on Raspberry PI


I am trying to control a MCP4131 digital pot from my Raspberry Pi using this library.


Using the GPIO pins, I am "emulating" an SPI interface. I bring the ChipSelect pin to low, write my byte, then bring it high again.



When I plug my meter into the wiper, I get a constant voltage. It's not changing. Is there something wrong with my code in 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);
}
}

Please note: all the 3 GPIO pins are working as they should.



Answer



The MCP4131 uses an annoying "multiplexed" SPI implementation.


enter image description here


To write to the MCP4131, you cannot just write 8 bits. You need to write 16 bits. They are described in the datasheet.


enter image description here



You will want to use address 0 (Volatile wiper #0) and command 0, with the data being your value prefixed by zeroes. In other words, clock out eight zero bits before your value and you'll be OK.


enter image description here


I wish Microchip didn't put all their SPI digital pots into one datasheet. It makes the datasheet harder to read.


Also, double check the voltage across P0A and P0B (the ends of the resistor). If you don't have voltage there, changing the pot tap won't change the wiper voltage.


No comments:

Post a Comment

arduino - Can I use TI&#39;s cc2541 BLE as micro controller to perform operations/ processing instead of ATmega328P AU to save cost?

I am using arduino pro mini (which contains Atmega328p AU ) along with cc2541(HM-10) to process and transfer data over BLE to smartphone. I...