当前位置:开发频道首页 >> MCU单片机 >> 51系列 >>

I2C串行总线标准驱动程序(C51)

2007-04-02 19:19:22  作者:yangjc  来源:互连网  浏览次数:264  文字大小:【+】【-
简介:I2C串行总线标准驱动程序(C51)-万能程序

七彩谷商城
/*------------------------------------------------------------------------------------------
[文件名] I2C.c
[版本] 1.1b
[作者] 鞠春阳
[最后修改时间] 2003年5月12日
[版权所有] www.mcuzb.com
[资料] 请到www.mcuzb.com下载
===========================================================================================*/
#include "reg51.h"
#include "intrins.h"
unsigned char SystemError;
sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的需要来定义
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStart(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
  EA=0;
  SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
  SDA=0; SomeNOP();
  SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStop(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
  SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
  SCL=1; SomeNOP(); SDA=1;
  EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:I2CAck(void) 2003/05/13
函数说明:私有函数,I2C专用,等待从器件接收方的应答
ACK BY AD7416
---------------------------------------------------------------------------------*/
WaitAck(void)
{
  unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
  SDA=1;
  SCL=1;
  SystemError=0x10;
  while(SDA)
  {
    errtime--;
    if(!errtime)
    {
      AD7416_I2CStop();
      AD7416_SystemError=0x11; //出错后给全局变量赋值
      return;
    }
  }
  SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
  SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
  SCL=1; SomeNOP();
  SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
  SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
  SCL=1; SomeNOP();
  SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
  unsigned char i=8;
  while (i--)
  {
    SCL=0;_nop_();
    SDA=(bit)(ch&0x80); 
    ch<<=1; 
    SomeNOP(); //时钟保持低可以发送数据
    SCL=1; 
    SomeNOP();
  }
  SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
  unsigned char i=8,data=0;
  SDA=1;
  while (i--)
  {
    data<<=1;
    SCL=0;
    SomeNOP();
    SCL=1;
    SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据
    data|=SDA;
  }
  SCL=0;
  return data;
}
七彩谷商城
B20
 
B8

最新文章

更多

· 一种基于C51的多任务机制...
· 8051单片机中DPTR的扩展设计
· 在C51系统上实现YAFFS文...
· PCF8563I2C实时时钟/日历...
· 单片机驱动标准PC机键盘...
· I2C串行总线标准驱动程序...

推荐文章

更多

· 一种基于C51的多任务机制...
· 8051单片机中DPTR的扩展设计
· 在C51系统上实现YAFFS文...
· PCF8563I2C实时时钟/日历...
· 单片机驱动标准PC机键盘...
· I2C串行总线标准驱动程序...

热点文章

更多

相关文章

更多

· 嵌入式Linux系统下I2C设备驱动程序的开发
· Linux下USB MASS STORAGE驱动的分析和改造
· Windows WDM驱动程序编程 中文版
· tasklet笔记
· 关于驱动程序中的Ioctl
B11