📄 i2c.c
字号:
/*
###############################################################################
Wiznet.
5F Simmtech Bldg., 228-3, Nonhyun-dong, Kangnam-gu,
Seoul, Korea
(c) Copyright 2002, Wiznet, Seoul, Korea
File Name : I2C.C
Version : 1.0
Created : 2002/01/29
Description : I2C Interface definition
It's implemented using 8051MCU Port 1 and defined with SDA(P1.3) and SCL(P1.4)
Function Delay() depends on the performance of MCU.
Modified History
Modified : 2002/04/13
###############################################################################
*/
/*
###############################################################################
Include Part
###############################################################################
*/
#include <reg51.h>
#include "i2c.h"
/*
###############################################################################
Function Implementation Part
###############################################################################
*/
/*
Description : START Bit-Pattern Generate
----|________ SDA
-------|_____ SCL
Argument :
Return Value :
Note :
*/
void GEN_START()
{
P1 |= SDA_H;Delay(1); //SDA HIGH
P1 |= SCL_H;Delay(1); //SCL HIGH
P1 &= SDA_L;Delay(1); //SDA LOW
P1 &= SCL_L;Delay(1); //SCL LOW
}
/*
Description : END Bit-Pattern Generate
______|----- SDA
___|-------- SCL
Argument :
Return Value :
Note :
*/
void GEN_STOP()
{
P1 &= SCL_L;Delay(1); // SCL LOW
P1 &= SDA_L;Delay(1); // SDA LOW
P1 |= SCL_H;Delay(1); // SCL HIGH;
P1 |= SDA_H;Delay(1); // SDA HIGH;
}
/*
Description : Send ACK or NACK Signal
Argument : ack - ACK or NACK (INPUT)
Return Value :
Note : It's sent ACK and NACK by MCU.
*/
void SEND_ACK(char ack)
{
P1 &= SCL_L;Delay(1); // Send ACK(LOW) or NACK(HIGH) and Generate SCL clock.
if(ack == ACK) // If ACK?
P1 &= SDA_L;
else // If NACK?
P1 |= SDA_H;
Delay(2);
P1 |= SCL_H;Delay(1); // SCL Clock
P1 &= SCL_L;Delay(1);
}
/*
Description : Wait ACK or NACK Siganl
Argument :
Return Value : ACK or NACK
Note : It's sent ACK or NACK by Device interfaced using i2C with MCU.That is, MCU wait for ACK or NACK signal.
*/
char WAIT_ACK()
{
char ack; // Wait for ACK or NACK
P1 &= SCL_L;Delay(1);
P1 |= SCL_H;Delay(1);
if(P1 & SDA_H) // If Signal is HIGH,then NACK, else if LOW,then ACK
ack = NACK;
else
ack = ACK;
P1 &= SCL_L;Delay(1);
return ack;
}
/*
Description : Write Byte via I2C
Argument : b - To be writted a byte value
Return Value :
Note :
*/
void WriteByte(char b)
{
char i =0;
for( ; i < 8 ; i++) // Send data by SCL from MSB to LSB by SDA on I2C BUS.
{
P1 &= SCL_L;Delay(1); //SCL LOW
/* Read by shift each 1 Bit from MSB in Data 'b'. */
if( ((b << i) & 0x80) ) // If '1'-> 'High' to SDA
P1 |= SDA_H;
else // If '0'-> 'Low' to SDA
P1 &= SDA_L;
Delay(1);
P1 |= SCL_H;Delay(1); //SCL HIGH
}
P1 &= SCL_L;Delay(1); // SCL LOW
}
/*
Description : Read a Byte via I2C, Read data by SCL from MSB to LSB by SDA on I2C BUS..
Argument :
Return Value : Read Byte Value
Note :
*/
char ReadByte()
{
char ret;
char i = 0;
ret = 0;
P1 &= SCL_L;Delay(1); // SCL LOW
for(; i<8 ; i++)
{
P1 |= SCL_H;Delay(1); // SCL HIGH
ret = (ret << 1);
if(P1 & SDA_H) ret++;
P1 &= SCL_L;Delay(1); // SCL LOW
}
return ret;
}
/*
Description : Delay Function
Argument : i - about i*1ms Delay At 24MHz (INPUT)
Return Value : Read Byte Value
Note : Delay is not from exact measuring but arbitrarily value.This value depends on system.
*/
void Delay(int i)
{
int j;
for(; i != 0 ; i--)
for( j = 0;j < 512;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -