Other Parts Discussed in Thread: MSP430F5438
hi everyone, I just started a i2c program to check if my slave is present (digital pot AD5254). I get an ACK ok but when i send a start condition it sends that slve address ok.
i2c1_start(); // This condition is always executed.
i2c1_write(0x00); // Sometimes it will send this, other times it skips it and automatically sends a stop.
i2c1_write(0x0ff); // It rarely gets this far
i2c1_stop();
Here is my code.
#include "msp430f5438.h"
void i2c1_init(unsigned int slave_add, unsigned char fscl);
unsigned char i2c1_start(void);
void i2c1_stop(void);
unsigned char i2c1_write(unsigned char data);
void main (void){
i2c1_init(0x2c, 12); // Slave address
i2c1_start();
i2c1_write(0x00); // Register 0
i2c1_write(0x0ff); // Position ff
i2c1_stop();
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts
return;
}
void i2c1_init(unsigned int slave_add, unsigned char fscl)
{
/* Local Variables */
/* Code */
P3SEL |= 0x06; // 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
UCB0BR0 = fscl; // FSCL = SMCLK/fscl
UCB0BR1 = 0;
UCB0I2CSA = slave_add; // Slave Address is 02Ch
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCB0IE = UCTXIE + UCRXIE; // Enable TX & RX Interrupts
__bis_SR_register(GIE); // Interrupts enabled
return;
}//end of i2c1_init
unsigned char i2c1_start(void)
{
UCB0CTL1 |= (UCTR + UCTXSTT); // Start condition sent?
return 1;
}//unsigned char i2c1_start(void)
unsigned char i2c1_write(unsigned char data)
{
//while(UCB0STAT & UCBBUSY); //USCI busy?
UCB0TXBUF = data;
return 1;
}
void i2c1_stop(void)
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
return;
}// void i2c1_stop(void)
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
switch(__even_in_range(UCB0IV,12))
{
case 0: break; // Vector 0: No interrupts
case 2: break; // Vector 2: ALIFG
case 4:
UCB0IFG &= ~UCNACKIFG;
break; // Vector 4: NACKIFG
case 6: break; // Vector 6: STTIFG
case 8: break; // Vector 8: STPIFG
case 10: // Vector 10: RXIFG
break;
case 12: // Vector 12: TXIFG
UCB0IFG &= ~UCTXIFG; // Clear TX Flag
break;
default: break;
}
}
Does anybody have an idea where i may be going wrong or what is causing this to happen.
Thanks for any help.
