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

📄 s35390a.c

📁 i2c协议实现
💻 C
字号:
#include "reg51x.h"
#include "TAB.h"
#include <stdio.h>
#include <i2c.h>
#include <intrins.h>
#include <s35390a.h>
/*hxc last change time 2006.4.10 x:x*/
/*hxc last check time 2006.4.14 16:46*/
	uchar bdata Swrx;
	sbit s0 = Swrx^0;
	sbit s1 = Swrx^1;
	sbit s2 = Swrx^2;
	sbit s3 = Swrx^3;
	sbit s4 = Swrx^4;
	sbit s5 = Swrx^5;
	sbit s6 = Swrx^6;
	sbit s7 = Swrx^7;

extern uchar idata DATA_sheet[7][3];//DATA_sheet[0][0]hour,[0][1] minute,[0][2] second ;[1][0] year, [1][1]month,[1][2]day
								        //[2][0]                       [2][2] week ;[3][0]hour,[3][0]minute[3][2]day
extern uchar idata trxdata[7];//send receive s35390a data table								
/****************************S35390A_read_xbyte************************************
***************************read ok ret1 ,read 4 error ret 0 ******************************/								    
bit S35390A_read_xbyte(uchar rxaddr,uchar count ){
	uchar is,js,Looprx;
	bit retbit;
	uchar idata Autotime[2][7];		//read 2 contrast data
	Looprx=0;
	do{
	for (js=0;js<2;js++){
	I_start();			
	I_send(rxaddr);			//send read addr  data command 
	for( is=1;is<count;is++){	//receive count-1 byte data 
	Autotime[js][is-1]=I_receive();//receive 8 bit data
	I_Ack();
		}
	Autotime[js][count-1]=I_receive();//receive last  byte data
	I_clock();
	I_stop();
		}
	retbit=1;
	for (is=0;is<count;is++){		//loop contrast read 2 data	
		if((Autotime[0][is]!=Autotime[1][is])|(Autotime[0][is]==0xff))retbit=0;
		}
	Looprx++;
	if(retbit==1){				//read ok update trmer data 	
		Looprx=4;						//read right exit do while
		for (is=0;is<count;is++){
			trxdata[is]=Swbyte( Autotime[0][is]);
			//printf("%bx,",trxdata[is]);
			}
		printf("\n");
		}	
	}while(Looprx<4);
	return(retbit);
	}
/****************************S35390A_write_xbyte************************************
************************write  data contrast recveive ok ret1,send 4 error ret0***************/								    
bit S35390A_write_xbyte(uchar txaddr,uchar count ){
	uchar is,Looprx;
	bit retbit;
	uchar idata Autotime[2][7];		//txdata and rxdata  2 contrast data
	#if debug
	printf("\n35390_write");
	#endif
	Looprx=0;
	//count=7;
	do{
		for(is=0;is<count;is++){
			Autotime[0][is]=trxdata[is];
			}
		I_clock();
		I_start();			
		I_send(txaddr);
		for(is=0;is<count;is++){
			I_send(Swbyte(Autotime[0][is]));
			}
		I_stop();		
		wait_5ms();
		I_start();			
		I_send(txaddr+1);			//send read  data command 
		for( is=0;is<count-1;is++){		//receive count-1 byte data 
			Autotime[1][is]=Swbyte(I_receive());//receive 8 bit data
			I_Ack();
		}
		Autotime[1][count-1]=Swbyte(I_receive());//receive last  byte data 
		I_clock();
		I_stop();
		retbit=1;
		Autotime[1][4]&=0x3f;
		for (is=0;is<count;is++){		//loop contrast write and  read  2 data	
			if(Autotime[0][is]!=Autotime[1][is])retbit=0;
			#if debug
			printf("\ntx%bx=%bx,%bx",is,Autotime[0][is],Autotime[1][is]);
			#endif
		}
		Looprx++;
		if(retbit==1)Looprx=4;	
	}while(Looprx<4);
	return(retbit);	
	}

/****************************S35390A_write_time************************************
*******write  Y-M-D,W,H-M-S timer  send data contrast recveive ok ret1,send 4 error ret0***********/	
bit S35390A_txtime(uchar txcont){
	trxdata[0]=DATA_sheet[1][0];
	trxdata[1]=DATA_sheet[1][1];
	trxdata[2]=DATA_sheet[1][2];
	trxdata[3]=DATA_sheet[2][2];
	trxdata[4]=DATA_sheet[0][0];
	trxdata[5]=DATA_sheet[0][1];
	trxdata[6]=DATA_sheet[0][2];
	return( S35390A_write_xbyte(0x64,txcont));
}

/*
bit S35390A_write_time(uchar rxaddr,uchar count ){
	uchar is,Looprx;
	bit retbit;
	uchar Autotime[2][7];		//read 2 contrast data
	Looprx=0;
	do{
		Autotime[0][0]=Swbyte(DATA_sheet[1][0]);
		Autotime[0][1]=Swbyte(DATA_sheet[1][1]);
		Autotime[0][2]=Swbyte(DATA_sheet[1][2]);
		Autotime[0][3]=Swbyte(DATA_sheet[2][2]);
		Autotime[0][4]=Swbyte(DATA_sheet[0][0]);
		Autotime[0][5]=Swbyte(DATA_sheet[0][1]);
		Autotime[0][6]=Swbyte(DATA_sheet[0][2]);
		I_start();			
		I_send(0x64);
		for(is=0;is<7;is++){
			I_send(Swbyte(DATA_sheet[0][is]));
			}
		I_stop();		
		I_start();			
		I_send(0x65);			//send read timer data command 
		for( is=0;is<6;is++){
			Autotime[1][is]=Swbyte(I_receive());//receive 8 bit data
			I_Ack();
		}
		Autotime[js][6]=Swbyte(I_receive());
		I_clock();
		I_stop();
		retbit=1;
		for (is=0;is<6;is++){		//loop contrast read 2 data	
			if(Autotime[0][is]<>Autotime[1][is])retbit=0;
		}
		Looprx++;
		if(retbit==1)Looprx=4;	
	}while(Looprx<4)
	return(retbit);	
	}//*/
/****************************S35390A_read_time************************************
*****************read ok ret1 and update Y-M-D,W,H-M-S timer,read 4 error ret 0 **************/		
bit S35390A_rxtime(){
		if(S35390A_read_xbyte(0x65,7)){
		DATA_sheet[0][0]=trxdata[4]&0x3f;//hour
		DATA_sheet[0][1]=trxdata[5];//minute
		DATA_sheet[0][2]=trxdata[6];//second
		DATA_sheet[1][0]=trxdata[0];//year
		DATA_sheet[1][1]=trxdata[1];//month
		DATA_sheet[1][2]=trxdata[2];//day
		DATA_sheet[2][2]=trxdata[3];//week
		return (1);
		}
		else {return (0);}
		}
/****************************S35390A_init************************************
******************************timer iinitial*************************************/	
S35390A_init(){
if(S35390A_read_xbyte(0x61,1)){
	if((trxdata[0]&0xc0)!=0){
		trxdata[0]=0x03;
		S35390A_write_xbyte(0x60,1);
		}
}
if(S35390A_read_xbyte(0x63,1)){
	if((trxdata[0]&0x80)!=0){
		trxdata[0]=0x03;
		S35390A_write_xbyte(0x60,1);
		}
}
trxdata[0]=0x02;
S35390A_write_xbyte(0x60,1);
}
/*
bit S35390A_read_time(){
	uchar is,js,Looprx;
	bit retbit;
	uchar Autotime[2][7];		//read 2 contrast data
	Looprx=0;
	do{
	for (js=0;js<2;js++){
	I_start();			
	I_send(0x65);			//send read timer data command 
	for( is=0;is<6;is++){
	Autotime[js][is]=I_receive();//receive 8 bit data
	I_Ack();
		}
	Autotime[js][6]=I_receive();
	I_clock();
	I_stop();
		}
	retbit=1;
	for (is=0;is<6;is++){		//loop contrast read 2 data	
		if(Autotime[0][is]<>Autotime[1][is])retbit=0;
		}
	Looprx++;
	if(retbit==1){				//read ok update trmer data 	
		Looprx=4;						//read right exit do while
		DATA_sheet[0][0]=Swbyte(Autotime[0][4]);//hour
		DATA_sheet[0][1]=Swbyte(Autotime[0][5]);//minute
		DATA_sheet[0][2]=Swbyte(Autotime[0][6]);//second
		DATA_sheet[1][0]=Swbyte(Autotime[0][0]);//year
		DATA_sheet[1][1]=Swbyte(Autotime[0][1]);//month
		DATA_sheet[1][2]=Swbyte(Autotime[0][2]);//day
		DATA_sheet[2][2]=Swbyte(Autotime[0][3]);//week
		}	
	}while(Looprx<4)
	return(retbit);	
	}//*/
/****************************************************************
void  mian() {
	unsigned char Select_Type;
	uchar im,jm;
	uchar x81,x82;
	uchar autobyte;
	Initialize78E65();
	PCON =SMOD;
	SCON=UARTMODE1+UARTREN+UARTTI;
	TMOD=TIME1MODE2;
	TH1=230;
	TR1=1;
	//Select_Type = _getkey(); 	// 从键盘输入选择数字
	EAROMImage[0]=0x01;
	EAROMImage[1]=0x01;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	//	i2c_writedata(0,_getkey());
		//i2c_writedata(1,_getkey());
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//EAROMImage[0]= i2c_READdata(0);
//EAROMImage[1]= i2c_READdata(1);

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	while (1)
	{
	printf( "\n0.I_start\n"); 
	printf( "1.I_stop\n"); 
	printf( "2.I_init\n");
	printf( "3.bit I_send( uchar Idata )\n");
	printf ("4.send WaitAck\n");
	printf( "6.rx n pcs data\n");
	printf( ".exit.\n");
	printf ("7.send n pcs data\n");
	printf ("8.stop interrupt");
			Select_Type = _getkey(); 	// 从键盘输入选择数字
			switch(Select_Type){
				case '0':
					printf("\nI_init\n");
					I_init();
					break;
				case '1':
					printf ("\n I_star\n");
					I_start();
					break;
				case '2':
					printf ("\n I_stop\\n");
					I_stop();
					break;
				case '3':
					printf ("\nI_send\nINPUT TX BYTE");
					Select_Type = _getkey();		
					I_start();			
					printf("\nsend=%bx\n",(char)(I_send(Select_Type)));
					//I_start();
					
					for( im=0;im<6;im++){
						autobyte=I_receive();
						I_Ack();
						printf("\nreceive%bx=%bx\n",im,Swbyte(autobyte));
						}
					autobyte=I_receive();
					I_clock();
					I_stop();
					printf("\nreceive%bx=%bx\n",6,Swbyte(autobyte));					
					break;
				case '4':	
					printf ("\nsend WaitAck\n");
					I_start();			
					printf("\nsendaddr=%bx\n",(char)(I_send(0x64)));
					printf("\nsend1=%bx\n",(char)(I_send(Swbyte(06))));
					printf("\nsend2=%bx\n",(char)(I_send(Swbyte(3))));
					printf("\nsend3=%bx\n",(char)(I_send(Swbyte(0x11))));
					printf("\nsend4=%bx\n",(char)(I_send(Swbyte(6))));
					printf("\nsend5=%bx\n",(char)(I_send(Swbyte(9))));
					printf("\nsend6=%bx\n",(char)(I_send(Swbyte(0x59))));
					printf("\nsend7=%bx\n",(char)(I_send(Swbyte(0x50))));
					I_stop();
					break;
				case '6':	
					printf ("\n I_receive addr \n");
					Select_Type = _getkey();
					printf( "input rx pcs\n");
					jm=_getkey();
					I_start();			
					I_send(Select_Type);
					for (im=1;im<jm;im++){
					EAROMImage[im]=I_receive();
					I_Ack();
					}
					EAROMImage[jm]=I_receive();
					I_clock();
					I_stop();
					for (im=1;im<=jm;im++){
					printf ("%bx,",Swbyte(EAROMImage[im]));
					}
					break;
				case '7':
					printf ("\nsend WaitAck\n");
					printf( "input tx pcs\n");
					Select_Type = _getkey();
					for (im=0 ;im<Select_Type;im++){
						printf("input%bx",im);
						EAROMImage[im]=_getkey();
						}
				//	printf( "input two\n");
					//jm= _getkey();	
					I_start();			
					printf("\nsendaddr=%bx\n",(char)(I_send(EAROMImage[0])));
					for (im=1;im<Select_Type;im++){
					printf("\nsend%bx=%bx\n",im,(char)(I_send(Swbyte(EAROMImage[im]))));
						}
					I_stop();
					break;
				case '8':
					printf ("\nstop interrupt");

					I_start();
					x81=I_send(0x60);
					x82=I_send(0x00);
					I_stop();
					printf ("\n%bx,%bx\n",x81,x82);
					break;	
				}

		}
	printf( "read one =%bx\n", i2c_READdata(AT24C16_READ_ID,0)); 
	printf( "read two =%bx\n", i2c_READdata(AT24C16_READ_ID,1)); 
	printf( "input one\n");
		i2c_writedata(AT24C16_WRITE_ID,0,_getkey());
	printf( "input two\n");

		i2c_writedata(AT24C16_WRITE_ID,1,_getkey());
	}//*/
uchar Swbyte(uchar data1){//a byte swap bit 01234567 <->bit76543210
	ACC=data1;
	s7=a0;s6=a1;s5=a2;s4=a3;
	s3=a4;s2=a5;s1=a6;s0=a7;
	return(Swrx);
	}

⌨️ 快捷键说明

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