-
-
Save thefish/62982c2f836916fce3bb9cc6ff922d84 to your computer and use it in GitHub Desktop.
Arduino MCP4922 SPI DAC demo code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
MCP4922 test | |
Steve Woodward, 2010 | |
most code borrowed from | |
http://mrbook.org/blog/2008/11/22/controlling-a-gakken-sx-150-synth-with-arduino/ | |
connections | |
==================================================== | |
+5v > 4922 pin 1 | |
Ard pin 10 > 4922 pin 3 (SS - slave select) | |
Ard pin 13 > 4922 pin 4 (SCK - clock) | |
Ard pin 11 > 4922 pin 5 (MOSI - data out) | |
Ground > 4922 pin 8 (LDAC) | |
+5v > 4922 pin 11 (voltage ref DAC B) | |
Ground > 4922 pin 12 | |
+5v > 4922 pin 13 (voltage ref DAC A) | |
4922 pin 14 DAC A > 1k resistor > synth CV in | |
*/ | |
// MCP4922 DAC out | |
#define DATAOUT 11//MOSI | |
#define DATAIN 12//MISO - not used, but part of builtin SPI | |
#define SPICLOCK 13//sck | |
#define SLAVESELECT0 10//ss | |
int i = 0; | |
void setup() { | |
SPI_setup(); | |
Serial.begin(9600); | |
} | |
void loop() { | |
i++; | |
Serial.println(i); | |
write_note(i); | |
if(i>=4096) { | |
i=0; | |
} | |
} | |
void write_note(int i) { | |
write_valueY(i); | |
write_valueX(i); | |
} | |
// ************************************************** | |
// SPI for DAC | |
void SPI_setup(){ | |
byte clr; | |
pinMode(DATAOUT, OUTPUT); | |
pinMode(SPICLOCK,OUTPUT); | |
pinMode(SLAVESELECT0,OUTPUT); | |
digitalWrite(SLAVESELECT0,HIGH); //disable device | |
SPCR = (1<<SPE)|(1<<MSTR) | (0<<SPR1) | (0<<SPR0); | |
clr=SPSR; | |
clr=SPDR; | |
delay(10); | |
} | |
// write out through DAC A | |
void write_valueX(int sample) | |
{ | |
// splits int sample in to two bytes | |
byte dacSPI0 = 0; | |
byte dacSPI1 = 0; | |
dacSPI0 = (sample >> 8) & 0x00FF; //byte0 = takes bit 15 - 12 | |
dacSPI0 |= (1 << 7); | |
// A/B: DACa or DACb - Forces 7th bit of x to be 1. all other bits left alone. | |
dacSPI0 |= 0x10; | |
dacSPI1 = sample & 0x00FF; //byte1 = takes bit 11 - 0 | |
dacSPI0 |= (1<<5); // set gain of 1 | |
digitalWrite(SLAVESELECT0,LOW); | |
SPDR = dacSPI0; // Start the transmission | |
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission | |
{ | |
}; | |
SPDR = dacSPI1; | |
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission | |
{ | |
}; | |
digitalWrite(SLAVESELECT0,HIGH); | |
//delay(2); | |
} | |
// write out through DAC B | |
void write_valueY(int sample) | |
{ | |
// splits int sample in to two bytes | |
byte dacSPI0 = 0; | |
byte dacSPI1 = 0; | |
dacSPI0 = (sample >> 8) & 0x00FF; //byte0 = takes bit 15 - 12 | |
dacSPI0 |= 0x10; | |
dacSPI1 = sample & 0x00FF; //byte1 = takes bit 11 - 0 | |
dacSPI0 |= (1<<5); // set gain of 1 | |
digitalWrite(SLAVESELECT0,LOW); | |
SPDR = dacSPI0; // Start the transmission | |
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission | |
{ | |
}; | |
SPDR = dacSPI1; | |
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission | |
{ | |
}; | |
digitalWrite(SLAVESELECT0,HIGH); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment