/** * \brief This function reads data from EEPROM. * * \param data Address where data is to be read. * \param length Length of data to be read * \param offset Address of the byte from which data to be read. * * \return None. * * \note This muxing depends on the profile in which the EVM is configured. * EEPROMI2CSetUp Shall be called Before this API is used */ void EEPROMI2CRead(unsigned char *data, unsigned int length, unsigned short offset) { unsigned int idx = 0; /* First send the register offset - TX operation */ I2CSetDataCount(I2C_BASE_ADDR, 2); StatusClear(); I2CMasterControl(I2C_BASE_ADDR, I2C_CFG_MST_TX); I2CMasterStart(I2C_BASE_ADDR); /* Wait for the START to actually occir on the bus */ while (0 == I2CMasterBusBusy(I2C_BASE_ADDR)); I2CMasterDataPut(I2C_BASE_ADDR, (unsigned char)((offset >> 8) & 0xFF)); /* Wait for the Tx register to be empty */ while (0 == I2CMasterIntRawStatusEx(I2C_BASE_ADDR, I2C_INT_TRANSMIT_READY)); /* Push offset out and tell CPLD from where we intend to read the data */ I2CMasterDataPut(I2C_BASE_ADDR, (unsigned char)(offset & 0xFF)); I2CMasterIntClearEx(I2C_BASE_ADDR, I2C_INT_TRANSMIT_READY); while(0 == (I2CMasterIntRawStatus(I2C_BASE_ADDR) & I2C_INT_ADRR_READY_ACESS)); StatusClear(); I2CSetDataCount(I2C_BASE_ADDR, length); /* Now that we have sent the register offset, start a RX operation*/ I2CMasterControl(I2C_BASE_ADDR, I2C_CFG_MST_RX); /* Repeated start condition */ I2CMasterStart(I2C_BASE_ADDR); while (length--) { while (0 == I2CMasterIntRawStatusEx(I2C_BASE_ADDR, I2C_INT_RECV_READY)); data[idx++] = (unsigned char)I2CMasterDataGet(I2C_BASE_ADDR); I2CMasterIntClearEx(I2C_BASE_ADDR, I2C_INT_RECV_READY); } I2CMasterStop(I2C_BASE_ADDR); while(0 == (I2CMasterIntRawStatus(I2C_BASE_ADDR) & I2C_INT_STOP_CONDITION)); I2CMasterIntClearEx(I2C_BASE_ADDR, I2C_INT_STOP_CONDITION); }
/* ** Transmits data over I2C bus */ void SetupI2CTransmit2(int count) { I2CSetDataCount(SOC_I2C_0_REGS, count); I2CMasterControl(SOC_I2C_0_REGS, I2C_CFG_MST_TX | I2C_CFG_STOP); I2CMasterIntEnableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY | I2C_INT_STOP_CONDITION | I2C_INT_NO_ACK); I2CMasterStart(SOC_I2C_0_REGS); while(flag); flag = 1; }
/* ** Receives data over I2C bus */ void SetupI2CReception(int count) { I2CSetDataCount(SOC_I2C_0_REGS, count); I2CMasterControl(SOC_I2C_0_REGS, I2C_CFG_MST_RX | I2C_CFG_STOP); I2CMasterIntEnableEx(SOC_I2C_0_REGS, I2C_INT_DATA_READY | I2C_INT_STOP_CONDITION | I2C_INT_NO_ACK); I2CMasterStart(SOC_I2C_0_REGS); while(flag); flag = 1; }
/* ** Function to receive data from the Codec through I2C bus */ static void I2CCodecRcvBlocking(unsigned int baseAddr, unsigned int dataCnt) { txCompFlag = 1; dataIdx = 0; savedBase = baseAddr; I2CSetDataCount(baseAddr, dataCnt); I2CMasterControl(baseAddr, I2C_CFG_MST_RX | I2C_CFG_STOP); I2CMasterIntEnableEx(baseAddr, I2C_INT_DATA_READY | I2C_INT_STOP_CONDITION); I2CMasterStart(baseAddr); /* Wait till data is received fully */ while(txCompFlag); }
/* ** Function to send data through i2c */ static void I2CCodecSendBlocking(unsigned int baseAddr, unsigned int dataCnt) { txCompFlag = 1; dataIdx = 0; savedBase = baseAddr; I2CSetDataCount(baseAddr, dataCnt); I2CMasterControl(baseAddr, I2C_CFG_MST_TX | I2C_CFG_STOP); I2CMasterIntEnableEx(baseAddr, I2C_INT_TRANSMIT_READY | I2C_INT_STOP_CONDITION); I2CMasterStart(baseAddr); /* Wait till the data is sent */ while(txCompFlag); }
/* ** Function to receive data from the Codec through I2C bus */ void I2C0RcvBlocking(unsigned int dataCnt) { txCompFlag = 1; dataIdx = 0; while(I2C0IsBusy()); I2CSetDataCount(SOC_I2C_0_REGS, dataCnt); I2CMasterControl(SOC_I2C_0_REGS, I2C_CFG_MST_RX | I2C_CFG_STOP); I2CMasterIntEnableEx(SOC_I2C_0_REGS, I2C_INT_DATA_READY | I2C_INT_STOP_CONDITION | I2C_INT_NO_ACK); I2CMasterStart(SOC_I2C_0_REGS); /* Wait till data is received fully */ while(txCompFlag); while(I2C0IsBusy()); }
/* ** Function to send data through i2c */ void I2C0SendBlocking(unsigned int dataCnt) { txCompFlag = 1; dataIdx = 0; while(I2C0IsBusy()); I2CSetDataCount(SOC_I2C_0_REGS, dataCnt); I2CMasterControl(SOC_I2C_0_REGS, I2C_CFG_MST_TX | I2C_CFG_STOP); I2CMasterIntEnableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY | I2C_INT_STOP_CONDITION | I2C_INT_NO_ACK); I2CMasterStart(SOC_I2C_0_REGS); /* Wait till the data is sent */ while(txCompFlag); while(I2C0IsBusy()); }