"); //-->
#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;
}
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
开启软件定义汽车全新未来征程,红帽车用操作系统即将全面上市
TMS320C5000 系列 DSP系统设计与应用
1W调频立体声发射机电路
力科示波器助力电源研发(下)
TITAN Haptics打破触觉壁垒:构建开放生态系统
英飞凌推出全新紧凑型CoolSET™封装系统(SiP)
简易远距离无线传声器电路
keil使用1
电源产品的可靠性设计(上)
哪位大虾有PCIExpress的cadence的olb文件 跪求!!!
lint使用简介
力科示波器助力电源研发(上)
Cincoze MXM GPU电脑荣获红点设计奖与Vision Systems Design创新奖殊荣
我想找一个培训班
1000米单管振荡(C8050)调频发射电路
小功率调频广播发射机电路(1000M)
4管FM发射器
大家谁知道:FPGA系统设计 高级培训班的具体内容?
我想打听培训的具体内容
电源产品的可靠性设计(下)
英伟达GB300回归Bianca设计
keil使用2
电源产品的可靠性设计(中)
xMEMS发布Sycamore-W——超轻薄、专为智能手表及运动手环设计的扬声器
LED基本理论知识
BOE(京东方)携手飞利浦EVNIA推出全球首款原生硬件圆偏光显示器
三星考虑进行大规模内部重组
LCD原理简介
印度要求海康、小米、摩托等监控设备必须提交源代码
恩智浦发布新一代NTAG X DNA NFC互联标签,实现安全身份验证