in shakti/bsp/drivers/i2c/i2c_driver.c [468:528]
int i2c_send_interrupt_slave_address(i2c_struct * instance, unsigned char slaveAddress, unsigned char rdWrCntrl, unsigned long delay)
{
int timeout;
unsigned char temp = 0;
int status = 0;
delay = delay;
if(rdWrCntrl == 0)
slaveAddress |= I2C_WRITE;
else
slaveAddress |= I2C_READ;
log_debug("\n\tSetting Slave Address : 0x%x\n", slaveAddress);/* Writes the slave address to I2C controller */
//Writing the slave address that needs to be written into data register.
instance->data = slaveAddress;
log_debug("\tSlave Address is written into data register\n");
//Reads back the data register to confirm
temp = instance->data; //Reads the slave address from I2C controller
log_debug("\tSet slave address read again, which is 0x%x\n",temp);
if(slaveAddress != (int)temp)
{
log_error("\tSlave address is not matching; Written Add. Value: 0x%x; Read Add. Value: 0x%x\n", slaveAddress, temp);
log_error("\n There is some issue in AXI interface. Please check.");
return EAXI_ERROR;
}
//Waits till the bus becomes free.
while(wait_till_I2c_bus_free(instance))
{
log_error("\tError in Waiting for BB\n");
return EI2C_BUS_ERROR;
}
//Send the start condition and slave address to slave
#ifndef USE_SA_WRITE_I2C_INTERRUPT
instance->control = I2C_START;; //Sending the slave address to the I2C slave
//Wait for PIN to become low.
timeout = wait_till_txrx_operation_Completes(instance, &status);
if (timeout) {//Asking the controller to send a start signal to initiate the transaction
printf("\tTimeout happened - Write did not go through the BFM -- Diagnose\n");
instance->control = I2C_STOP; //~
return EI2C_PIN_ERROR;
}
if (status & I2C_LRB) {
instance->control = I2C_STOP; //~
printf("\tSome status check failing\n");
return EI2C_LRB_ERROR;
}
#else
i2c_complete_flag = 0;
instance->control = I2C_REPSTART_ENI; //Sending the slave address to the I2C slave
while(!i2c_complete_flag);
log_info("\n Slave Address Write Operation is complete.");
i2c_complete_flag = 0;
#endif
log_info("\n Slave address is written successfully");
return I2C_SUCCESS;
}