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

📄 i2c.c

📁 解码2272模拟程序,调试通过,需要者也可和我联系
💻 C
字号:
#include "my_89x51.h"

extern void d1ms(unsigned int);
#define READMODE 0xa1
#define WRITEMODE 0xa0


/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫200 /07/0 4
函数说明:I2C启始位
---------------------------------------------------------------------------------*/
void I2CStart()
{
	EA = 0;
	SCL = 0;
	SDA = 1;
	SCL = 1;
	_nop_();
	SDA = 0;
	_nop_();
	SCL = 0;
}

/**--------------------------------------------------------------------------------
 调用方式:void I2CStop(void) ﹫200 /07/0 4
 函数说明:I2C结束位
---------------------------------------------------------------------------------*/
void I2CStop()
{
	SDA = 0;
	SCL = 1;
	_nop_();
	SDA = 1;
	EA = 1;
}

/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫200 /07/0 4
函数说明:I2C用,等待从器件接收方的应答
返回1--正确
返回0--错误
---------------------------------------------------------------------------------*/
unsigned char WaitAck()
{
	unsigned char data errtime = 255;//因故障接收方无ACK 超时值为255
	while (SDA){
		errtime--;
		if (!errtime){
			SCL = 0;
			I2CStop();
			return (0);
		}
	}
	SCL = 0;
	return (1);
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫200 /07/0 4
函数说明:I2C用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck()
{
	SDA = 0;
	SCL = 1;
	SCL = 0;
        SDA = 1;
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫200 /07/0 4
函数说明:I2C用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck()
{
	SDA = 1;
	SCL = 1;
	SCL = 0;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CSend(unsigned char ch) ﹫200 /07/0 5
函数说明:I2C用,发送BYTE
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char ch)
{
	unsigned char data i;
	for (i = 0; i < 8; i++){
		ch <<= 1;
		SDA = CY;
		SCL=1;
		somenop;
		SCL = 0;
		somenop;
	}
	SDA = 1;
	SCL = 1;
}

/**--------------------------------------------------------------------------------
调用方式:unsigned char I2CReceive(void) ﹫200 /07/0 5
函数说明:I2C用,接收BYTE
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte()
{
	unsigned char data i = 8;
	unsigned char data ddata = 0;
	SDA = 1;
	while (i--){
		SCL = 1;
		ddata <<= 1;
		if (SDA)
			ddata++;
		SCL = 0;
	}
	return (ddata);
}

/******************
函数说明:读取E2ROM
******************/

void i2c_read(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
{
	I2CStart();
	I2CSendByte(WRITEMODE);
	_nop_();
	WaitAck();
	_nop_();
	I2CSendByte(nadd);
	WaitAck();
	_nop_();
	I2CStart();
	I2CSendByte(READMODE);
	WaitAck();
	_nop_();
	while(nlen > 0){
		*pdt = I2CReceiveByte();
                somenop;
		if (nlen != 1)
			SendAck();
		nlen--;
		pdt++;
	}
	SendNotAck();
	I2CStop();
}

/******************
函数说明:写E2ROM
******************/
void i2c_write(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
{
 	I2CStart();
	I2CSendByte(WRITEMODE);
	WaitAck();
	I2CSendByte(nadd);
	WaitAck();
	while(nlen > 0){
		I2CSendByte(*pdt);
		WaitAck();
		pdt++;
		nlen--;
		d1ms(50);
	}
	I2CStop();
	d1ms(200);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -