Part Number: MSP432P401R
Other Parts Discussed in Thread: DAC121C085
I am trying to use DAC121C081 with msp432p401R. but at debug mode software stucks at while (I2C_isBusBusy(EUSCI_B3_BASE));
int main(){
Init_I2C_GPIO();
I2C_init();
I2C_setslave(0x0C);
I2C_write16(0x0, 4096);
}
const eUSCI_I2C_MasterConfig i2cConfig =
{
EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
48000000, // SMCLK = 48MHz
EUSCI_B_I2C_SET_DATA_RATE_400KBPS, // Desired I2C Clock of 100khz
0, // No byte counter threshold
EUSCI_B_I2C_NO_AUTO_STOP // No Autostop
};
void Init_I2C_GPIO()
{
/* Select I2C function for I2C_SCL(P6.7) & I2C_SDA(P6.6) */
GPIO_setAsPeripheralModuleFunctionOutputPin(
GPIO_PORT_P6,
GPIO_PIN7,
GPIO_PRIMARY_MODULE_FUNCTION);
GPIO_setAsPeripheralModuleFunctionOutputPin(
GPIO_PORT_P6,
GPIO_PIN6,
GPIO_PRIMARY_MODULE_FUNCTION);
}
/***************************************************************************//**
* @brief Configures I2C
* @param none
* @return none
******************************************************************************/
void I2C_init(void)
{
/* Initialize USCI_B3 and I2C Master to communicate with slave devices*/
I2C_initMaster(EUSCI_B3_BASE, &i2cConfig);
/* Disable I2C module to make changes */
I2C_disableModule(EUSCI_B3_BASE);
/* Enable I2C Module to start operations */
I2C_enableModule(EUSCI_B3_BASE);
return;
}
/***************************************************************************//**
* @brief Reads data from the sensor
* @param writeByte Address of register to read from
* @return Register contents
******************************************************************************/
int I2C_read16(unsigned char writeByte)
{
volatile int val = 0;
volatile int valScratch = 0;
/* Set master to transmit mode PL */
I2C_setMode(EUSCI_B3_BASE,
EUSCI_B_I2C_TRANSMIT_MODE);
/* Clear any existing interrupt flag PL */
I2C_clearInterruptFlag(EUSCI_B3_BASE,
EUSCI_B_I2C_TRANSMIT_INTERRUPT0);
/* Wait until ready to write PL */
while (I2C_isBusBusy(EUSCI_B3_BASE));
/* Initiate start and send first character */
I2C_masterSendMultiByteStart(EUSCI_B3_BASE, writeByte);
/* Wait for TX to finish */
while(!(I2C_getInterruptStatus(EUSCI_B3_BASE,
EUSCI_B_I2C_TRANSMIT_INTERRUPT0)));
/* Initiate stop only */
I2C_masterSendMultiByteStop(EUSCI_B3_BASE);
/* Wait for Stop to finish */
while(!I2C_getInterruptStatus(EUSCI_B3_BASE,
EUSCI_B_I2C_STOP_INTERRUPT));
/*
* Generate Start condition and set it to receive mode.
* This sends out the slave address and continues to read
* until you issue a STOP
*/
I2C_masterReceiveStart(EUSCI_B3_BASE);
/* Wait for RX buffer to fill */
while(!(I2C_getInterruptStatus(EUSCI_B3_BASE,
EUSCI_B_I2C_RECEIVE_INTERRUPT0)));
/* Read from I2C RX register */
val = I2C_masterReceiveMultiByteNext(EUSCI_B3_BASE);
/* Receive second byte then send STOP condition */
valScratch = I2C_masterReceiveMultiByteFinish(EUSCI_B3_BASE);
/* Shift val to top MSB */
val = (val << 8);
/* Read from I2C RX Register and write to LSB of val */
val |= valScratch;
/* Return temperature value */
return (int16_t)val;
}
/***************************************************************************//**
* @brief Writes data to the sensor
* @param pointer Address of register you want to modify
* @param writeByte Data to be written to the specified register
* @return none
******************************************************************************/
void I2C_write16 (unsigned char pointer, unsigned int writeByte)
{
/* Set master to transmit mode PL */
I2C_setMode(EUSCI_B3_BASE,
EUSCI_B_I2C_TRANSMIT_MODE);
/* Clear any existing interrupt flag PL */
I2C_clearInterruptFlag(EUSCI_B3_BASE,
EUSCI_B_I2C_TRANSMIT_INTERRUPT0);
/* Wait until ready to write PL */
while (I2C_isBusBusy(EUSCI_B3_BASE));
/* Initiate start and send first character */
I2C_masterSendMultiByteStart(EUSCI_B3_BASE,
pointer);
/* Send the MSB to SENSOR */
I2C_masterSendMultiByteNext(EUSCI_B3_BASE,
(unsigned char)(writeByte>>8));
I2C_masterSendMultiByteFinish(EUSCI_B3_BASE,
(unsigned char)(writeByte&0xFF));
}
void I2C_setslave(unsigned int slaveAdr)
{
/* Specify slave address for I2C */
I2C_setSlaveAddress(EUSCI_B3_BASE,
slaveAdr);
/* Enable and clear the interrupt flag */
I2C_clearInterruptFlag(EUSCI_B3_BASE,
EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_RECEIVE_INTERRUPT0);
return;
}
