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

📄 i2c.c

📁 环境:keil c51 i2c调度工具
💻 C
字号:
/******************************************************************************************
I2C程序包
作者:Lianyitian
公司:XMMALATA
日期:2004-3-19 14:05
*******************************************************************************************/
#include <i2c.h>
#include <intrins.h>

void i2c_start(void)
{
	SDA = 1;
        _nop_();_nop_();
	SCL = 1;
        _nop_();_nop_();
	SDA = 0;
        _nop_();_nop_();
	SCL = 0;
        _nop_();_nop_();
}

void i2c_stop (void);
void i2c_stop (void)
{
	SCL = 0;
        _nop_();_nop_();
	SDA = 0;
        _nop_();_nop_();
	SCL = 1;
        _nop_();_nop_();
	SDA = 1;
        _nop_();_nop_();
}

void i2c_ack(void);
void i2c_ack(void)
{
	SCL = 0;
        _nop_();_nop_();
	SCL = 1;
        _nop_();_nop_();
	if(SDA==1)//no ack fail to write
	IIC_ERROR=1;
	else
	IIC_ERROR=0;
	SCL = 0;
        _nop_();_nop_();
}

void i2c_write (unsigned char  i2c_data);
void i2c_write (unsigned char  i2c_data)
{
	unsigned char index;

	for(index = 0; index < 8; index++)
	{
                SCL = 0;
                _nop_();_nop_();
		SDA = ((i2c_data & 0x80) ? 1 : 0);
      	        i2c_data  <<= 1;
                _nop_();_nop_();
		SCL = 1;
                _nop_();_nop_();
	}
                SCL = 0;
                _nop_();_nop_();
}


unsigned char i2c_read(void);
unsigned char i2c_read(void)
{
	unsigned char index;

	for(index = 0; index < 8; index++)
        {
         SCL =0;
         delay_ms(1);
         SCL=1;
         delay_ms(1);
   	 i2c_data <<= 1;i2c_data |= SDA;
        }
        SCL=0;
        delay_ms(1);
   return i2c_data;
}


void i2c_device_sub_data(unsigned char i2c_device_address,i2c_sub_address,i2c_data_shift);
void i2c_device_sub_data(unsigned char i2c_device_address,i2c_sub_address,i2c_data_shift)
{
unsigned char temp=2,temp1=0;
for(;temp!=0;temp--)
{
  	     i2c_start();
                _nop_();
                i2c_write(i2c_device_address);
                _nop_();_nop_();_nop_();
                i2c_ack();
		  if(IIC_ERROR)
		  temp1=1;
                _nop_();_nop_();_nop_();
                i2c_write(i2c_sub_address);
                _nop_();_nop_();_nop_();
                i2c_ack();_nop_();_nop_();
		  if(IIC_ERROR)
		  temp1=1;
                i2c_write(i2c_data_shift);
                i2c_ack();
		  if(IIC_ERROR)
		  temp1=1;
                i2c_stop();
                delay_ms(250);
                _nop_();
		if(temp1==1)
			{temp1=0;IIC_ERROR=1;}//fail
		else
		   temp=0x01;//success
}
}


unsigned char i2c_device_sub_data_r(unsigned char i2c_device_address,i2c_sub_address);
unsigned char i2c_device_sub_data_r(unsigned char i2c_device_address,i2c_sub_address)
{
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                delay_ms(250);
                i2c_start();
                _nop_();
                _nop_();
                i2c_write(i2c_device_address-1);
                _nop_();
                i2c_ack();
                i2c_write(i2c_sub_address);
                _nop_();
                i2c_ack();
                i2c_start();
                i2c_write(i2c_device_address);
                i2c_ack();
                delay_ms(50);
                i2c_read();
                i2c_ack();
                i2c_stop();
                delay_ms(250);
                return i2c_data;
}


⌨️ 快捷键说明

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