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

📄 iic_master.c

📁 the iic control demo source for the NEC mcu
💻 C
字号:

#pragma sfr
#pragma di
#pragma ei
#pragma nop
#pragma interrupt INTIIC0  IIC_Interrupt

#include  "serial_config.h"

unsigned char i=255;
unsigned char iic0_m_sta_flag=0;
unsigned char IIC_Master_Receive_StartFlag = 0;

void IIC0_Init()
{
   
   IIC_Operation_Disable();
   
   IICMK0 = 1;
   
   IIC_SCL0_Port_Mode = output;
   IIC_SDA0_Port_Mode = output;
   IIC_SCL0_Port_Level = low;
   IIC_SDA0_Port_Level = low;
   
   IICF0 = 0x03;
   IICC0 = 0x10;
   
   IIC_Clk_Select();
   
   SVA0 = IIC_Local_Address; 
   
   IIC_Interrupt_Enable();
   
}

void IIC_MasterStart()
{
  DI();
  /* control for stop condition */
	if( ( IICF0 & 0x40 ) ){
	    EI();				/* get stop condition */
		return;
	}
	
  IICC0 = 0x1c;
  IICC0 = 0x9c;
  
  STT0 = 1;
  
  EI();
  
  while(i--);
  
  if( !(IICS0 & 0x02)){ return;}
  
  IIC0 = IIC_Slave_Address +  IIC_Master_Mode;
 
}

void IIC0_MasterHandler()
{
/* control for stop condition */
	if( !( IICF0 & 0x40 ) ){				/* get stop condition */
		//CALL_IIC0_MasterError(MD_SPT);
		return; //MD_SPT;
	}

	/* control for sended condition */
/*	if( !iic0_m_sta_flag ){
		if( IICS0 & 0x04 ){				/* check ACK 
			iic0_m_sta_flag = 1;			/* address complete 
			//CALL_IIC0_MasterFindSlave();
		}
		else{
			//CALL_IIC0_MasterError(MD_NACK);
			return; //MD_NACK;
		}
	}
	/* master send control */
	else if( (IICS0 & 0x08) ){
		if( !(IICS0 & 0x04) ){			/* check ACK */
			SPT0 = 1; //SetIORBit(IICC0, 0x01);			/* generate stop condition */
			//CALL_IIC0_MasterError(MD_NACK);
			return; //MD_NACK;
		}

		if( IIC_Master_SendCount == 0 ){			/* sended finish */
			SPT0 = 1; //SetIORBit(IICC0, 0x01);			/* generate stop condition */
			//CALL_IIC0_MasterSendEnd( );
			return;// MD_MASTER_SEND_END;
		}
		IIC0 = *IIC_Master_SendBuf ++ ;			/* send data */
		IIC_Master_SendCount--;
	}
	/* master receive control */
	else {
	     WTIM0 = 0;
	    if(IIC_Master_Receive_StartFlag == 1){
		*IIC_Master_ReceiveBuf ++ = IIC0;			/* receive data */
		IIC_Master_ReceiveCount--;  }
	
		if( IIC_Master_ReceiveCount == 0 ){			/* receive finish */
		    IIC_Master_Receive_StartFlag = 0;
            ACKE0 = 0; //ClrIORBit(IICC0, 0x04);			/* ACK STOP */
            WTIM0 = 1;
			WREL0 = 1;
			SPT0 = 1; //SetIORBit(IICC0, 0x01);			/* generate stop condition */
			//CALL_IIC0_MasterReceiveEnd( );
			return; //MD_MASTER_RCV_END;
		  }	
	
		
		IIC_Master_Receive_StartFlag = 1;
		
		WREL0 = 1; //SetIORBit(IICC0, 0x20);				/* start receive */
	}

}

void main()
{
  DI();
  PCC = 0x00; 
  IIC0_Init();	
  
  IIC_MasterStart();
   
  while(1);
  
}

__interrupt void IIC_Interrupt()
{

	/* control for sended condition */
//	if( !IIC_Master_Start_Flag ){
//		if( IICS0 & IIC_ACK_Detected ){				/* check ACK */
//			IIC_Master_Start_Flag  = 1;			/* address complete */
//		}
//		else{
//			return;
//		}
//	}
	/* master send control */
/*	else*/// if( IICS0 & IIC_Transmit_Status ){
	//	IIC_MasterSend();
//	}
	/* master receive control */
//	else {
//		IIC_MasterReceive();
//	}
	
  if( IICS0 & 0x80 ) {
		IIC0_MasterHandler();
	}
	else {
		return;
	}
		
}

⌨️ 快捷键说明

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