📄 io-smbus.c
字号:
/****************************************************************
*文件名:I2C.c
*描述:提供I2C的底层驱动,可选的400K或100K速度。
*环境:KEIL C51
*版本:v1.0
*作者:wentsing
*日期:2006/03/07
*****************************************************************/
#include "include.h"
//#define I2C_C 1
uchar SystemError;
/****************************************************************
调用方式:void DelayI2C(void) 函数说明:I2C专用
*****************************************************************/
static void DelayI2C(void)
{
#if I2C_SPEED == I2C_100K
SomeNOP();
#endif
}
/****************************************************************
调用方式:void I2CStart(void) 函数说明:I2C专用
*****************************************************************/
void I2CStart(void)
{
// EA = 0;
SDA = 1; SCL = 1; DelayI2C(); //INI
SDA = 0; DelayI2C(); //START
SCL = 0;
}
/****************************************************************
调用方式:void I2CStop(void) 函数说明:I2C专用
*****************************************************************/
void I2CStop(void)
{
SCL = 0; SDA = 0; DelayI2C(); //INI
SCL = 1; DelayI2C(); SDA = 1; //STOP
// EA = 1;
}
/****************************************************************
调用方式:bit WaitAck(void)
函数说明:I2C专用,等待从器件接收方的应答
*****************************************************************/
bool WaitAck(void)
{
uchar errtime = 255; //因故障接收方无ACK,超时值为255。
SDA = 1;DelayI2C();
SCL = 1;DelayI2C();
while(SDA)
{
errtime--;
if (!errtime)
{
I2CStop();
SystemError=0x11;
return false;
}
}
SCL = 0;
return true;
}
/****************************************************************
调用方式:void SendAck(void)
函数说明:I2C专用,主器件为接收方,从器件为发送方时,应答信号。
*****************************************************************/
void SendAck(void)
{
SDA = 0; DelayI2C();
SCL = 1; DelayI2C();
SCL = 0;
}
/****************************************************************
调用方式:void SendNotAck(void)
函数说明:I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
*****************************************************************/
void SendNotAck(void)
{
SDA = 1; DelayI2C();
SCL = 1; DelayI2C();
SCL = 0;
}
/****************************************************************
调用方式:void I2CSendByte(uchar ch)
函数说明:I2C专用
*****************************************************************/
void I2CSendByte(byte ch)
{
uchar i = 8;
while (i--)
{
SCL = 0; NOP();
SDA = (bool)(ch&0x80);
ch <<= 1; DelayI2C();
SCL = 1; DelayI2C();
}
SCL = 0;
}
/****************************************************************
调用方式:uchar I2CReceiveByte(void)
函数说明:I2C专用
*****************************************************************/
unsigned char I2CReceiveByte(void)
{
uchar i = 8;
uchar ddata = 0;
SDA = 1;
while (i--)
{
ddata <<= 1;
SCL = 0; DelayI2C();
SCL = 1; DelayI2C();
ddata |= SDA;
}
SCL = 0;
return ddata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -