Part Number: MSP430F5528
Hello,
First, I'm using the following software tools for the MSP430F5528:
- Code Composer Compiler v6.1.2 (running on Windows 7x64)
- TI Compiler v4.4.5
- MSP430 driverlib v5.20.06.02
I'm trying to implement I2C communication and as the title states the ISR's are not running at all. Some additional details about what I'm using in the micro:
- SLCLK setup for XTAL2 at 24MHz
- Using USB CDC
- TimerA setup in continuous compartor mode for 1MHz operation of SMCLK to implement a scheduler
- TimerB setup in continous overflow mode for 24MHz timestamp
The USB, scheduler, and timestamp functions all work properly. My I2C transactions never seem to start though. Here are my I2C related function (I only included USCI_B1 ISR, but more code has a duplicated one for B0 as well):
typedef enum i2cPorts{
HAL_I2C_PORT_USCI_B0,
HAL_I2C_PORT_USCI_B1,
HAL_I2C_PORT_COUNT
}HAL_I2C_PORT;
typedef enum i2cSpeed{
HAL_I2C_SPEED_400KBPS,
HAL_I2C_SPEED_100KBPS
}HAL_I2C_SPEED;
volatile uint16_t I2C_BASE_ADDRESS[HAL_I2C_PORT_COUNT] = {USCI_B0_BASE,USCI_B1_BASE};
uint8_t *I2C_DATA_TX[HAL_I2C_PORT_COUNT];
uint8_t *I2C_DATA_RX[HAL_I2C_PORT_COUNT];
volatile uint8_t I2C_SLAVE_ADDRESS[HAL_I2C_PORT_COUNT];
volatile uint8_t I2C_DATA_TX_COUNT[HAL_I2C_PORT_COUNT];
volatile uint8_t I2C_DATA_RX_COUNT[HAL_I2C_PORT_COUNT];
volatile uint8_t I2C_DATA_TX_COUNTER[HAL_I2C_PORT_COUNT];
volatile uint8_t *I2C_DATA_RX_BUFFER_POINTER[HAL_I2C_PORT_COUNT];
volatile bool I2C_TRANSFER_STARTED[HAL_I2C_PORT_COUNT];
volatile bool I2C_TRANSFER_COMPLETED[HAL_I2C_PORT_COUNT];
volatile uint8_t I2C_TRANSFER_ERROR[HAL_I2C_PORT_COUNT];
void HAL_I2C_setup(HAL_I2C_PORT port, HAL_I2C_SPEED speed){
uint8_t i2cPort = 0;
uint16_t i2cPins = 0;
uint32_t i2cDataRate = 0;
/* Specify variables based on selected port */
switch(port){
case HAL_I2C_PORT_USCI_B0:
i2cPort = GPIO_PORT_P3;
i2cPins = GPIO_PIN0 + GPIO_PIN1;
break;
case HAL_I2C_PORT_USCI_B1:
i2cPort = GPIO_PORT_P4;
i2cPins = GPIO_PIN1 + GPIO_PIN2;
break;
}
/* Convert the speed rate variable */
switch(speed){
case HAL_I2C_SPEED_400KBPS:
i2cDataRate = USCI_B_I2C_SET_DATA_RATE_400KBPS;
break;
case HAL_I2C_SPEED_100KBPS:
i2cDataRate = USCI_B_I2C_SET_DATA_RATE_100KBPS;
break;
}
/* Assign pins to I2C peripheral */
GPIO_setAsPeripheralModuleFunctionInputPin(i2cPort,i2cPins);
/* Initialize interfase as master I2C device */
USCI_B_I2C_initMasterParam param = {0};
param.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = UCS_getSMCLK();
param.dataRate = i2cDataRate;
USCI_B_I2C_initMaster(I2C_BASE_ADDRESS[port], ¶m);
/* Enable I2C Module to start operations */
USCI_B_I2C_enable(I2C_BASE_ADDRESS[port]);
I2C_DATA_TX_COUNT[port] = 0;
I2C_DATA_RX_COUNT[port] = 0;
I2C_TRANSFER_STARTED[port] = false;
I2C_TRANSFER_COMPLETED[port] = false;
}
void HAL_I2C_transferStart(HAL_I2C_PORT port,
uint8_t slaveAddress,
uint8_t writeCount, uint8_t *writeData,
uint8_t readCount, uint8_t *readData){
I2C_SLAVE_ADDRESS[port] = slaveAddress;
I2C_DATA_TX[port] = writeData;
I2C_DATA_RX[port] = readData;
I2C_DATA_TX_COUNT[port] = writeCount;
I2C_DATA_RX_COUNT[port] = readCount;
I2C_TRANSFER_STARTED[port] = true;
I2C_TRANSFER_COMPLETED[port] = false;
/* Check if any bytes will be written */
if(writeCount > 0){
/* Specify slave address */
//USCI_B_I2C_setSlaveAddress(I2C_BASE_ADDRESS[port],slaveAddress);
USCI_B_I2C_setSlaveAddress(I2C_BASE_ADDRESS[port],slaveAddress << 1);
/* Set Transmit mode */
USCI_B_I2C_setMode(I2C_BASE_ADDRESS[port],USCI_B_I2C_TRANSMIT_MODE);
USCI_B_I2C_enable(I2C_BASE_ADDRESS[port]);
/* Enable transmit Interrupt */
USCI_B_I2C_clearInterrupt(I2C_BASE_ADDRESS[port],USCI_B_I2C_TRANSMIT_INTERRUPT);
USCI_B_I2C_enableInterrupt(I2C_BASE_ADDRESS[port],USCI_B_I2C_TRANSMIT_INTERRUPT);
/* Load TX byte counter */
I2C_DATA_TX_COUNTER[port] = 1;
/* Initiate start and send first character */
USCI_B_I2C_masterSendMultiByteStart(I2C_BASE_ADDRESS[port],writeData[0]);
}
else if(readCount > 0){
/* Specify slave address */
//USCI_B_I2C_setSlaveAddress(I2C_BASE_ADDRESS[port],slaveAddress);
USCI_B_I2C_setSlaveAddress(I2C_BASE_ADDRESS[port],(slaveAddress << 1) + 1);
/* Set receive mode */
USCI_B_I2C_setMode(I2C_BASE_ADDRESS[port],USCI_B_I2C_RECEIVE_MODE);
USCI_B_I2C_enable(I2C_BASE_ADDRESS[port]);
/* Enable receive Interrupt */
USCI_B_I2C_clearInterrupt(I2C_BASE_ADDRESS[port],USCI_B_I2C_RECEIVE_INTERRUPT);
USCI_B_I2C_enableInterrupt(I2C_BASE_ADDRESS[port],USCI_B_I2C_RECEIVE_INTERRUPT);
/* Initialize multi reception */
I2C_DATA_RX_BUFFER_POINTER[port] = readData;
USCI_B_I2C_masterReceiveMultiByteStart(I2C_BASE_ADDRESS[port]);
}
}
#pragma vector=USCI_B1_VECTOR
__interrupt void USCI_B1_ISR (void)
{
switch (__even_in_range(UCB1IV,12)){
case USCI_I2C_UCTXIFG:
{
//Check TX byte counter
if (I2C_DATA_TX_COUNTER[HAL_I2C_PORT_USCI_B1] < I2C_DATA_TX_COUNT[HAL_I2C_PORT_USCI_B1]){
//Initiate send of character from Master to Slave
USCI_B_I2C_masterSendMultiByteNext(
USCI_B1_BASE,
I2C_DATA_TX[HAL_I2C_PORT_USCI_B1][I2C_DATA_TX_COUNTER[HAL_I2C_PORT_USCI_B1]]
);
//Increment TX byte counter
I2C_DATA_TX_COUNTER[HAL_I2C_PORT_USCI_B1]++;
}
else if(I2C_DATA_RX_COUNT[HAL_I2C_PORT_USCI_B1] > 0){
/* Start the read transfer without sending an I2C STOP */
HAL_I2C_transferStart(
HAL_I2C_PORT_USCI_B1,I2C_SLAVE_ADDRESS[HAL_I2C_PORT_USCI_B1],
0,I2C_DATA_TX[HAL_I2C_PORT_USCI_B1],
I2C_DATA_RX_COUNT[HAL_I2C_PORT_USCI_B1], I2C_DATA_RX[HAL_I2C_PORT_USCI_B1]);
}
else{
//Initiate stop only
USCI_B_I2C_masterSendMultiByteStop(USCI_B1_BASE);
//Clear master interrupt status
USCI_B_I2C_clearInterrupt(USCI_B1_BASE,USCI_B_I2C_TRANSMIT_INTERRUPT);
I2C_TRANSFER_STARTED[HAL_I2C_PORT_USCI_B0] = false;
I2C_TRANSFER_COMPLETED[HAL_I2C_PORT_USCI_B0] = true;
}
break;
}
case USCI_I2C_UCRXIFG:
{
/* Decrement RX byte counter */
I2C_DATA_RX_COUNT[HAL_I2C_PORT_USCI_B1]--;
if (I2C_DATA_RX_COUNT[HAL_I2C_PORT_USCI_B1]){
if (I2C_DATA_RX_COUNT[HAL_I2C_PORT_USCI_B1] == 1) {
/* Initiate end of reception -> Receive byte with NAK */
(*I2C_DATA_RX_BUFFER_POINTER[HAL_I2C_PORT_USCI_B1]) = USCI_B_I2C_masterReceiveMultiByteFinish(USCI_B1_BASE);
I2C_DATA_RX_BUFFER_POINTER[HAL_I2C_PORT_USCI_B1]++;
}
else {
/* Keep receiving one byte at a time */
(*I2C_DATA_RX_BUFFER_POINTER[HAL_I2C_PORT_USCI_B1]) = USCI_B_I2C_masterReceiveMultiByteNext(USCI_B1_BASE);
I2C_DATA_RX_BUFFER_POINTER[HAL_I2C_PORT_USCI_B1]++;
}
}
else {
/* Receive last byte */
(*I2C_DATA_RX_BUFFER_POINTER[HAL_I2C_PORT_USCI_B1]) = USCI_B_I2C_masterReceiveMultiByteNext(USCI_B1_BASE);
I2C_TRANSFER_STARTED[HAL_I2C_PORT_USCI_B0] = false;
I2C_TRANSFER_COMPLETED[HAL_I2C_PORT_USCI_B0] = true;
}
break;
}
}
}
Thank you for any help!
Best regards,
Blair
