📄 i2c.c
字号:
/*********************************/
/* Write Output Data to 24C04 */
/* Addr = ID Code+Direction(W:0) */
/* Data = Output Data Write Port */
/*********************************/
void write_byte_24C04(unsigned char Addr,unsigned char Data) // Write Output 24C04
{
T2MCR=0x03;
T2TCR = 0x00000001; //Enable Timer 2
TimeOUT_I2C=0;
I2C0CONCLR = 0x6C; // Reset all I2C Status
I2C0CONSET = 0x40; // Enable I2C Interface
I2C0CONSET = 0x20; // Send Start Condition
while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;}
// Wait I2C Status Return
// while((I2C0STAT)!= 0x08){;;} // Wait Start Condition Complete
I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag
I2C0DAT = 0xA0; // Send EEPROM Address +[Write]
// Wait I2C Status Return
while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x18){;;} // Wait Slave Address+W, ACK
I2C0DAT = Addr; // Send DataAddress to EEPROM
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x28){;;} // Data has been transmitted, ACK has been received
I2C0DAT = Data; // Send Output Data to EEPROM
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
// Wait I2C Status Return
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;} // Data has been transmitted, ACK has been received
I2C0CONSET = 0x10; // Send Stop Condition
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
// delay(100000); // Clear Acknowledge Bit + Interrupt Flag
T2TCR = 0x00000000; //Disable Timer 2
TimeOUT_I2C=0;
}
void read_24C04(unsigned char DeviceAddr,unsigned char DataAddr, char *Buffer, char Count)
{
unsigned char Data;
T2MCR=0x03;
T2TCR = 0x00000001; //Enable Timer 2
TimeOUT_I2C=0;
I2C0CONCLR = 0x6C; // Reset all I2C Status
I2C0CONSET = 0x40; // Enable I2C Interface
I2C0CONSET = 0x20; // Send Start Condition
while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;}
// Wait I2C Status Return
// while((I2C0STAT)!= 0x08){;;} // Wait Start Condition Complete
I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag
I2C0DAT = DeviceAddr & 0xfe; // Send EEPROM Address +[Write]
// Wait I2C Status Return
while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x18){;;} // Wait Slave Address+W, ACK
I2C0DAT = DataAddr; // Send DataAddress to EEPROM
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x28){;;} // Data has been transmitted, ACK has been received
I2C0DAT = 0x00; // Send Output Data to EEPROM
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
// Wait I2C Status Return
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;} // Data has been transmitted, ACK has been received
I2C0CONSET = 0x20; // Send Start Condition
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag while((I2C0STAT)!= 0x08);//{;;} // Wait Start Condition Complete
while(((I2C0STAT)!= 0x10) && (TimeOUT_I2C<2)){;;} // Wait Start Condition Complete
I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag
I2C0DAT = DeviceAddr|0x01; // Send EEPROM Address +[Write]
// Wait I2C Status Return
while(((I2C0STAT)!= 0x40) && (TimeOUT_I2C<2)){;;} // Wait Slave Address+R, ACK
I2C0CONCLR = 0x08;
I2C0CONSET = 0x04; // ACK to slave device
for (Data=0; Data<Count-1;Data++)
{
while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;} // Wait Received Data from EEPROM
Buffer = I2C0DAT; // Received Data from EEPROM
I2C0CONCLR = 0x08; // Clear Acknowledge Bit + Interrupt Flag
I2C0CONSET = 0x04; // ACK to slave device
Buffer++;
}
while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;} // Wait Received Data from EEPROM
Buffer = I2C0DAT; // Received Data from EEPROM
I2C0CONCLR = 0x08; // Clear Acknowledge Bit + Interrupt Flag
I2C0CONSET = 0x00; // NACK to slave device
while(((I2C0STAT)!= 0x58) && (TimeOUT_I2C<2)){;;} // Wait Received Data from EEPROM
I2C0CONCLR = 0x08; // Clear Acknowledge Bit + Interrupt Flag
I2C0CONSET = 0x10; // Send Stop Condition
}
/*********************************/
/* Write Output Data to 24C04 */
/* Addr = ID Code+Direction(W:0) */
/* Data = Output Data Write Port */
/*********************************/
void write_byte_24C04(unsigned char Addr,unsigned char Data) // Write Output 24C04
{
T2MCR=0x03;
T2TCR = 0x00000001; //Enable Timer 2
TimeOUT_I2C=0;
I2C0CONCLR = 0x6C; // Reset all I2C Status
I2C0CONSET = 0x40; // Enable I2C Interface
I2C0CONSET = 0x20; // Send Start Condition
while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;}
// Wait I2C Status Return
// while((I2C0STAT)!= 0x08){;;} // Wait Start Condition Complete
I2C0DAT = 0xA0; // Send EEPROM Address +[Write]
I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag
// Wait I2C Status Return
while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x18){;;} // Wait Slave Address+W, ACK
I2C0DAT = Addr; // Send DataAddress to EEPROM
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x28){;;} // Data has been transmitted, ACK has been received
I2C0DAT = Data; // Send Output Data to EEPROM
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
// Wait I2C Status Return
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;} // Data has been transmitted, ACK has been received
I2C0CONSET = 0x10; // Send Stop Condition
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
// delay(100000); // Clear Acknowledge Bit + Interrupt Flag
T2TCR = 0x00000000; //Disable Timer 2
TimeOUT_I2C=0;
}
void read_24C04(unsigned char DeviceAddr,unsigned char DataAddr, char *Buffer, char Count)
{
char Data;
T2MCR=0x03;
T2TCR = 0x00000001; //Enable Timer 2
TimeOUT_I2C=0;
I2C0CONCLR = 0x6C; // Reset all I2C Status
I2C0CONSET = 0x40; // Enable I2C Interface
I2C0CONSET = 0x20;
delay(100); // Send Start Condition
while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2))//{;;}
// Wait I2C Status Return
{
I2C0CONSET = 0x10;
I2C0CONCLR = 0x18; // Enable I2C Interface
I2C0CONCLR = 0x6C; // Reset all I2C Status
I2C0CONSET = 0x40; // Enable I2C Interface
I2C0CONSET = 0x20; // Send Start Condition
}// while((I2C0STAT)!= 0x08){;;} // Wait Start Condition Complete
I2C0DAT = DeviceAddr & 0xfe; // Send EEPROM Address +[Write]
delay(100);
I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag
TimeOUT_I2C=0;
// Wait I2C Status Return
while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x18){;;} // Wait Slave Address+W, ACK
I2C0CONCLR = 0x08; // Clear Acknowledge Bit + Interrupt Flag
I2C0DAT = DataAddr; // Send DataAddress to EEPROM
TimeOUT_I2C=0;
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
// while((I2C0STAT)!= 0x28){;;} // Data has been transmitted, ACK has been received
I2C0CONCLR = 0x08; // Clear Acknowledge Bit + Interrupt Flag
I2C0DAT = 0x00; // Send Output Data to EEPROM
TimeOUT_I2C=0;
// Wait I2C Status Return
while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;} // Data has been transmitted, ACK has been received
I2C0CONSET = 0x10; // Send Stop Condition
I2C0DAT = 0xA1; // Send EEPROM Address +[READ]
I2C0CONCLR = 0x08; // Clear Acknowledge Bit + Interrupt Flag while((I2C0STAT)!= 0x08);//{;;} // Wait Start Condition Complete
TimeOUT_I2C=0;
delay(10000);
I2C0CONSET = 0x20; // Send Stop Condition
// I2C0CONCLR = 0x2C; // Reset all I2C Status
// I2C0CONSET = 0x40; // Enable I2C Interface
// I2C0CONSET = 0x20; // Send Start Condition
while(((((I2C0STAT)!= 0x10) && (I2C0STAT)!= 0x08)) && (TimeOUT_I2C<2)){;;} // Wait Start Condition Complete
I2C0DAT = 0xA1; // Send EEPROM Address +[READ]
I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag
// Wait I2C Status Return
while(((I2C0STAT)!= 0x40) && (TimeOUT_I2C<2)){;;}
// {
// I2C0CONCLR=0x28;
// I2C0CONSET = 0x20;
// I2C0DAT = 0xA1; // Send EEPROM Address +[READ]
//// while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;} // Wait Start Condition Complete
//// I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag
//// I2C0DAT = 0xA1; // Send EEPROM Address +[READ]
// } // Wait Slave Address+R, ACK
Data=I2C0DAT;
I2C0CONSET = 0x04; // ACK to slave device
I2C0CONCLR = 0x08;
// I2C0CONSET = 0x04; // ACK to slave device
I2C0CONCLR = 0x04;
for (Data=0; Data<Count-1;Data++)
{
while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;} // Wait Received Data from EEPROM
// I2C0CONSET = 0x04; // ACK to slave device
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
I2C0CONSET = 0x04; // ACK to slave device
*Buffer = I2C0DAT; // Received Data from EEPROM
Buffer++;
}
while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;} // Wait Received Data from EEPROM
*Buffer = I2C0DAT; // Received Data from EEPROM
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
I2C0CONSET = 0x00; // NACK to slave device
while(((I2C0STAT)!= 0x58) && (TimeOUT_I2C<2)){;;} // Wait Received Data from EEPROM
I2C0CONSET = 0x10; // Send Stop Condition
I2C0CONCLR = 0x08; // Clear Acknowledge Bit + Interrupt Flag
}
/*
void i2c_isr(void) __irq
{
switch (I2C0STAT) //Read result code and switch to next action
{
// Start and Send byte conditions
case (0x08): //Start bit
I2C0CONCLR = 0x20; //Clear start bit
I2C0DAT = I2CAddress; //Send address and write bit
break;
case (0x10): //Start bit
I2C0CONCLR = 0x20; //Clear start bit
I2C0DAT = I2CAddress+1; //Send address and write bit
// I2C0CONSET = 0x20; //Send RESTART
break;
case (0x18): //Slave address+W, ACK
I2C0DAT = MemAddress; //Write Mem,ory start address to tx register
break;
case (0x20): //Salve address +W, Not ACK
I2C0DAT = I2CAddress; //Resend address and write bi
break;
case (0x28):
if(I2Counter-->0) //Data sent, Ack
{
I2C0DAT = *I2CData; //Write data to tx register
I2CData++;
}
else
{
if (NEXTREAD)
{
I2C0CONSET = 0x20; //Send RESTART
lock = 0; //Signal end of I2C activity
}
else
{
I2C0CONSET = 0x10; //Stop condition
lock = 0; //Signal end of I2C activity
}
}
break;
case (0x30) : //Data sent, NOT Ack
I2C0DAT = *I2CData; //Write data to tx register
break;
//Receive byte conditions
case (0x40) : //Slave Address +R, ACK
I2C0CONSET = 0x04; //Enable ACK for data byte
break;
case (0x48) : //Slave Address +R, Not Ack
I2C0CONSET = 0x20; //Resend Start condition
break;
case (0x50) : //Data Received, ACK
if(--I2Counter>0)
{
*I2CData= I2C0DAT;
I2CData++;
}
else
{
I2C0CONSET= 0x10; //Stop condition
lock = 0; //Signal end of I2C activity
}
break;
case (0x58): //Data Received, Not Ack
I2C0CONSET= 0x20; // Resend Start condition
break;
default :
break;
}
I2C0CONCLR = 0x08; //Clear I2C interrupt flag
VICVectAddr = 0x00000000; //Clear interrupt in
}
void I2CTransferByte(unsigned int I2CAddr,unsigned char MemAddr,unsigned char count,...)
{
va_list ap;
va_start(ap,count);
// I2C0CONCLR = 0x0000002C; //Clear all I2C settings, except ENABLE bit
// while((lock == 1 ) && (TimeOUT_I2C < 2)) //Wait for interrupt to signal end of I2C activity
// {
// ;
// }
lock = 1; //Set I2C bus as active
// delay(100000);
I2CAddress = I2CAddr; //Place address and data in Globals to be used by the interrupt
if(count >0)
{
I2CData = va_arg(ap,unsigned char *);
RestoreI2CData= va_arg(ap,unsigned char *);
}
I2Counter = count;
MemAddress = MemAddr;
// I2C0CONCLR = 0x0000002C; //Clear all I2C settings, except ENABLE bit
I2C0CONSET = 0x00000040; //Enable the I2C interface
I2C0CONSET = 0x00000020; //Start condition
T2MCR=0x03;
T2TCR = 0x00000001; //Enable Timer 2
TimeOUT_I2C=0;
while((lock == 1 ))// && (TimeOUT_I2C < 2)) //Wait for interrupt to signal end of I2C activity
{
;
}
T2TCR = 0x00000000; //Disable Timer 2
TimeOUT_I2C=0;
// lock = 1; //Set I2C bus as active
va_end(ap);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -