Here's the code for the Microchip MCP4261 http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en531252.
Right now it's in bit banging mode (as in note using native spi, but it's very, very fast).
//Barry's hacky functions
byte value;
byte sendBit(boolean state)
{
digitalWrite(SPICLOCK,LOW);
delayMicroseconds(10);
digitalWrite(DATAOUT,state);
digitalWrite(SPICLOCK,HIGH);
delayMicroseconds(10);
}
byte sendValue(int wiper, int val)
//tested cycle time for this function is ~565 microseconds.
{
value = byte(val);
//digitalWrite(SPICLOCK,LOW);
//digitalWrite(DATAOUT,LOW);
digitalWrite(SLAVESELECTP,LOW);
delayMicroseconds(10);
//Select wiper
for(int i=0;i<3;i++){
sendBit(false);
}
sendBit(wiper);
//write command
for(int i=0;i<4;i++){
sendBit(false);
}
//data
sendBit(HIGH && (value & B10000000));
sendBit(HIGH && (value & B01000000));
sendBit(HIGH && (value & B00100000));
sendBit(HIGH && (value & B00010000));
sendBit(HIGH && (value & B00001000));
sendBit(HIGH && (value & B00000100));
sendBit(HIGH && (value & B00000010));
sendBit(HIGH && (value & B00000001));
//sendBit(true); //fudge
digitalWrite(SLAVESELECTP,HIGH);
//Serial.println(in);
delayMicroseconds(10);
}
byte readWiper()
{
//send read command
digitalWrite(SLAVESELECTP,LOW);
delayMicroseconds(10);
sendBit(false);
sendBit(false);
sendBit(false);
sendBit(false);
sendBit(true);
sendBit(true);
//get data
int data[9];
Serial.print(" ");
for(int i=0;i<9;i++)
{
digitalWrite(SPICLOCK,LOW);
delayMicroseconds(10);
digitalWrite(DATAOUT,LOW);
delayMicroseconds(10);
data[i] = digitalRead(DATAIN);
digitalWrite(SPICLOCK,HIGH);
delayMicroseconds(10);
Serial.print(data[i]);
}
digitalWrite(SLAVESELECTP,HIGH);
}