9 years, 2 months ago.

MCP4151 hookup

I am trying to get an MCP4151 SPI digital resistor working with the mbed 1768.

Here is my code thus far:

Expression

#include "mbed.h"

SPI spi(p5, NC, p7); // mosi, miso, sclk
DigitalOut cs(p8);

int main()
{
    cs = 1;
    spi.format(8,0);
    spi.frequency(1000000);

    for (int level = 0; level < 1; level++) {
        cs = 0;
        spi.write(0);
        spi.write(level);
        cs = 1;
        wait(10);
    }
    while(1) {
    }
}

I can't seem to make it work! The chip has a combined MISO and MOSI so I have connected the mbed MOSI via a 3.9kOhm resistor to the chips combined data line.

I have the chip working with an Arduino using the following code but clearly the SPI libraries differ and I have no idea why my translation from one to the other is failing. Is there something I am missing? Thanks!

Expression

#include <SPI.h>
#include <avr/io.h>

const int slaveSelectPin = 10;

void setup() {
  Serial.begin(9600); 
  pinMode (slaveSelectPin, OUTPUT);
  SPI.begin(); 
  SPI.setClockDivider(SPI_CLOCK_DIV128); //depends on resistors
}

void loop() {
  for (int level = 0; level < 256; level++) {
      digitalWrite(slaveSelectPin,LOW);
      SPI.transfer(0);
      SPI.transfer(level);
      digitalWrite(slaveSelectPin,HIGH);

      Serial.println(analogRead(A0)); 
      delay(10);  
    }
    while(1) {
    }
}

EDIT: Just tried with the following simplified code for the mbed. The LED I have hooked up will light up in the range of 200-256 for the write value but only once. The loop function seems to be unable to change the value from the first write call. I have tried doing spi.write with multiple values and it seems to work but just not in a loop or if repeated.

Expression

#include "mbed.h"

SPI spi(p5, NC, p7); // mosi, miso, sclk
DigitalOut cs(p8);

int main()
{
    cs = 1;
    spi.format(16,3);
    spi.frequency(1000000);

    cs = 0;
    spi.write(255);
    cs = 1;
    wait(100);

    while(1) {
    }
}

This does not work:

Expression

#include "mbed.h"

SPI spi(p5, NC, p7); // mosi, miso, sclk
DigitalOut cs(p8);

int main() {
    cs = 1;
    spi.format(16,3);
    spi.frequency(1000000);
    while(1) {

        cs = 0;
        spi.write(255);
        cs = 1;
        wait(100);
        cs = 0;
        spi.write(0);
        cs = 1;        
    }
}

It appears, from further testing that the SPI library does not play well with the wait() function

posted by Toby O'Connell 18 Feb 2015

1 Answer

9 years, 2 months ago.

Hi Toby,

Haven't used this library yet, however your line 12 looks suspect

you define level as an int (integer) and then step with a 0.01

line 14 of your original code for the arduino looks right.

The SPI.write class expects an integer.

Regards

Martin

Just corrected that. I did in fact try with normal incrementation but to no avail.

posted by Toby O'Connell 18 Feb 2015