📄 i2c.c
字号:
/*
*********************************************************************************************************
*
* 低成本汇率电子显示屏控制系统的开发
* 独立本科段毕业设计
*
* Since 2004 - 2005
* All Rights Reserved.
*
*
*------------------------------------------文件信息------------------------------------------------------
*
* 文件名 : I2C.C
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 描 述 : 软件模拟I2C总线的驱动程序,包括100KHz(T=10us)的慢速模式和400KHz(T=2.5us)的快速模式。
*
*------------------------------------------日志记录------------------------------------------------------
*
* 版 本 : V1.02
* 作 者 : li.yao
* 日 期 : 2005年 02月 28日,星期一
* 变 更 : 修改了几处BUGS,补全了注释。
*
*--------------------------------------------------------------------------------------------------------
*
* 版 本 : V1.00 格式说明: 主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 文件建立。
*
*********************************************************************************************************
*/
#include "..\INC\HEADER.H"
/*
*********************************************************************************************************
* 配置参数 *
*********************************************************************************************************
*/
sbit SDA = P1^1; // I2C总线的数据线
sbit SCL = P1^0; // I2C总线的时钟线
#define I2cDelay( ) { _nop_(); _nop_(); }
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : void I2cStart(void);
* 参数表 : none
* 返回值 : none
* 功 能 : 启动I2C总线,私有函数。
*
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.02
* 作 者 : li.yao
* 日 期 : 2005年 02月 28日,星期一
* 变 更 : 增加了中断关闭操作。
*
*--------------------------------------------------------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
void I2cStart(void)
{
EA = 0;
I2cDelay();
SCL = 1;
SDA = 1;
I2cDelay();
SDA = 0;
I2cDelay();
SCL = 0;
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : void I2cStop(void);
* 参数表 : none
* 返回值 : none
* 功 能 : 关闭I2C总线,私有函数。
*
* 作 者 : Li.yao
* 日 期 : 2004年 05月 13日,星期四
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.02
* 作 者 : li.yao
* 日 期 : 2005年 02月 28日,星期一
* 变 更 : 增加了中断打开操作。
*
*--------------------------------------------------------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
void I2cStop(void)
{
SDA = 0;
SCL = 0;
I2cDelay();
SCL = 1;
I2cDelay();
SDA = 1;
I2cDelay();
EA = 1;
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : void I2cAckS(void);
* 参数表 : none
* 返回值 : none
* 功 能 : 主器件为接收方,从器件为发送方时,应答信号,私有函数。
*
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
void I2cAckS(void)
{
SDA = 0;
I2cDelay();
SCL = 1;
I2cDelay();
SCL = 0;
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : void I2cNotAckS(void);
* 参数表 : none
* 返回值 : none
* 功 能 : 主器件为接收方,从器件为发送方时,非应答信号,私有函数。
*
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
void I2cNotAckS(void)
{
SDA = 1;
I2cDelay();
SCL = 1;
I2cDelay();
SCL = 0;
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : INT8U I2cAckR(void);
* 参数表 : none
* 返回值 : 是否等待超时。
* 功 能 : 等待从器件接收方的应答,私有函数。
*
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
INT8U I2cAckR(void)
{
INT8U time = 0xFF;
SDA = 1;
I2cDelay();
SCL = 1;
I2cDelay();
while (SDA == 1)
{
time--;
if (!time)
{
I2cStop();
return FALSE;
}
}
SCL = 0;
return TRUE;
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : INT8U I2cRead(void);
* 参数表 : none
* 返回值 : 接收到的字节。
* 功 能 : 接收一个字节的数据,私有函数。
*
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
INT8U I2cRead(void)
{
INT8U i = 8;
INT8U ch = 0;
SDA = 1;
while (i--)
{
ch <<= 1;
SCL = 0;
I2cDelay();
SCL = 1;
I2cDelay();
ch |= SDA;
}
SCL = 0;
return ch;
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : void I2cWrite(INT8U ch);
* 参数表 : ch: 要发送的字节。
* 返回值 : none
* 功 能 : 发送一个字节的数据,私有函数。
*
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 05月 13日,星期四
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
void I2cWrite(INT8U ch)
{
INT8U i = 8;
while (i--)
{
SCL = 0;
I2cDelay();
SDA = (UBIT)(ch & 0x80);
ch <<= 1;
I2cDelay();
SCL = 1;
I2cDelay();
}
SCL = 0;
}
/*
*********************************************************************************************************
* 文件结束 *
*********************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -