/* DAC_MCP4725 via I2C * * The program generates sinewave output through DAC. * I2C1SCL P6.5 * I2C1SDA P6.4 * Put speaker jumper on DAC and you will hear the tone. * * Built and tested with MSP432P401R Rev. C, Keil MDK-ARM v5.24a and MSP432P4xx_DFP v3.1.0 */ #include "msp.h" #define SLAVE_ADDR 0x60 // 1100 xx0. void I2C1_init(void); int I2C1_burstWrite(int slaveAddr, char command, int byteCount, char* data); void delayMs(int n); void MCP4725_data(int n); const static int sineWave[] = {2047,3071,3820,4094,3820,3071, 2047,1024, 274, 0, 274,1024}; int main(void) { short i; I2C1_init(); for (;;) { /* infinite loop */ for (i = 0; i < 12; i++) { MCP4725_data(sineWave[i]); } } } void MCP4725_data(int n) { char data[2]; data[1] = (n << 4) & 0xFF; data[0] = (n >> 4) & 0xFF; I2C1_burstWrite(SLAVE_ADDR, 0x40, 2, data); } /* configure UCB1 as I2C */ void I2C1_init(void) { extern uint32_t SystemCoreClock; EUSCI_B1->CTLW0 |= 1; /* disable UCB1 during config */ EUSCI_B1->CTLW0 = 0x0F81; /* 7-bit slave addr, master, I2C, synch mode, use SMCLK */ EUSCI_B1->BRW = 30; /* set clock prescaler for 100kHz */ P6->SEL0 |= 0x30; /* P6.5, P6.4 for UCB1 */ P6->SEL1 &= ~0x30; EUSCI_B1->CTLW0 &= ~1; /* enable UCB1 after config */ } /* Use burst write to write multiple bytes to consecutive locations * burst write: S-(slaveAddr+w)-ACK-memAddr-ACK-data-ACK...-data-ACK-P */ int I2C1_burstWrite(int slaveAddr, char memAddr, int byteCount, char* data) { if (byteCount <= 0) return -1; /* no write was performed */ EUSCI_B1->I2CSA = slaveAddr; /* setup slave address */ EUSCI_B1->CTLW0 |= 0x0010; /* enable transmitter */ EUSCI_B1->CTLW0 |= 0x0002; /* generate START and send slave address */ while((EUSCI_B1->CTLW0 & 2)); /* wait until slave address is sent */ EUSCI_B1->TXBUF = memAddr; /* send memory address to slave */ /* send data one byte at a time */ do { while(!(EUSCI_B1->IFG & 2)); /* wait till it's ready to transmit */ EUSCI_B1->TXBUF = *data++; /* send data to slave */ byteCount--; } while (byteCount > 0); while(!(EUSCI_B1->IFG & 2)); /* wait till last transmit is done */ EUSCI_B1->CTLW0 |= 0x0004; /* send STOP */ while(EUSCI_B1->CTLW0 & 4) ; /* wait until STOP is sent */ return 0; /* no error */ } /* delay n milliseconds (50 MHz CPU clock) */ void delayMs(int n) { int i, j; for(i = 0 ; i< n; i++) for(j = 0; j < 6265; j++) {} /* do nothing for 1 ms */ }