⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 用c做的pic24系列模拟i2c接口
💻 C
字号:
#define SCL  _RB3
#define SDA  _RB2
#define HIGH 1
#define LOW  0
void DEFI2C(char *name); //To define which pin is SDA and which pin is SCL
void I2CInit();   //Initialization For I2C Bus
void I2CStart();  //Start I2C Bus
void I2CStop();  //Stop  I2C Bus
void I2CClock(); //return SDA while SCL is HIGH
void I2CDelay(); //Delay
void I2CAck();  //Answer 
uchar  I2CSend(uchar I2CData);/ nd data with I2C Bus
uchar I2CReceive();  //Receive data



void I2CStart()
{
   SDA=HIGH;
   I2CDelay();   
   SCL=HIGH;
   I2CDelay();
   SDA=LOW;
   I2CDelay();
   SCL=LOW;
   I2CDelay();
}
void I2CStop()
{
   SDA=LOW;
   I2CDelay();
   SCL=HIGH;
   I2CDelay();
   SDA=HIGH;
   I2CDelay();
   SCL=LOW;
   I2CDelay();
}
void I2CInit()
{
   SCL=LOW;
   I2CStop();
}
void I2CClock() //return SDA while SCL is HIGH
{
   SCL=HIGH;
   I2CDelay();
   SCL=LOW;
   I2CDelay();
}

void sendI2CClock(void)
{
   SCL=HIGH;
   I2CDelay();
   SCL=LOW;
   I2CDelay();		
}

uchar I2CSend(uchar I2CData)
{
   uchar i;
   for(i=0;i<8;i++)
   {
     if(I2CData & 0x80)  
     {
        SDA = 1;

     }
     else                SDA = 0;
     sendI2CClock();
     I2CData=I2CData << 1;
   }
   SDA=HIGH;
//   return (~I2CClock());
}
void I2CAck()
{
   SDA=LOW;
   I2CClock();
   SDA=HIGH;   
}

void I2CNAck()
{
   SDA=HIGH;
   I2CClock();
   SDA=HIGH;
}

uchar I2C_GetACK(void)
{
    uchar nTemp = 0;
    int j;

    SCL = 0;
    Nop();
    Nop();    
    SDA = 1;
    Nop();
    Nop();
    TRISB |= 0x0004; 
    Nop();
    Nop();
    Nop();
    SCL = 1;   
    for(j=0;j<20;j++);
    nTemp = SDA;	//获得数据
    for(j=0;j<30;j++);
    SCL = 0;
    TRISB &= 0xFFFB;
    Nop();
    Nop();
    Nop();    
    return nTemp;
}

void I2CDelay()
{
   unsigned int ll;
   for(ll=0;ll<50;ll++)
   {
      ;
   }
}

uchar I2CReceive()
{
   uchar I2CData=0;
   uchar kk,j;
   TRISB |= 0x0004; 
   Nop();
   Nop();
   Nop();

   for(kk=0;kk<8;kk++)
   {
      I2CData <<= 1;
      SCL=HIGH;
   	  for(j=0;j<20;j++);
      if(SDA==HIGH) I2CData |= 1;
      for(j=0;j<30;j++);
      SCL=LOW;
      I2CDelay();
   }
   TRISB &= 0xFFFB;
   SDA= HIGH;
   return I2CData;
}

int main(void)
{  	
uchar iiii = 0,jjjj = 0;    
    AD1PCFG=0xFFFF;
  	TRISB=0x0301;   	// INT1 AND INT2 INPUT
  	LATB =0;
//  	SRbits.IPL =2;    	// CPU PRIORITY=2
//  	SRbits.IPL =2;    	// CPU PRIORITY=2
//  	InitINT1();
//  	InitINT2();
//    RXTX_485=0;		  	//485处于从电脑接收数据状态
//  	INITUART1();
//	INITRTCC ();
//  	LED4=0;
//	jdq1=ON;			//继电器动作标志
//	jdq2=ON;
    I2CInit();
     
    while(1)
    {
    	I2CStart();
    	I2CSend(0xa0);
    	I2C_GetACK();
//        I2CDelay();
//        I2CClock();
    	I2CSend(0x14);
		I2C_GetACK();
//        I2CDelay();
//        I2CClock();
    	I2CSend(0x77);
		I2C_GetACK();
//        I2CDelay();
//       I2CClock();
    	I2CStop();
    	delay(10);
    	I2CStart();
    	I2CSend(0xa0);
		I2C_GetACK();
//        I2CClock();
//        I2CDelay();
    	I2CSend(0x13); 
		I2C_GetACK();
//        I2CDelay();
//        I2CClock();
        I2CStart(); 
//        I2CDelay();        
        I2CSend(0xa1);
//        I2CClock();
		I2C_GetACK();
        iiii = I2CReceive(); 
        I2CAck();
        jjjj = I2CReceive(); 
        I2CNAck();
        I2CStop(); 
        while(1);	    	  	
    }

//	while(1) 
//	{ ReadRTCC();
//	  Run();
//	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -