Tool/software: Code Composer Studio
Hi
I am trying to configure BMI160 IMU's (sensor) registers and then read the information. Based on the BMI160 datasheet:
1- The read access should be like
The read function based on above figure is: (First master transmitter->slave address->register address->repeated start->slave address->read data->...->NACK->Stop)
int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
int8_t rslt = BMI160_OK; /* Return 0 for Success, non-zero for failure */
// Ensure stop condition got sent
while (EUSCI_B0->CTLW0 & EUSCI_B_CTLW0_TXSTP);
EUSCI_B0->CTLW0 |=EUSCI_B_CTLW0_TR;
// I2C start condition
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;
EUSCI_B0->I2CSA = dev_id; //Set slave address
while((EUSCI_B0->CTLW0 & EUSCI_B_CTLW0_TXSTT)); //Wait for complete slave address to get transmitted
while(!(EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG0) ); //Wait until the data in TXBUF(register address) is transmitted
EUSCI_B0->IFG &= ~(EUSCI_B_IFG_TXIFG0); //Clear the flag
EUSCI_B0->TXBUF = reg_addr; //Send the register address
EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_TR;
// I2C start condition
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;
EUSCI_B0->I2CSA = dev_id; //Set slave address
while((EUSCI_B0->CTLW0 & EUSCI_B_CTLW0_TXSTT) ); //Wait for complete slave address to get transmitted
/* Read len-1 bytes of data*/
for (i=len; i>1; i-- )
{
__delay_cycles(300000); // ~100ms pause between transmissions
/*Read Data*/
*reg_data = EUSCI_B0->RXBUF;
reg_data++;
/*ACKM*/
while(!(EUSCI_B0->IFG & EUSCI_B_IFG_RXIFG0)); //Wait until the data in TXBUF(register address) is transmitted
EUSCI_B0->IFG &= ~(EUSCI_B_IFG_RXIFG); //Clear the flag
if(i==2)/*For the last byte send the STOP command*/
{EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTP;}
}
/*Read the last byte*/
if (i)
{
__delay_cycles(300000); // ~100ms pause between transmissions
while(!(EUSCI_B0->IFG & EUSCI_B_IFG_RXIFG0)); //Wait until the data in TXBUF(register address) is transmitted
EUSCI_B0->IFG &= ~(EUSCI_B_IFG_RXIFG0); //Clear the flag
/*Read Data*/
*reg_data = EUSCI_B0->RXBUF;
reg_data++;
}
EUSCI_B0->CTLW1 |= EUSCI_B_CTLW1_STPNACK; //Sent NACK
// Ensure stop condition got sent
while (EUSCI_B0->CTLW0 & EUSCI_B_CTLW0_TXSTP);//check the ensure the STOP condition is sent out.
return rslt;
}
The problem I have here that the code get stuck in the
if (i)
{ __delay_cycles(300000); // ~100ms pause between transmissions
while(!(EUSCI_B0->IFG & EUSCI_B_IFG_RXIFG0)); //Wait until the data in TXBUF(register address) is transmitted
EUSCI_B0->IFG &= ~(EUSCI_B_IFG_RXIFG0); //Clear the flag
My question is that did I write the correct format for read access?
Thanks
Saber
