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

📄 driver_softiic.c

📁 软件IIC,单片机用软件IIC驱动程序是打发多少
💻 C
字号:
/****************************************************************************
* 文 件 名  :Driver_SoftIIc.c
* 版    本     : V1.0
* 连    接     :
* 功    能     :软件IIC驱动
*   作者       :(Kris)
*   日	期      :2008/8/18
*---------------历史版本信息------------------------------------------
*  修 改 人: Kris
*  版    本    : 
*  日   期:2008/8/18
*  描   述:
****************************************************************************/
/****************************************************************************
*						包含文件
****************************************************************************/
#include "../../Config.h" 
/****************************************************************************
* 						使用宏
****************************************************************************/

/****************************************************************************
* 						使用数据
****************************************************************************/
UCHAR  bbyte;																	// 操作贮存
/****************************************************************************
*						使用函数
****************************************************************************/
void fm_delay(DWORD delay)
{
	delay *=10;
	for(  ; delay>0; delay-- ){ 
		NOP;
	} 
}

void iic_Init(void)
{
	SET_PIO_OUTPUT( (0x1UL<<14) );
	SET_PIO_OUTPUT( (0x1UL<<13) );
	iic_stop();	// prevent pending condition
	fm_delay(20);
}
void iic_start(void)
{
//ysz	SET_SDA(1);SCL_1();SDA=0;SCL_0();
	SWITCH_SDA(0);
	SET_SDA(1); SCL_1();SET_SDA(0);SCL_0();
}
//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
void iic_stop(void)
{
//ysz	SDA=0;SCL_1();SET_SDA(1); 
	SWITCH_SDA(0);
	SET_SDA(0);SCL_1();SET_SDA(1);
}
//=====================================
//FUNCTION:ROUTES TO PROVIDE ACK SINGAL
void iic_ack(void)
{
//ysz	SDA=0;SCL_1();SCL_0();
	SWITCH_SDA(0);
	SET_SDA(0);SCL_1();SCL_0();
}
//=====================================
void iic_noack(void)
{
//ysz	SET_SDA(1);SCL_1();SCL_0();
	SWITCH_SDA(0);
	SET_SDA(1);SCL_1();SCL_0();
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
UCHAR iic_inchar(void) 
{
//	SET_SDA(1);
	SWITCH_SDA(1);
	bbyte =0;
	SCL_1();if(GET_SDA()) bbyte|=0x80;SCL_0();
	SCL_1();if(GET_SDA()) bbyte|=0x40;SCL_0();
	SCL_1();if(GET_SDA()) bbyte|=0x20;SCL_0();
	SCL_1();if(GET_SDA()) bbyte|=0x10;SCL_0();
	SCL_1();if(GET_SDA()) bbyte|=8;SCL_0();
	SCL_1();if(GET_SDA()) bbyte|=4;SCL_0();
	SCL_1();if(GET_SDA()) bbyte|=2;SCL_0();
	SCL_1();if(GET_SDA()) bbyte|=1;SCL_0();
	return(bbyte);
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
BOOL iic_outchar(UCHAR dat) 
{
	BOOL b_ack;
	SWITCH_SDA(0);
	bbyte=dat;
	
	SET_SDA(bbyte&0x80);SCL_1();SCL_0();
	SET_SDA(bbyte&0x40);SCL_1();SCL_0();
	SET_SDA(bbyte&0x20);SCL_1();SCL_0();
	SET_SDA(bbyte&0x10);SCL_1();SCL_0();
	SET_SDA(bbyte&0x8);SCL_1();SCL_0();
	SET_SDA(bbyte&0x4);SCL_1();SCL_0();
	SET_SDA(bbyte&0x2);SCL_1();SCL_0();
	SET_SDA(bbyte&0x1);SCL_1();SCL_0();
	
	//read ack
//   	SET_SDA(1); 
	SWITCH_SDA(1);
   	SCL_1(); 
	fm_delay(50);
   	NOP;NOP;NOP;NOP;NOP;NOP;
   	b_ack=GET_SDA();
   	SCL_0(); 
   
   	return b_ack;
}
//======================================================
//FUNCTION:BYTE WRITE. 'add' THE WRITE ADDRESS, 'wbyte' THE DATA WANT TO WRITE
void write_char(UINT add,UCHAR dat)
{
	iic_start();
	iic_outchar(IIC_WRITE);
	iic_outchar(add>>8);
	iic_outchar(add);
	iic_outchar(dat);
	iic_stop();
}
//=====================================================
void write_int(WORD add,WORD dat)
{
	union{
		WORD i;
		BYTE j[2];
		}temp;
	
	temp.i=dat;
	iic_start();
	iic_outchar(IIC_WRITE);
	iic_outchar(add>>8);
	iic_outchar(add);
	iic_outchar(temp.j[0]);
   	iic_outchar(temp.j[1]);
	iic_stop();
}

⌨️ 快捷键说明

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