package i2c;
import com.jopdesign.io.*;
public class HelloI2C {
// Our address when functioning as a slave. Limited to 7 bits (0 to 127)
public static final int MASTER_ADD = 50;
// The device address to whom we wish to communicate
public static final int SLAVE_ADD = 55;
public static final int COUNT = 1;
// read or write request
public static int READ = 1;
public static int WRITE = 0;
static I2Cport i2cMaster;
static I2Cport i2cSlave;
public static void main(String[] args) {
HelloI2C app = new HelloI2C();
System.out.println();
System.out.println("Hello i2c!");
System.out.println();
I2CFactory fact = I2CFactory.getFactory();
i2cMaster = fact.getI2CportA();
i2cSlave = fact.getI2CportB();
i2cMaster.initialize(MASTER_ADD, true);
i2cSlave.initialize(SLAVE_ADD, false);
// app.writeTest();
// app.readTest();
// int[] data = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
// i2cMaster.writeBuffer(data);
// app.simEEPROM();
app.videoCodecTest();
}
public void writeTest(){
int[] data = {1,2,3,4,5};
i2cMaster.write(SLAVE_ADD, data);
}
public void readTest(){
int[] data = new int[6];
// Write something into the slave tx buffer
for(int i=0; i<data.length;i++){
i2cSlave.tx_fifo_data = i;
}
i2cMaster.read(SLAVE_ADD, data.length);
}
// NOTE: Works only in simulation with ModelSim, using VHDL model
// of 24CXX EEPROM
public void simEEPROM(){
int EEPROM_ADDR = 80;
int BYTE_ADDR = 16;
int PAGE_SIZE = 16;
// Data to write to eeprom
int[] writeData = new int[PAGE_SIZE + 1];
// Array to store read data
int[] readData = new int[PAGE_SIZE];
for (int i = 0; i < writeData.length; ++i){
writeData[i] = 3*i+5;
}
// Set byte address
writeData[0] = BYTE_ADDR;
// Write the data
i2cMaster.write(EEPROM_ADDR, writeData);
// Poll busy bit to detect transmission is finished
while((i2cMaster.status & I2Cport.BUS_BUSY) == I2Cport.BUS_BUSY){
;
}
// Perform a dummy write to set the read address of eeprom
i2cMaster.flushTXBuff();
i2cMaster.write(EEPROM_ADDR, BYTE_ADDR);
// Poll busy bit to detect transmission is finished
while((i2cMaster.status & I2Cport.BUS_BUSY) == I2Cport.BUS_BUSY){
;
}
// Now read the data
i2cMaster.read(EEPROM_ADDR, PAGE_SIZE);
// Poll the data ready flag
while((i2cMaster.status & I2Cport.DATA_RDY) == 0){
;
}
// Read data buffer
i2cMaster.readBuffer(readData);
//Print read data
// for(int i=0; i < readData.length; i++){
// System.out.println(readData[i] & 0x000000FF);
// }
}
// NOTE: To use on Altera DE2-70 board
public void videoCodecTest(){
int ADV_ADDR = 32;
int SUB_ADDR = 13;
int READ_SIZE = 16;
// Array to store read data
int[] readData = new int[READ_SIZE];
i2cMaster.writeRead(ADV_ADDR, SUB_ADDR, READ_SIZE);
// Poll the data ready flag
while((i2cMaster.status & I2Cport.DATA_RDY) == 0){
;
}
int data_in_buffer = (i2cMaster.rx_occu & I2Cport.OCCU_RD) >>> 16;
System.out.println("RX buffer occupancy: "+data_in_buffer+" bytes");
System.out.println();
// Read data buffer
i2cMaster.readBuffer(readData);
//Print read data
for(int i=0; i < READ_SIZE; i++){
System.out.println("["+(SUB_ADDR+i)+"]: " + (readData[i]));
}
System.out.println();
i2cMaster.dumpRegisters();
System.out.println();
// **************** Perform another operation ************************
SUB_ADDR = SUB_ADDR+17;
i2cMaster.writeRead(ADV_ADDR, SUB_ADDR, READ_SIZE);
// Poll the data ready flag
while((i2cMaster.status & I2Cport.DATA_RDY) == 0){
;
}
data_in_buffer = (i2cMaster.rx_occu & I2Cport.OCCU_RD) >>> 16;
System.out.println("RX buffer occupancy: "+data_in_buffer+" bytes");
System.out.println();
// Read data buffer
i2cMaster.readBuffer(readData);
//Print read data
for(int i=0; i < READ_SIZE; i++){
System.out.println("["+(SUB_ADDR+i)+"]: " + (readData[i]));
}
System.out.println();
i2cMaster.dumpRegisters();
}
// NOTE: To use on Xilinx ML-507 board
public void xilEEPROM(){
// Comming soon....
}
}