Tool/software: Linux
Hello and happy new year,
I changed the clock on my MSP430F5529 from a 20MHz to a 24MHz to be able to used USB-BSL and have high frequency clock. And since that, i can't seem to be able to send data via I2C. I have tried to have the I2C frequency to 12MHz and 6MHz with SMCLK and ACLK but it doesn't seem to work, will i precedently had I2C at 10MHz with SMCLK on my 20MHz clock.
It doesn't seem to be an electrical issues since when i revert to a 20MHz clock it work.
So i'm asking for your help and your knowledge, please Help:
I use the TI library, my code:
clock.h/c:
#define CLOCK_RATE_MCLK 24000000
#define CLOCK_MS_MCLK 20000
#define CLOCK_RATE_SMCLK 12000000
#define CLOCK_RATE_ACLK 6000000
GPIO_setAsPeripheralModuleFunctionInputPin(XT2_PIN_1);
GPIO_setAsPeripheralModuleFunctionInputPin(XT2_PIN_2);
//set speed clock acordingly to the speed authorized in the datasheet in the UCS chapter
UCS_setExternalClockSource(32768,CLOCK_RATE_MCLK); // XT2=24MHz NO XT1
// Set Vcore to accomodate for max. allowed system speed
PMM_setVCore(PMM_CORE_LEVEL_3);
//Init crystal (not meth)
UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//hight frequency
UCS_turnOffXT1();
// Use the crystals to set the clocks; the slower the clock the less power consuption it take
UCS_initClockSignal(UCS_MCLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1); // clock is at 24MHz
UCS_initClockSignal(UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_2);// clock at 12MHz
UCS_initClockSignal(UCS_ACLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_4);//clock at 6MHz
I2C init:
GPIO_setAsPeripheralModuleFunctionOutputPin(PRESSURE_SENSOR_B1); USCI_B_I2C_initMasterParam param; param.selectClockSource = USCI_B_I2C_CLOCKSOURCE_ACLK; param.i2cClk = CLOCK_RATE_ACLK;//6MHz param.dataRate = USCI_B_I2C_SET_DATA_RATE_100KBPS; USCI_B_I2C_initMaster(USCI_B1_BASE, ¶m); USCI_B_I2C_setSlaveAddress(USCI_B1_BASE, add); USCI_B_I2C_setMode(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_MODE);
USCI_B_I2C_disableInterrupt(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT); USCI_B_I2C_disableInterrupt(USCI_B1_BASE, USCI_B_I2C_RECEIVE_INTERRUPT);
I2C send:
USCI_B_I2C_masterSendSingleByte(USCI_B1_BASE, data); ms_delay(1); USCI_B_I2C_clearInterrupt(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT); USCI_B_I2C_clearInterrupt(USCI_B1_BASE, USCI_B_I2C_STOP_INTERRUPT);
Driver I2C FROM TI:
void USCI_B_I2C_masterSendSingleByte(uint16_t baseAddress,
uint8_t txData)
{
//Store current TXIE status
uint8_t txieStatus = HWREG8(baseAddress + OFS_UCBxIE) & UCTXIE;
//Disable transmit interrupt enable
HWREG8(baseAddress + OFS_UCBxIE) &= ~(UCTXIE);
//Send start condition.
HWREG8(baseAddress + OFS_UCBxCTL1) |= UCTR + UCTXSTT;
//Poll for transmit interrupt flag.
while(!(HWREG8(baseAddress + OFS_UCBxIFG) & UCTXIFG))
{
;
}
//Send single byte data.
HWREG8(baseAddress + OFS_UCBxTXBUF) = txData;
//Poll for transmit interrupt flag.
while(!(HWREG8(baseAddress + OFS_UCBxIFG) & UCTXIFG))
{
;//IS BLOOCKED HERE
}
//Send stop condition.
HWREG8(baseAddress + OFS_UCBxCTL1) |= UCTXSTP;
//Clear transmit interrupt flag before enabling interrupt again
HWREG8(baseAddress + OFS_UCBxIFG) &= ~(UCTXIFG);
//Reinstate transmit interrupt enable
HWREG8(baseAddress + OFS_UCBxIE) |= txieStatus;
}
thanks,
Aurelia
