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

📄 i2c.c

📁 关于台湾新茂SM5964 I2C的程序
💻 C
字号:
#include "reg52.h"
#include "Config.h"
#include "IOPort.h"
#include "tools.h"
#include "i2c.h"

#define I2C_Retries			5

#define I2C_SDA_LOW		P_I2C_SDA=0
#define I2C_SDA_HIGH		P_I2C_SDA=1
#define I2C_SCL_LOW		P_I2C_SCL=0
#define I2C_SCL_HIGH		P_I2C_SCL=1
#define I2C_SDA_IN		P_I2C_SDA

#define I2C_DELAY		I2cDelay()

unsigned char idata  I2C_buffer[I2C_MAXNUM];

void I2cDelay()
{
	delay_us(5);
}

void I2C_STOP (void)
{
	I2C_SDA_LOW;
	I2C_DELAY;
	I2C_SCL_HIGH;
	I2C_DELAY;
	I2C_SDA_HIGH;
	I2C_DELAY;
}

I2C_RETURN I2C_START (void)
{
	unsigned char i;

	I2C_SCL_HIGH;
	I2C_SDA_HIGH;
	I2C_DELAY;

	if (I2C_SDA_IN)
	{
		I2C_SDA_LOW;
		I2C_DELAY;
		I2C_SCL_LOW;
		I2C_DELAY;
		return I2C_SUCCESS;
	}
	else {
		/*DATA is locked, so unlock it*/
		I2C_SCL_LOW;
		I2C_DELAY;

		for (i=0; i<9; i++)
		{
			I2C_SCL_HIGH;
			I2C_DELAY;
			I2C_SCL_LOW;
		}
		I2C_STOP ();

		return I2C_ERROR;
	}

}


/*entry: assumed that clk is low*/
I2C_RETURN I2C_write_byte (unsigned char b)
{
	unsigned char i;
		I2C_DELAY;
		I2C_SDA_HIGH;
	for (i=0; i<8; i++)
	{
		if (b&0x80) {
			I2C_SDA_HIGH;
		}
		else {
			I2C_SDA_LOW;
		}
		I2C_DELAY;
		I2C_SCL_HIGH;
		I2C_DELAY;
		I2C_SCL_LOW;
		I2C_DELAY;

		b <<= 1;
	}

	I2C_SDA_HIGH;
	I2C_DELAY;
	I2C_SCL_HIGH;
	I2C_DELAY;

	if (I2C_SDA_IN) {
		I2C_SCL_LOW;
		I2C_DELAY;
		I2C_STOP ();
		return I2C_ERROR;
	}
	else {
		I2C_SCL_LOW;
		I2C_DELAY;
		return I2C_SUCCESS;
	}
}

/*entry: assumed that clk is low*/
unsigned char I2C_read_byte (void)
{
	unsigned char i;
	unsigned char b=0;

	I2C_SDA_HIGH;
	I2C_SCL_LOW;

	for (i=0; i<8; i++) {

		b <<= 1;
		I2C_DELAY;
		I2C_SCL_HIGH;

		if (I2C_SDA_IN)
			b |=0x01;

		I2C_DELAY;
		I2C_SCL_LOW;
	}

	I2C_DELAY;
	I2C_SDA_LOW;
	I2C_DELAY;
	I2C_SCL_HIGH;
	I2C_DELAY;
	I2C_SCL_LOW;
	I2C_DELAY;
	I2C_SDA_HIGH;

	return b;
}

unsigned char I2C_read_last_byte (void)
{
	unsigned char i;
	unsigned char b=0;

	I2C_SDA_HIGH;
	I2C_SCL_LOW;

	for (i=0; i<8; i++) {

		b <<= 1;
		I2C_DELAY;
		I2C_SCL_HIGH;

		if (I2C_SDA_IN)
			b |= 0x01;

		I2C_DELAY;
		I2C_SCL_LOW;
	}

	I2C_DELAY;
	I2C_SDA_HIGH;
	I2C_DELAY;
	I2C_SCL_HIGH;
	I2C_DELAY;
	I2C_SCL_LOW;
	I2C_DELAY;

	return b;
}

void I2C_write (unsigned char device_addr,unsigned char  *buf,unsigned char num)
{
	unsigned char i,num_error = 0;
	I2C_RETURN r;

	do {
		r = I2C_START();
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (device_addr);
		}
		for (i=0; i<num; i++)
		{
			if (r == I2C_SUCCESS)
			{
				r = I2C_write_byte (*buf++);
			}
		}
		if (r == I2C_SUCCESS)
		{
			I2C_STOP();
		}
	} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries));
	delay_ms(5);

}

void I2C_write_sub (unsigned char device_addr,unsigned char sub_addr,unsigned char *buf,unsigned char num)
{
	unsigned char i,num_error = 0;
	I2C_RETURN r;
	do {
		r = I2C_START();
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (device_addr);
		}
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (sub_addr);
		}
		for (i=0; i<num; i++)
		{
			if (r == I2C_SUCCESS)
			{
				r = I2C_write_byte (*buf++);
			}

		}
		if (r == I2C_SUCCESS) {
			I2C_STOP();
		}
	} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries));
		delay_ms(5);
}

void I2C_read_sub (unsigned char device_addr,unsigned char sub_addr,unsigned char  *buf,unsigned char num)
{
	unsigned char i,num_error = 0;
	I2C_RETURN r;
	do {
		r = I2C_START();
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (device_addr);
		}
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (sub_addr);
		}
		if (r == I2C_SUCCESS)
		{
			I2C_STOP();
		}
		if (r == I2C_SUCCESS)
		{
			r = I2C_START();
		}
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (device_addr | 0x01);
		}
		if (num > 1)
		{
			for (i=0; i<num-1; i++)
			{
				*buf++ = I2C_read_byte ();
			}
		}
		*buf = I2C_read_last_byte ();
		if (r == I2C_SUCCESS) {
			I2C_STOP();
		}
	} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries));
}

void I2C_read(unsigned char device_addr,unsigned char  *buf,unsigned char num)
{
	unsigned char i,num_error = 0;
	I2C_RETURN r;
	do {
		r = I2C_START();
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (device_addr);
		}
		if (r == I2C_SUCCESS)
		{
			I2C_STOP();
		}
		if (r == I2C_SUCCESS)
		{
			r = I2C_START();
		}
		if (r == I2C_SUCCESS)
		{
			r = I2C_write_byte (device_addr | 0x01);
		}
		if (num > 1)
		{
			for (i=0; i<num-1; i++)
			{
				*buf++ = I2C_read_byte ();
			}
		}
		*buf = I2C_read_last_byte ();
		if (r == I2C_SUCCESS) {
			I2C_STOP();
		}
	} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries) );
		//delay_ms(5);
}






⌨️ 快捷键说明

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