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

📄 i2c.c

📁 IIC C语言程序
💻 C
字号:
//file:i2c.c
//description: i2c bus sub program
//author: yan ding bo
//version: ver1.0
//date: 2005-11-29

#include <ipHAL.h> 

#define I2cSCL  RD,0
#define I2cSDA  RC,7

#define I2cRdOption 1
#define I2cWrOption 0

void I2cStart(void);                                 //i2c开始条件函数声明//
void I2cStop(void);                                  //i2c停止条件函数声明//
bool_t I2cRxdAck(void);                                //i2c接收应答函数声明(写操作)//
void I2cWrite8Bit(u8_t WrData);               //从器件中写一个字节函数声明//
extern void Delay(u16_t temp);

void I2Cinit(void)
{
  pin_dir_out(I2cSDA);
  pin_dir_out(I2cSCL);
}

//从器件中写数据,chip_address为器件地址,reg_address为器件中寄存器地址,pcl_data为写地址的指针,data_num为向器件写数据的个数//
bool_t I2cWrite(u8_t ChipAddress,u8_t WRData)
{
  bool_t DataNumSuccess;                              //成功标志//
  DataNumSuccess=1;
  I2cStart();
  I2cWrite8Bit(ChipAddress|I2cWrOption);    //写器件地址,写操作//
  if(I2cRxdAck()==1)                       //返回低电平,表示写成功//
     DataNumSuccess=0;                   //不成功//
  I2cWrite8Bit(WRData);                 //写到器件的数据//
  if(I2cRxdAck()==1)                 //返回低电平,表示写成功//
    DataNumSuccess=0;              //不成功//
  I2cStop();		
  return DataNumSuccess;
}

//i2c总线开始//
void I2cStart(void)
{
  pin_high(I2cSCL);             //I2cScl先输出高,I2cSda再输出高,可以产生停止条件
  pin_high(I2cSDA);  
  Delay(20);
  pin_low(I2cSDA);           //I2cSda先输出低(I2cScl为高的情况下)
  Delay(20);
  pin_low(I2cSCL);          //I2cScl先输出低,产生开始条件(I2cScl为高的情况下)
  Delay(20);
}

//i2c总线结束//
void I2cStop(void)
{
  pin_low(I2cSCL);            //I2cScl先输出低,I2cSda再输出低,无论什么情况都不会产生开始和停止条件
  pin_low(I2cSDA);
  Delay(20);
  pin_high(I2cSCL);              //I2cScl先输出高
  Delay(20);
  pin_high(I2cSDA);              //I2cSda再输出高,产生停止条件(I2cScl为高的情况下)
  Delay(20);
}

//接收应答位//
bool_t I2cRxdAck(void)
{
  bool_t AckFlag;
  pin_dir_in(I2cSDA);               //I2cSda为输入
  Delay(20);
  pin_high(I2cSCL);
  Delay(100);
  AckFlag=read_pin(I2cSDA);
  pin_low(I2cSCL);
  Delay(20);
  pin_dir_out(I2cSDA);               //I2cSda为输出
  return AckFlag;  
}

//写一个字节//
void I2cWrite8Bit(u8_t WrData)
{
  u8_t temp;
  for(temp=0x80;temp;temp>>=1)
  {
    if(temp&WrData)
      pin_high(I2cSDA);
    else
      pin_low(I2cSDA);
    Delay(20);
    pin_high(I2cSCL);
    Delay(20);
    pin_low(I2cSCL);
    Delay(20);
  }
}


 

⌨️ 快捷键说明

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