📄 i2c.h
字号:
/*********************************************************************
微 雪 电 子 WaveShare http://www.waveShare.net
目 的: 建立I2C操作库
目标系统: 基于任何兼容C51的微处理器
应用软件: Keil C
版 本: Version 1.0
圆版时间: 2004-08-25
开发人员: SEE
说 明: 若用于商业用途,请保留此段文字或注明代码来源
深 圳 微 雪 电 子 保 留 所 有 的 版 权
*********************************************************************/
/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
版本更新记录:
----------------------------------------------------------------------
入口参数说明:
sbit I2C_SDA = P1^7;
sbit I2C_SCL = P1^6;
----------------------------------------------------------------------
待定参数说明:
#define DELAY() {NOP();NOP();NOP();}
----------------------------------------------------------------------
对外变量说明:
----------------------------------------------------------------------
对外函数说明:
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/
#ifndef I2C_H
#define I2C_H
#include "D:\C51_H\CmmC51.H"
#define DELAY() {NOP();NOP();NOP();NOP();}
#define TRUE 1
#define FALSE 0
bool I2CErr = FALSE;
/*--------------------------------------------------------------------
函数名称:I2C Stop
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_Stop(void)
{
I2C_SCL=0;
I2C_SDA=0;
DELAY();
I2C_SCL=1;
DELAY();
I2C_SDA=1;
//EA=1;
}
/*--------------------------------------------------------------------
函数名称:I2C Wait Ack
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
bool I2C_WaitAck(void)
{
uint8 times=255; //避免故障,设定错误次数
I2C_SDA=1;
I2C_SCL=1;
while(I2C_SDA)
{
times--;
if(!times) //超时值为255
{
I2C_Stop();
I2CErr=TRUE;
return FALSE;
}
}
I2C_SCL=0;
I2CErr=FALSE;
return TRUE;
}
/*--------------------------------------------------------------------
函数名称:I2C Start
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_Start(void)
{
//EA=0;
I2C_SDA=1;
I2C_SCL=1;
DELAY();
I2C_SDA=0;
DELAY();
I2C_SCL=0;
}
/*--------------------------------------------------------------------
函数名称:I2C Send Ack
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_SendAck(void)
{
I2C_SDA=0;
DELAY();
I2C_SCL=1;
DELAY();
I2C_SCL=0;
}
/*--------------------------------------------------------------------
函数名称:I2C Send No Ack
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_SendNoAck(void)
{
I2C_SDA=1;
DELAY();
I2C_SCL=1;
DELAY();
I2C_SCL=0;
}
/*--------------------------------------------------------------------
函数名称:I2C发送数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_SendByte(uint8 dat)
{
uint8 i;
for(i=0;i<=7;i++)
{
if((dat&0x80)==0x80)
I2C_SDA=1;
else
I2C_SDA=0;
dat<<=1;
I2C_SCL=1;
DELAY();
I2C_SCL=0;
}
I2C_WaitAck();
}
/*--------------------------------------------------------------------
函数名称:I2C接收数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_RcvDat(uint8 *pRdDat)
{
uint8 i;
I2C_SDA=1;
for(i=0;i<=7;i++)
{
I2C_SCL=1;
DELAY();
*pRdDat<<=1;
*pRdDat|=I2C_SDA;
I2C_SCL=0;
DELAY();
}
}
/*--------------------------------------------------------------------
函数名称:I2C接收数据且不产生应答
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_RcvAckDat(uint8 *pRdDat)
{
I2C_RcvDat(pRdDat);
I2C_SendAck();
}
/*--------------------------------------------------------------------
函数名称:I2C接收数据且产生应答
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_RcvNAckDat(uint8 *pRdDat)
{
I2C_RcvDat(pRdDat);
I2C_SendNoAck();
}
/*--------------------------------------------------------------------
函数名称:I2C写器件,写一个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)
{
I2C_Start();
I2C_SendByte(wrDAdr);
I2C_SendByte(wordAdr);
I2C_SendByte(dat);
I2C_Stop();
}
/*--------------------------------------------------------------------
函数名称:I2C写器件,写N个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
//void I2C_Write_(uint16 wrDAdr,uint8 wordAdr,
// uint8 *pWrDat,uint8 num)
//{
//
//}
/*--------------------------------------------------------------------
函数名称:I2C读器件,读一个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_Read(uint16 wrDAdr,uint8 wordAdr,
uint8 rdDAdr,uint8 *pRdDat)
{
uint8 i;
I2C_Start();
I2C_SendByte(wrDAdr);
I2C_SendByte(wordAdr);
I2C_Start();
I2C_SendByte(rdDAdr);
I2C_RcvNAckDat(pRdDat+i);
I2C_Stop();
}
/*--------------------------------------------------------------------
函数名称:I2C读器件,读N个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输 入:
返 回:
--------------------------------------------------------------------*/
void I2C_Read_(uint16 wrDAdr,uint8 wordAdr,
uint8 rdDAdr,uint8 *pRdDat,uint8 num)
{
uint8 i;
I2C_Start();
I2C_SendByte(wrDAdr);
I2C_SendByte(wordAdr);
I2C_Start();
I2C_SendByte(rdDAdr);
for(i=0;i<num-1;i++)
I2C_RcvAckDat(pRdDat+i);
I2C_RcvNAckDat(pRdDat+i);
I2C_Stop();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -