⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 W3100是WIZnet公司专门为以太网互联和嵌入式设备推出的硬件TCP/IP协议栈芯片
💻 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 + -