//*********************************************//
//*** This routine will reset the I2C bus ***//
//********************************************//
void Reset_I2C(void)
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_RESET_BASE, 1); // Set RESET to output
IOWR_ALTERA_AVALON_PIO_DATA(I2C_RESET_BASE, 1); // Set RESET high
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_RESET_BASE, 0); // Set RESET low
delay(I2C_TIMER);
delay(I2C_TIMER);
delay(I2C_TIMER);
delay(I2C_TIMER);
delay(I2C_TIMER);
delay(I2C_TIMER);
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_RESET_BASE, 1); // Set RESET high
delay(I2C_TIMER1);
}
// ******************************************** //
// *** This routine will setup the I2C Port *** //
// ******************************************** //
void Init_I2C(void)
{ //1 ??
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SCL_BASE, 1); // Set SCL to output
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1); // Set SDA to output
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1); // Set SCL high
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1); // Set SDA high
delay(I2C_TIMER);
}
// ************************************************ //
// *** This routine will send the I2C Start Bit *** //
// ************************************************ //
void I2C_Start (void)
{
delay(I2C_TIMER/2);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1); // Set SCL High
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1); // Set SDA High
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1); // Set SDA to output
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 0); // Clear SDA
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1); // Set SCL high
delay(I2C_TIMER);
}
//*********************************************** //
// *** This routine will send the I2C Stop Bit *** //
// *********************************************** //
void I2C_Stop (void)
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1); // Set SDA to output
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 0); // Clear SDA
delay(I2C_TIMER*2);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0); // Clear SCL
delay(I2C_TIMER*2);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1); // Set SCL High
delay(I2C_TIMER*4);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1); // Set SDA High
delay(I2C_TIMER*2);
}
// ******************************************************** //
// *** This routine will write a byte to the I2C device *** //
// ******************************************************** //
void Write_I2C_Byte(unsigned char byte)
{
unsigned int i;
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1); // Set SDA to output
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0);
delay(I2C_TIMER);
for (i = 0; i < 8; i++){ // Loop for our 8 bits
if((byte & 0x80) == 0x80) IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1); // Set I2C SDA PIN
else IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 0); // Clear I2C SDA PIN
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1); // Set SCL High, Clock data
delay(I2C_TIMER);
byte = byte << 1; // Shift data in buffer right one
}
while(I2C_Ackn() ); // Check for acknowledge from I2C device
}
unsigned char I2C_Ackn(void)
{
unsigned char Ackn = 0; // Temp RAM for Ackn flag
delay(I2C_TIMER/2);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0); // CLEARBIT(I2C_PORT,SCL);
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 0); // Set SDA to input
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1); //SETBIT(I2C_PORT,SCL); // Clock the ACK bit
delay(I2C_TIMER/2);
if ((IORD_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE)&0x01)==0x01) Ackn = 1; // Check the ACK bit on SDA
delay(I2C_TIMER);
//IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0); //CLEARBIT(I2C_PORT ,SCL); // Clear the clock