📄 i2c.c
字号:
/*============================================================================
Copyright (c) 2004 Sunplus Technology Co., Ltd.
Module Name: I2C.C
Abstract: Module related to RTC.C routine
Environment: Keil C51 Compiler
Revision History: 10/15/2003 XYQ created
=============================================================================*/
#include "general.h"
#include "intrins.h"
#include "I2C.h"
#ifdef USE_I2C_SerialPort
/*-----------------------------------------------------
〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C
包括100Khz(T=10us)的标准模式(慢速模式)选择,
和400Khz(T=2.5us)的快速模式选择,
-------------------------------------------------------*/
#define SomeNOP(); _nop_();_nop_();_nop_();
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
I2C_SDA=1;
I2C_SCL=1;
SomeNOP();//INI
I2C_SDA=0;
SomeNOP();//START
I2C_SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
I2C_SCL=0;
I2C_SDA=0;
SomeNOP();//INI
I2C_SCL=1;
SomeNOP();
I2C_SDA=1; //STOP
EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bit WaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
I2C_SDA=1;
XBYTE[0x2102]=XBYTE[0x2102]&0x7f;//set I2C_SDA input
SomeNOP();
while(I2C_SDA)
{
errtime--;
if (!errtime)
{
I2CStop();
//printf("I2C fail!\n");
return false;
}
}
XBYTE[0x2102]=XBYTE[0x2102]|0x80;//set I2C_SDA output
I2C_SCL=1;
SomeNOP();
I2C_SCL=0;
return true;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
bit I2CSendByte(unsigned char ch)
{
unsigned char i=8;
while (i--)
{
I2C_SDA=(bit)(ch&0x80);
ch<<=1;
SomeNOP();
I2C_SCL=1;
SomeNOP();
I2C_SCL=0;
}
return(WaitAck());
}
/**--------------------------------------------------------------------------------
调用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte(bit SendAck)
{
unsigned char i=8;
unsigned char ddata=0;
I2C_SDA=1;
XBYTE[0x2102]=XBYTE[0x2102]&0x7f;//set I2C_SDA input
while (i--)
{
I2C_SCL=1;
ddata<<=1;
SomeNOP();
SomeNOP();
ddata|=I2C_SDA;
I2C_SCL=0;
}
XBYTE[0x2102]=XBYTE[0x2102]|0x80;//set I2C_SDA output
//send ACK or NotACK
I2C_SDA=SendAck;
SomeNOP();
I2C_SCL=1;
SomeNOP();
I2C_SCL=0;
return ddata;
}
#endif//#ifdef USE_I2C_SerialPort
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -