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

📄 threepigm.c

📁 H8群瑞萨单片机之间的IIC通信,通信程序代码
💻 C
字号:
/*/////////////////////////////////
//		函数名:IIC通信函数		 //
//		函数功能:初始化IIC 	 //
//		函数参数:空			 //
/////////////////////////////////*/
void iic_init()							
{
	IIC2.ICCR1.BIT.ICE=1;								//IIC总线模式
	IIC2.ICCR1.BIT.CKS=0x2;								//通信协议,每个芯片要一直
	IIC2.ICMR.BIT.MLS=0;								//必须这样设置
	IIC2.ICMR.BIT.WAIT=1;								//主模式下该寄存器才有效
	IIC2.ICMR.BIT.BCWP=0;	
	IIC2.ICMR.BIT.BC=0x0;								//由0xf改成
	IIC2.ICIER.BIT.ACKBT=0;
	IIC2.SAR.BYTE=0xC8;					
}

/*/////////////////////////////////
//	函数名:IIC通信函数          //
//	函数功能:等待数据状态初始化 //
//	函数参数:空				 //
/////////////////////////////////*/
void iic_c_get_init()
{
	IIC2.ICCR1.BIT.MST=0;
	IIC2.ICCR1.BIT.TRS=0;
}

/*/////////////////////////////////
//	函数名:IIC通信函数			 //
//	函数功能:发送数据			 //
//	函数参数:address(对方地址)//
//			  dat[](数据地址)	 //
/////////////////////////////////*/
unsigned char iic_z_send(unsigned char address,unsigned char dat[])
{
	unsigned char n=0,m=0,t=1;
	if(IIC2.ICCR2.BIT.BBSY==0)
	{
		IIC2.ICCR1.BIT.MST=1;
		IIC2.ICCR1.BIT.TRS=1;
		IIC2.ICCR2.BYTE=0xBD;						//必须使用MOV指令
		IIC2.ICDRT=address;
		while(IIC2.ICSR.BIT.TEND==0)
			;
		for(m=0;m<50;m++)
			;
		if(IIC2.ICIER.BIT.ACKBR==0)
		{
			for(n=0;n<3;n++)
			{
					IIC2.ICDRT=dat[n];
					while(IIC2.ICSR.BIT.TDRE==0);
			}
			while(IIC2.ICSR.BIT.TEND==0);
			t=0;
			
		}
		IIC2.ICSR.BIT.TEND=0;
		IIC2.ICSR.BIT.STOP=0;
		IIC2.ICCR2.BYTE=0x3D;						//必须使用MOV指令
		iic_init();					
		iic_c_get_init();
	}
	return t;
}

/*/////////////////////////////////
//	函数名:IIC通信函数			 //
//	函数功能:接收数据			 //
//	函数参数:dat[](存数据地址)//
/////////////////////////////////*/
void iic_c_get(unsigned char dat[])
{
	unsigned char t,n;
	if(IIC2.ICSR.BIT.AAS==1)
	{
		IIC2.ICSR.BIT.AAS=0;
		IIC2.ICIER.BIT.ACKBT=0;						//接收应答
		t=IIC2.ICDRR;
		for(n=0;n<3;n++)
		{
			while(IIC2.ICSR.BIT.RDRF==0);
			dat[n]=IIC2.ICDRR;
		}
	}
}

/*////////////////////////////////////////////
// 函数名:IIC安全发送函数					//
// 函数功能:实现发送数据,同时返回变量     //
// 函数参数:3个数据值,一个等待回复标志变量//
////////////////////////////////////////////*/
unsigned char iic_s_r(unsigned char dat,unsigned char dat0,unsigned char dat1,unsigned char dat2)
{
	_sendDat[0]=dat0;
	_sendDat[1]=dat1;
	_sendDat[2]=dat2;
	return iic_z_send(_addrDat[dat],_sendDat);
}

/*////////////////////////////////
//	函数名:IIC中断程序			//
//	函数功能:空				//
//	函数参数:空				//
////////////////////////////////*/
__interrupt(vect=24) void INT_IIC2(void) 
{
	IIC2.ICIER.BIT.RIE=0;			//关闭中断
	//保存电机控制变量防止撞死
	if(INIT_finsh==1)
	{
		SMLEFT=0;
		SMRIGHT=0;
		TZ1.GRC=0;				    	
		TZ1.GRD=0;
	}
	
	iic_c_get(_getDat);				//获取数据函数
	IIC2.SAR.BYTE=0xD8;				//更改地址
	
	//
	//  此处可进行数据操作
	//

	IIC2.ICIER.BIT.RIE=1;			//开中断
	IIC2.SAR.BYTE=0xC8;				//恢复地址
}

void main()
{
	AD.ADCSR.BYTE=0x07;		
	AD.ADCR.BYTE=0x00;
	
	//IIC通信
	iic_init();
	iic_c_get_init();
	IIC2.ICIER.BIT.RIE=1;
	
	//发数据举例方法
	while(iic_s_r(0x84/*此位为地址*/,0x88,0x11,0x11));
	
}

⌨️ 快捷键说明

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