Because of the holidays, TI E2E™ design support forum responses will be delayed from Dec. 25 through Jan. 2. Thank you for your patience.

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.

Interfacing dac081c081 to msp430g2553

Other Parts Discussed in Thread: MSP430G2553, DAC081C081, DAC8571

Hello 

I was interfacing a dac081c081 to a msp430g2553 using its launchpad.I was using the sample code available for dac5781. But no voltage is seen on the i2c lines.Is it ok if we use the code for 5781 with dac081c081.What is the reason for the code not working.The code is as follows:

 //  MSP430G2xx3 Demo - USCI_B0 I2C Master Interface to DAC8571, Write
//
//  Description: Using UCB0TXIE, a continuous sine wave is output to the
//  external DAC using a 16-point look-up table. Only one start condition
//  is executed. Data is handled by the ISR and the CPU is normally in LPM0.
//  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.2MHz
//
//               MSP430G2xx3                       DAC8571
//           ------------------                   ------------
//         -|XIN   P1.7/UCB0SDA|<--------------->|SDA         |
//          |      P1.6/UCB0SCL|---------------->|SCL  I2C    |
//         -|XOUT              |                 |    SLAVE   |
//          |     I2C MASTER   |              GND|A0          |
//
//
//  DAC8571 I2C address = 0x4C (A0 = GND)
//
//  D. Dang
//  Texas Instruments Inc.
//  February 2011
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include <msp430.h>

const unsigned char Sine_Tab[] =            // 16 Point 16-bit Sine Table
{
 0xFF,                                     // MSB Word 0
 0xFF,                                     // LSB
 0xF6,                                     // MSB Word 1
 0x40,                                     // LSB
 0xDA,                                     // MSB Word 2
 0x81,                                     // LSB
 0xB0,                                     // MSB Word 3
 0xFA,                                     // LSB
 0x7F,                                     // MSB Word 4
 0xFF,                                     // LSB
 0x4F,                                     // MSB Word 5
 0x03,                                     // LSB
 0x25,                                     // MSB Word 6
 0x7C,                                     // LSB
 0x09,                                     // MSB Word 7
 0xBD,                                     // LSB
 0x00,                                     // MSB Word 8
 0x00,                                     // LSB
 0x09,                                     // MSB Word 9
 0xBD,                                     // LSB
 0x25,                                     // MSB Word 10
 0x7C,                                     // LSB
 0x4F,                                     // MSB Word 11
 0x03,                                     // LSB
 0x7F,                                     // MSB Word 12
 0xFE,                                     // LSB
 0xB0,                                     // MSB Word 13
 0xFA,                                     // LSB
 0xDA,                                     // MSB Word 14
 0x81,                                     // LSB
 0xF6,                                     // MSB Word 15
 0x40                                      // LSB
};

int main(void)
{
 WDTCTL = WDTPW + WDTHOLD;                 // Stop Watchdog Timer 
 P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
 P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
 UCB0CTL1 |= UCSWRST;                      // Enable SW reset
 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
 UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
 UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
 UCB0BR1 = 0;
 UCB0I2CSA = 0x4c;                         // Set slave address
 UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
 IE2 |= UCB0TXIE;                          // Enable TX ready interrupt
 UCB0CTL1 |= UCTR + UCTXSTT;               // I2C TX, start condition
 UCB0TXBUF = 0x010;                        // Write DAC control byte
 __bis_SR_register(CPUOFF + GIE);          // Enter LPM0 w/ interrupts
}

// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
 static unsigned char ByteCtr;

 UCB0TXBUF = Sine_Tab[ByteCtr++];          // Transmit data byte
 ByteCtr &= 0x1f;                          // Do not exceed table
}

  • Ashish Kulkarni1 said:
    .I was using the sample code available for dac5781. But no voltage is seen on the i2c lines

    What you mean? i2c lines all the time have logical "0" state? Perhaps you don't have pull-up resistors on i2c data and clock lines - that's why?

  • We have used pull ups.The program is supposed to output a sine wave.But we could not see anything on the oscilloscope.The output voltage comes out in millivolts.What might be the reason?

  • Ashish Kulkarni1 said:
    The output voltage comes out in millivolts.What might be the reason?

    1) you said "But no voltage is seen on the i2c lines" but meant "DAC output voltage"? If yes, then next time please be more precise about what you say

    2) you can't take any i2c DAC control source code and expect that it will work on any other i2c DAC. Usually it does not work as in your case. Code does no match dac081c081 requirements. Get datasheet of device and check how you shall address DAC, ow you shall send data. Modify code accordingly.

  • Thank You for your reply.I will try my best to be more precise henceforth.

**Attention** This is a public forum