This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DAC8411 Testing

Other Parts Discussed in Thread: DAC8411

Hello,

I'm currently trying to implement the DAC8411 to output a basic sine wave and I'm running in to a bunch of issues. I am using an Arduino for this project however I cannot see any output and I do not see anything going to high when I use the logic analyzer. Any suggestions? My code can be seen below.


// inslude the SPI library:
#include <SPI.h>

byte sinewave[256] ={
 127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
 242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
 221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
 76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
 33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124

};

uint8_t divider = 24;
// set pin 10 as the slave select for the digital pot:

#define DATAOUT 51   // MOSI 
#define DATAIN 50    // MISO //not used
#define SPICLOCK 52  // Clock 
#define SELPIN 53    // chip-select
void setup() {

  // set the slaveSelectPin as an output:
  pinMode(SELPIN, OUTPUT);
  pinMode(SPICLOCK, OUTPUT);
  pinMode(DATAOUT, OUTPUT);
  // initialize SPI:
  digitalWrite(SELPIN, HIGH); 
   SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV16); // slow the SPI bus down
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE1); 
  Serial.begin(115200);
}

void loop() {
  // go through the six channels of the digital pot:
  for (int channel = 0; channel < 256; channel++) {
    // change the resistance on this channel from min to max:
    writeSPI(channel ,sinewave[channel]);
    // wait a second at the top:
    delay(100);
  }

}

void writeSPI(byte channel ,byte value) {
  // take the SS pin low to select the chip:
  digitalWrite(SELPIN, LOW);
  //  send in the address and value via SPI:
  int output = value;
  SPI.transfer(channel);
  SPI.transfer(output);
  Serial.println(output);
  // take the SS pin high to de-select the chip:
  digitalWrite(SELPIN, HIGH);
}

  • Hi Alexander,

    Do you think you can provide us with some SPI captures on an oscilloscope? This will help us understand if the micro controller is outputting valid codes to the DAC.

    Unfortunately we are not qualified to verify Arduino code. I would suggest implementing a simple SPI interface first, and then I can help you debug the issues that are specific with the DAC8411.
  • Hello,

    I didnt see anything from the oscilloscope however I do have a logic analyzer output. Here's a link to the photo 

    It appears to be reading it correctly however when I attempt to view the data there is nothing to see via the oscilloscope. Do you think I may need to increase my rate of output for the oscilloscope in order to get a reading?

    Here's an update for the code.

    [code]

    byte sinewave[256] ={
    127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
    242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
    221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
    76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
    33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124

    };

    uint8_t divider = 24;
    // set pin 10 as the slave select for the digital pot:

    #define DATAOUT 51 // MOSI
    #define DATAIN 50 // MISO //not used
    #define SPICLOCK 52 // Clock
    #define SELPIN 53 // chip-select
    void setup() {

    // set the slaveSelectPin as an output:
    digitalWrite(SELPIN, HIGH);
    pinMode(SELPIN, OUTPUT);
    pinMode(SPICLOCK, OUTPUT);
    pinMode(DATAOUT, OUTPUT);
    // initialize SPI:
    SPI.begin();
    SPI.setClockDivider(SPI_CLOCK_DIV16); // slow the SPI bus down
    Serial.begin(115200);
    }

    void loop() {
    // go through the six channels of the digital pot:
    for (int channel = 0; channel < 256; channel++) {
    // change the resistance on this channel from min to max:
    writeSPI(sinewave[channel]);
    // wait a second at the top:
    delay(100);
    }

    }

    void writeSPI( byte value){ // I previously thought the DAC had multiple outputs (channels), it only has one
    // and the mode control bits are inserted into the bit stream. I was wrong on how to send the data stream.

    // configure SPI hardware for the maximum clock rate, bit order, clock phase and polarity

    SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE1)); // set correct SPI modes

    // take the SS pin low to select the chip:

    digitalWrite(SELPIN, LOW);


    // send device Mode bits and the first 6bits of the DAC value via SPI:

    byte output = value >>2; // the high bits b7, b6 need to be 0 for normal mode

    // send the control bits plus the high 6 bits of the output value

    SPI.transfer(output);

    output = value << 6; // get the rest of the input value, the lower 2 bits of value, pad with zero's

    SPI.transfer(output);

    output = 0;
    // Send a filler byte, the device expects 24 bits of data
    SPI.transfer(output);

    // take the SS pin high to de-select the chip:
    digitalWrite(SELPIN, HIGH);
    SPI.endTransaction(); // release SPI bus for other devices

    }

    [!code]

  • Hi Alexander,

    Thank you for sharing the digital capture. One problem that I notice right away is that the CS line seems to be toggling in the middle of the frame. This will render the frame invalid and the DAC output will not update.

    I can't get the correct timing from the image, but it is possible that you may also be violating the SPI timings by having the clock be > 50MHz. Can you try to slow down the SCLK signal?

    Alexander Consunji said:
    It appears to be reading it correctly however when I attempt to view the data there is nothing to see via the oscilloscope.

    Let me clarify this. You can't see the digital signals being output from the Arduino? This is very strange. I have a few questions.

    • What is the digital IO voltages that you are expecting at the output of the Arduino?
    • What supply are you providing to the DAC?
    • Can you share a snippet of the schematic around the DAC?
    • What voltage are you using for LDAC?