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

📄 24cxxwr.h

📁 Easy51RTOS应用Easy51RTOS应用
💻 H
字号:
#ifndef _24CXXWR_H_
#define _24CXXWR_H_
#ifndef	FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif

sbit  SCL=P1^1;
sbit  SDA=P1^2;

void I2C_Start();  // 开启总线       (内部函数)
void I2C_Stop();   // 结束总线函数   (内部函数)
void I2C_Init();   // 初始化函数     (内部函数)
bit  I2C_Clock();  // 发送或接收1Bit (内部函数)

void  I2C_SendByte(uchar Data);  // 发送一个字节(内部函数)
uchar I2C_ReceiveByte();         // 接收从器件传来的数据(内部函数)
void  I2C_Ack(bit a);            // 发送应答信号  I2C_Ack(TRUE); 
                                 // 发送非应答信号I2C_Ack(FALSE);

// 将n个字节的数据写入/读出, Control为控制字符, Addr为地址
bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n); 
bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n);

//对AT24C16读写数据, Addr为16位地址 0x0000~0x07FF
void Write24C16(uint Addr, uchar *Buffer, uchar n);
void Read24C16(uint Addr, uchar *Buffer, uchar n);

bit Ack;       // 应答标志位   
void I2C_Start()  // 开启总线
{
   SCL=1;      // 初始化高电平
   SDA=0;      // 发送开始信号
   SCL=0;      // 拉低时钟信号,以锁定总线
}

void I2C_Stop()   // 结束总线函数
{
  SDA=0;     // 发送结束条件的数据信号  
  SCL=1;     // 发送结束条件的时钟信号     
  SDA=1;     // 发送I2C总线结束信号
  SCL=0;        // 关闭总线
}

void I2C_Init()   // 初始化函数
{
  SCL=0; 
  I2C_Stop();
}

bit I2C_Clock()   // 用于发送1Bit(调用前要将数据送到SDA)
{                 // 也可用于接收(接收时钟上升3us后的数据)
  bit Sample; 
  SCL=1;             // 拉高时钟 
  Sample=SDA;        // 读?数据线状态
  SCL=0;             // 恢复时钟低电平
  return Sample;
}

void  I2C_SendByte(uchar Data)  // 发送一个字节
{
  uchar i;  
  for(i=0; i<8; i++)  
  {
    SDA=(bit)(Data&0x80);
    I2C_Clock();                
    Data=Data<<1;
  }    
  SDA=1;
  Ack=!I2C_Clock();
}

uchar  I2C_ReceiveByte()    //接收从器件传来的数据
{
  uchar Data=0, i;
  SDA=1;
  for(i=0; i<8; i++)
  {               
    Data=Data<<1;
    if(I2C_Clock()) Data++;    
  }
  return Data;
}

void I2C_Ack(bit a)         // 发送应答信号   I2C_Ack(TRUE);
{                           // 发送非应答信号 I2C_Ack(FALSE);
  if(a==FALSE) SDA=1;
  else SDA=0;     
  SCL=1;SCL=0;              // 清时钟线,钳I2C总线以便继续接收     
}

bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n)
{                        
  //将n个字节的数据写入器件中, Control为控制字符, Addr为地址
  uchar i;
  I2C_Init();  
  I2C_Start();                  // 启动总线
  I2C_SendByte(Control);        // 发控制字符
  if(Ack==0)
  return(0);
  I2C_SendByte(Addr);           // 发送器件地址
  if(Ack==0)
  return(0);
  for(i=0;i<n;i++)
  {   
    I2C_SendByte(*Buffer);    // 发送数据
    if(Ack==0)
    return(0);
    Buffer++;
  } 
  I2C_Stop();                   // 结束总线 
  return(1);
}

bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n)
{
  //从器件中读出n个字节的数据到Buffer中, Control为控制字符, Addr为地址
  uchar i;
  I2C_Init();
  I2C_Start();                  // 启动总线
  I2C_SendByte(Control);        // 发控制字符
  if(Ack==0)
  return(0);
  
  I2C_SendByte(Addr);           // 发送器件地址
  if(Ack==0)
  return(0);

  I2C_Start();         // 重新启动总线
  I2C_SendByte(Control|0x01);
  if(Ack==0)
  return(0);

  for(i=0; i<n-1; i++)
  {   
    *Buffer=I2C_ReceiveByte();// 接收数据
    I2C_Ack(TRUE);            // 发送应答信号  
    Buffer++;
  } 
  *Buffer=I2C_ReceiveByte();
  I2C_Ack(FALSE);               // 发送非应答信号
  I2C_Stop();                   // 结束总线 
  return 1;
}

/** 对AT24C16写数据, Addr为16位地址 0x0000~0x07FF **/
void Write24C16(uint Addr, uchar *Buffer, uchar n)
{
  uchar h, l;
  h = (Addr>>7)&0x0E;
  l = Addr&0x00FF;
  I2C_Write(0xA0|h, l, Buffer, n);
}

/** 读AT24C16数据, Addr为16位地址 0x0000~0x07FF=2K **/
void Read24C16(uint Addr, uchar *Buffer, uchar n)
{
  uchar h, l;
  h = (Addr>>7)&0x0E;
  l = Addr&0x00FF;
  I2C_Read(0xA0|h, l, Buffer, n);
}
#endif

⌨️ 快捷键说明

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