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

📄 i2c.c

📁 单片机键值测定程序
💻 C
字号:


//I2C BUS
//-----------------时间协议-----------------------------------------
//STOP 后须栽再等待至少4.7uS的时间才可以再STRAT,
//STRAT信号至少维持4.0uS的时间.
//SCL的低电平维持时间至少要4.7uS.
//SCL和SDA的上升时间最多不超过1.0uS的时间.
//SCL已经降到低电平,SDA至少维持5.0uS的时间.
//SCL的高电平维持时间至少要4.0uS.
//SCL和SDA的下降时间最多不超过0.3uS.
//SCL必须在SCL转换为高电平之前,SDA至少要领先0.25uS的时间.
//连续START时,SDA必须在SDA转换高电平之后,SDA至少多维持4.7uS的时间.
//STOP时,SCL至少领先4.0uS的时间.


//BOOL=bit; BYTE=char; WORD=int.


#include <intrins.h>  
#include "define.h"
#include "global.h"


void I2CWait(void);
//----------------DELAY1mS------------------------------------------------
void DelayX1ms(uchar k)
{
 uchar i,j;
 for(i=0;i<k;i++)
   for(j=0;j<200;j++)
    _nop_();
 }
//----------------EEprom I2C START-----------------------------------------
void I2CStart(void)
{
  ISDA=1;
  ISCK=1;
  I2CWait();
  ISDA=0;
  I2CWait();
  ISCK=0;
}


//-----------------EEprom I2C Stop------------------------------------------
void I2CStop(void)
{
  ISDA=0;
  I2CWait();
  ISCK=1;
  I2CWait();
  ISDA=1;
}
//------------------EEprom I2C Wait----------------------------------------
void I2CWait(void)
{
  _nop_();                      //等待1个机器周期,此函数在头文件<intrins.h>内.
  _nop_();
}



//------------------传送确认信号"1"或"0"电平到slave端----------------------
void SendAcknowledge(bit ack)
{

 ISDA=ack;
 ISCK=1;
 I2CWait();
 ISCK=0;
 }


//------------------EEprom I2C 发送数据------------------------------------
//传送一个字节到服务器.
//bytedata:要传送的数据.
bit I2CSentByte(uchar bytedata)                  //反回一个位的确认信号
{
  uchar i;
  bit ack;                                      //定义确认信号
 
  ISDA=1;
  for(i=0;i<8;i++)
   {
      if(bytedata & 0x80)
        ISDA=1;
      else
        ISDA=0;
	  bytedata<<=1;
      I2CWait();
      
      ISCK=1;
      I2CWait();
      ISCK=0;
      I2CWait();
    }

    ISDA=1;
    I2CWait();
    ISCK=1;
    I2CWait();
    ack=ISDA;
    I2CWait();
    ISCK=0;
    I2CWait();
    return ack;
}

//--------------------------读取一个数剧-------------------------------------
uchar I2CReceiveByte(void)
{
 uchar i;
 uchar bytedata=0;
 //从高位开始
 for(i=0;i<8;i++)
  {
    ISCK=1;
    I2CWait();
    bytedata<<=1;
    if(ISDA)
      bytedata|=0x01;

    ISCK=0;
    I2CWait();
  }
return bytedata;
}  



//---------------------------将数据写入指定器件的地址内----------------------
//device:slave地址,每个IIC BUS的组件都有一个器件地址
//address:sub地址
//bytedata:数据


void I2cByteWrite (uchar device,  uchar address,  uchar bytedata  )
{
 uchar i;
 bit ack;
 bit FgTimeout;

 FgTimeout=1;
 for ( i=0;i<10;i++ )
  {
  
   I2CStart();

   ack=I2CSentByte(device & 0xfe);             // & 0xfe是写入指令
   if (ack==1)
   {
     I2CStop();
	 continue;
   }

   ack=I2CSentByte(address);
   if(ack==1)
   {
     I2CStop();
	 continue;
   }

   ack=I2CSentByte(bytedata);
   if(ack==1)
   { 
     I2CStop();
	 continue;
   }



   I2CStop();
   FgTimeout=0;
   if(ack==0)
     break;

  }
  DelayX1ms(10);
}




//---------------------------------------从指定的器件地址内读取数据----------------------------------

uchar I2cByteRead(uchar device, uchar address )
{

 uchar bytedata;
 bit ack;

 I2CStart();
 if(ack=I2CSentByte(device))return;                  //注意器件地址加写入位
 if(ack=I2CSentByte(address))return;
 I2CStart();
 if(ack=I2CSentByte(device|0x01))return;
 bytedata=I2CReceiveByte;
 SendAcknowledge(1);                   //Master 端送出确认的信号等于"1",即Acknowledge="1"
 I2CStop();
 return bytedata;
}



⌨️ 快捷键说明

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