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

📄 mi.c

📁 一种新型电力载波通讯芯片的驱动
💻 C
字号:
#include<reg52.h>
#include<stdio.h>
#include<math.h>
#define ucode   unsigned char code
#define	Status_TRANS	0
#define	Status_RCV		1

#define	Correct			0
#define	Err		     	1

#define	MODE_32			3
#define	MODE_16			2
#define	MODE_08			1
#define	MODE_04			0

#define	f576			2
#define	f768			1
#define	f1152			0

sbit    SPI_SDI		=	P1^3 ;			// Interface to MI200, SDI pin
sbit    SPI_SDO		=	P1^2 ;			// Interface to MI200, SDO pin
sbit    SPI_Clk		=	P1^1 ;			// Interface to MI200, clk pin
sbit    SPI_CS		=	P1^0 ;			// Interface to MI200, CS pin
sbit	SW_1		=	P3^3 ;			// press KEY to define user's function
sbit	SW_0		=	P3^2 ;			// press KEY to define user's function
sbit	TXD_pin		=	P3^1 ;			
sbit	RXD_pin		=	P3^0 ;

sbit	LED_PWR		=	P2^0;			// Power is OK.
sbit	LED_TX		=	P2^1;			// Sending Packet Now.
sbit	LED_RX		=	P2^2;			// Received Correct Frame Head
sbit	LED_PC		=	P2^3;			// 
sbit	LED_FRM		=	P2^4;			//
sbit	LED_CORR	=	P2^5;			// Received Packet CRC OK
sbit	LED_ERR		=	P2^6;			// Received Packet CRC Bad	
sbit	LED_RSV		=	P2^7;			

//sbit    IRQn		=	P1^2 ;

sbit		CODE_num2  		=	P0^7 ;
sbit		CODE_num1  		=	P0^6 ;
sbit		CODE_num0 		=	P0^5 ;		
sbit		SL_fre1    		=	P0^4 ;		// These two bit to define the Carrier Frequency of MI200
sbit		SL_fre0    		=	P0^3 ;		//
sbit		CODE_length1   	=	P0^2 ;		// These two bit to define the SS Code length or the Data rate of MI200
sbit		CODE_length0   	=	P0^1 ;		//
sbit		MCU_Status 		=	P0^0 ;		// to define TRANS/REC status 

unsigned char	bdata rec_byte;
sbit	rec_D0	=	rec_byte^0;

unsigned char	bdata snd_byte;
sbit	snd_D0	=	snd_byte^0;
sbit	snd_D1	=	snd_byte^1;
sbit	snd_D2	=	snd_byte^2;
sbit	snd_D3	=	snd_byte^3;
sbit	snd_D4	=	snd_byte^4;
sbit	snd_D5	=	snd_byte^5;
sbit	snd_D6	=	snd_byte^6;
sbit	snd_D7	=	snd_byte^7;

unsigned char bdata	status_MI200;
sbit	MI200_TI	=	status_MI200^7;
sbit	MI200_RI	=	status_MI200^6;
sbit	MI200_Carr	=	status_MI200^5;
sbit	MI200_Frame	=	status_MI200^4;
sbit	MI200_EPF	=	status_MI200^3;
sbit	MI200_WEL	=	status_MI200^1;
sbit	MI200_WIP	=	status_MI200^0;

unsigned char bdata	mode_configuration;

sbit	MI200_RX_TXn=	mode_configuration^7;
sbit	MI200_Code2	=	mode_configuration^6;
sbit	MI200_Code1	=	mode_configuration^5;
sbit	MI200_Code0	=	mode_configuration^4;
sbit	MI200_SS1	=	mode_configuration^3;
sbit	MI200_SS0	=	mode_configuration^2;
sbit	MI200_Fre1	=	mode_configuration^1;
sbit	MI200_Fre0	=	mode_configuration^0;

unsigned char bdata	snd_ff;
sbit		TX_EN			=	snd_ff^7;
sbit		SND_bit			=	snd_ff^6;
sbit		MCU_Clk_Dl		=	snd_ff^5;
sbit		SND_bit_temp	=	snd_ff^4;
sbit		Ready_DL		=	snd_ff^3;
sbit		rec_err			=	snd_ff^2;
sbit		lcd_busy_flag	=	snd_ff^0;

unsigned char		mode_sel;
unsigned char		rec_byte_H;
unsigned char		rec_byte_L;
unsigned char 		package_len;

unsigned char		TotalPkg;
unsigned char		CurrentPkg;

unsigned char		rec_pkgs_num;
unsigned char		err_pkgs_num;
unsigned char		Str_Buff_cnt;
unsigned char		rec_threshold;
unsigned char       count=0 ;
ucode info[17]		={"Better PLC World"};
//unsigned char info[17]		={"Better PLC World"};

void    delay_1(void)
{       unsigned int    a;
	for(a=0;a<20000;a++)
	{a=a;}
}

void	write_SPI(unsigned char ss)
{		unsigned char i;
		snd_byte = ss;
		for(i=0;i<8;i++)
		{	SPI_Clk	=	0;
			SPI_SDI	=	snd_D7;
			SPI_Clk	=	1;
			snd_byte <<=1;	
		}
}

unsigned char	read_SPI(void)
{		unsigned char i;
		for(i=0;i<8;i++)
		{	snd_byte <<=1;	
			SPI_Clk	=	1;
			SPI_Clk	=	0;
			snd_D0	=	SPI_SDO;
		}
		return(snd_byte);
}

unsigned char	read_SPI_reg(unsigned char ss)
{		unsigned char ff;
		SPI_CS	=	0;
		write_SPI(ss);
		ff=read_SPI();
		SPI_CS	=	1;
		return(ff);
}

void	en_MI200_reg(void)
{
		SPI_Clk	=	0;
		SPI_CS	=	0;
		write_SPI(0x08);		
		SPI_Clk =	0;
		SPI_CS	=	1;

}

void	dis_MI200_reg(void)
{		SPI_Clk	=	0;
		SPI_CS	=	0;
		write_SPI(0x09);		
		SPI_Clk =	0;
		SPI_CS	=	1;

}

void	write_SPI_register(unsigned char addr,w_data)
{		SPI_CS	=	0;
		write_SPI(addr);
		write_SPI(w_data);
		SPI_Clk	=	0;
		SPI_CS	=	1;
}


void	set_MI200_mode_send(void)
{		unsigned char sts_byte;
		MI200_Code2 =	CODE_num2 ;
		MI200_Code1 =	CODE_num1 ;
		MI200_Code0 =	CODE_num0 ;
		MI200_SS1	=	mode_sel & 0x02;
		MI200_SS0	=	mode_sel & 0x01;
		MI200_Fre1	=	SL_fre1;
		MI200_Fre0	=	SL_fre0;

		do
		{	sts_byte = read_SPI_reg(0x82);	
		}
		while((sts_byte & 0x80)==0x00);						//--	TI
		en_MI200_reg();
		write_SPI_register(0x01,mode_configuration);		//--	write mode configuration;
		dis_MI200_reg();
}

void	send_frame_via_spi(unsigned char snd_byte_h,snd_byte_l)
{		unsigned char	sts_byte;
		do
		{	sts_byte = read_SPI_reg(0x82);	
		}
		while((sts_byte & 0x80)==0x00);						//--	wait when TI = 0;
		en_MI200_reg();
		write_SPI_register(0x02,(sts_byte & 0x7f));			//--	write status configuration, clear TI flag;

		SPI_CS	=	0;
		write_SPI(0x04);
		write_SPI(snd_byte_h);  
		write_SPI(snd_byte_l);
		SPI_Clk	=	0;		
		SPI_Clk	=	0;
		SPI_CS	=	1;

		dis_MI200_reg();
}

void	rec_frame_via_spi(void)
{		unsigned char	sts_byte;
		do
		{	sts_byte = read_SPI_reg(0x82);			//--	read status register
			if( ( sts_byte&0x30 ) != 0x30 )		
			{	rec_err = Err ;
				return ;
			}	
		}
		while((sts_byte & 0x40)==0x00);					//--	wait when RI = 0;
		en_MI200_reg();
		write_SPI_register(0x02,( (sts_byte & 0xbf ) | 0x02 ) );		//clear RI flag

		SPI_CS	=	0;									//--	
		write_SPI(0x84);								//--	
		rec_byte_H = read_SPI();						//--	
		rec_byte_L = read_SPI();						//--	

		SPI_Clk	=	0;
		SPI_CS	=	1;
		dis_MI200_reg();
}

unsigned char	rec_packet_head(void)
{		unsigned char rvd_byte;

		do
		{	rvd_byte = read_SPI_reg(0x82);		//--	read receiving mode configuration
		}
		while( (rvd_byte & 0x10) == 0x00 );			//--	until FRM = 1

		do	{	rvd_byte = read_SPI_reg(0x83);	}	//--	read receiving mode configuration
		while(rvd_byte==0x00);						//--	wait when receiving mode configuration register==0
		en_MI200_reg();
		write_SPI_register(0x03,0x00);				//--	clear receiving mode configuration byte
		dis_MI200_reg();

		return(rvd_byte);
}

void	send_package(len,s)
unsigned char len;
ucode	*s;
{		unsigned char i;
		for(i=0;i<len;i=i+2)
		{	send_frame_via_spi(s[i],s[i+1]);
		}
}

void	init_UART(void)
{		TMOD	=	0x20;		//Counter 1, timer mode, mode 2, 8 bit reloaded.
		SCON	=	0x40;		//8 bit Uart,disable receive
		TH1		=	0xfd;		//19.2kbps
		TH0		=	0xfd;		//19.2kbps
		PCON	=	0x80;		//smod = 1
		TR1		=	1;			
		REN		=	0;
}

void	init_sys(void)
{		P0 = 0xff;				
		P1 = 0xff;		
		P2 = 0xff;				
		P3 = 0xff;
		Str_Buff_cnt	= 0;
		rec_pkgs_num	= 0;
		err_pkgs_num	= 0;
		LED_PWR			= 0;
		rec_threshold	= 80;
		rec_err = Correct;
		init_UART();


		SPI_Clk	=	0;
		SPI_Clk	=	0;
		SPI_CS	=	0;
		write_SPI(0x08);		//--	WREN
		SPI_Clk =	0;
		SPI_CS	=	1;


		en_MI200_reg();
		write_SPI_register(0x07,0xff);						//--	write analog signal processing configuration register,

		write_SPI_register(0x0c,rec_threshold);				//--	fixed rec threshold before correct frame head
		write_SPI_register(0x0d,0x10);						//--	fixed rec threshold after correct frame head

		write_SPI_register(0x10,0x66);						//--	recommendatory value of Bandpass Filter's setting	
		write_SPI_register(0x11,0x88);
		write_SPI_register(0x12,0x66);
		write_SPI_register(0x13,0x88);
		write_SPI_register(0x14,0x66);
		write_SPI_register(0x15,0x88);
		dis_MI200_reg();
}
void	send_sbuff(unsigned char charr)
{		SBUF = charr;
		while(TI==0);
		TI = 0;
}

void	put_buff_trans(void)
{			CurrentPkg++ ;
			send_sbuff('S');
			send_sbuff('e');
			send_sbuff('n');
			send_sbuff('d');
			send_sbuff('i');
			send_sbuff('n');
			send_sbuff('g');
			send_sbuff('.');
			send_sbuff('.');
			send_sbuff('.');
			send_sbuff(0x0d);
			send_sbuff(0x0a);
			send_sbuff(' ');
			send_sbuff(' ');
			send_sbuff(' ');
			send_sbuff(' ');
			send_sbuff((CurrentPkg)/100+0x30);
			send_sbuff((CurrentPkg%100)/10+0x30);
			send_sbuff((CurrentPkg%10)+0x30);
			send_sbuff('P');
			send_sbuff('k');
			send_sbuff('g');
			send_sbuff(0x0d);
			send_sbuff(0x0a);
}

void	transmitt(void)
{		unsigned char	package_ind_byte;
		unsigned char	CRC_high,CRC_low;
		unsigned char	CRC_temp; 
		
		Str_Buff_cnt = 0;
		mode_configuration	= 0xff;

		MI200_Code2 =	CODE_num2 ;
		MI200_Code1 =	CODE_num1 ;
		MI200_Code0 =	CODE_num0 ;
		MI200_Fre1	=	SL_fre1;
		MI200_Fre0	=	SL_fre0;

		MI200_RX_TXn		= Status_TRANS;
		mode_sel			= MODE_32;
		set_MI200_mode_send();
		mode_sel = 0x00;
		if (CODE_length1 == 1)	mode_sel = 0x02;
		if (CODE_length0 == 1)	mode_sel += 0x01;
		package_ind_byte	= ( mode_sel * 64 ) + 9 ;
		LED_TX = 0 ;            
            
		send_frame_via_spi( 0xff, 0xff );
		CRC_temp = read_SPI_reg( 0x82 );

		en_MI200_reg();
		write_SPI_register( 0x02,( CRC_temp & 0xfd) );
		send_frame_via_spi( 0x1a, package_ind_byte );
		set_MI200_mode_send();
		dis_MI200_reg();

		send_package(16,info);
		CRC_high	=	read_SPI_reg ( 0xa8 );
		CRC_low		=	read_SPI_reg ( 0xa9 );
		send_frame_via_spi( CRC_high, CRC_low );

		MI200_RX_TXn = Status_RCV;
		mode_sel = MODE_32;
		set_MI200_mode_send();

		LED_TX = 1 ;
		put_buff_trans();

		delay_1() ;
}

void	put_buff_rec(void)
{		send_sbuff(0x0d);
		send_sbuff(0x0a);
		send_sbuff('R');
		send_sbuff('e');
		send_sbuff('c');
		send_sbuff((rec_pkgs_num)/100+0x30);
		send_sbuff((rec_pkgs_num%100)/10+0x30);
		send_sbuff((rec_pkgs_num%10)+0x30);
		send_sbuff('P');
		send_sbuff('k');
		send_sbuff('g');
		send_sbuff(' ');
		send_sbuff((err_pkgs_num)/100+0x30);
		send_sbuff((err_pkgs_num%100)/10+0x30);
		send_sbuff((err_pkgs_num%10)+0x30);
		send_sbuff('E');
		send_sbuff('r');
		send_sbuff('r');
		send_sbuff(0x0d);
		send_sbuff(0x0a);
}

void	receive(void)
{		unsigned char	package_info ;
		unsigned char	jjj ;
		unsigned char	CRC_ind ;

		rec_err		= Correct;
		Str_Buff_cnt= 0;
		rec_byte	= 0;
		rec_byte_H	= 0;
		rec_byte_L	= 0;

		mode_configuration	=	0xff;

		MI200_Code2 =	CODE_num2 ;
		MI200_Code1 =	CODE_num1 ;
		MI200_Code0 =	CODE_num0 ;
		MI200_SS1	=	mode_sel & 0x02 ;
		MI200_SS0	=	mode_sel & 0x01 ;
		MI200_Fre1	=	SL_fre1;
		MI200_Fre0	=	SL_fre0;

		en_MI200_reg();
		write_SPI_register(0x01,mode_configuration) ;			//--	write mode configuration, 
																//--	power on, RX, not reset, SS=32, Fre=115.2KHz;
		write_SPI_register(0x07,0xff);							//--	write analog signal processing configuration register,
		dis_MI200_reg();

		package_info=	rec_packet_head();						//--	receive the package information including package length and SS_Mode
		package_len = package_info & 0x3f;						//--	package lebgth infomation, low 6 bit
		if ( package_len > 32 )		package_len = 32;

		LED_RX = 0 ;
		LED_ERR = 1;
		LED_CORR = 1 ;

		for(jjj=1; ((jjj < package_len)&&(rec_err==Correct)) ; jjj=jjj+1 )	//--	receive data field
		{	rec_frame_via_spi();
			send_sbuff(rec_byte_H);
			send_sbuff(rec_byte_L);
		}

		if(rec_err == Correct)		
		{	rec_pkgs_num ++;
			rec_frame_via_spi();									//--	receive the CRC word
			if(rec_err == Correct)
			{
				CRC_ind = read_SPI_reg(0x82);								//--	read Status Register

				en_MI200_reg();
				write_SPI_register(0x02 , (CRC_ind & 0xf5));				//--	clear EPF flag & CRC_flag;
				dis_MI200_reg();

				if ((CRC_ind & 0x02) != 0x00)
				{	LED_ERR		= 1;
				}
				else
				{	LED_ERR 	= 0;
					err_pkgs_num ++ ;
				}
		
				if(rec_pkgs_num >200)
				{	rec_pkgs_num = 0;
					err_pkgs_num = 0;
				}	
				put_buff_rec();
	
				LED_CORR = ~LED_ERR;
				LED_RX = 1 ;
			}
		}
		else
		{	return;
		}
}
void init_31()
{
 
 TMOD=0x11; /*set T/C0 and T/C1 mode 1 mode*/
 TCON=0x04;
 ET0=1;     /*open T/C0 interrupt*/
 ET1=1;
 EX0=1;     /*yun xu wai bu interrupt*/
 TH0=-(50000/256);   /*delay 10 ms timer0 interrupt*/
 TL0=-(50000%256);
 TH1=-(50000/256);
 TL1=-(50000%256);
 
 EA=1;
 TR0=1;
}
void Timer0_count() interrupt 1 using 1
///interrupt [0x0B] void T0_int (void)T0中断进行普通模式的数据显示*/
{

	TH0=-(50000/256);   //*delay 100ms interrupt one times*/
	TL0=-(50000%256);
	count++;
	if(count>10)
      {count=0;
      	P2 =~P2; 
  	    }
} 
void    main(void)
{		delay_1();
		delay_1();
		init_sys();
		init_31();
		send_sbuff(' ');
		send_sbuff(' ');
		send_sbuff(' ');
		send_sbuff(' '); 
		send_sbuff('M');
		send_sbuff('i');
		send_sbuff('a');
		send_sbuff('r');
		send_sbuff('T');
		send_sbuff('e');
		send_sbuff('c');
		send_sbuff('h');
		send_sbuff(0x0d);
		send_sbuff(0x0a);
		send_sbuff(' ');
		send_sbuff(' ');
		send_sbuff(' ');
		send_sbuff(' ');
		send_sbuff('P');
		send_sbuff('L');
		send_sbuff('C');
		send_sbuff(' ');
		send_sbuff('D');
		send_sbuff('e');
		send_sbuff('m');
		send_sbuff('o');
		send_sbuff(0x0d);
		send_sbuff(0x0a);
        P2=0;
        P2=0xFF;
        P2=0;
		for(;;); 
		delay_1();
		delay_1();

		TotalPkg	=	200;
		CurrentPkg	=	0;

		package_len	= 16;
		for(;;)
		{	
			if((MCU_Status == Status_TRANS) && (CurrentPkg < TotalPkg))	
			{	transmitt();
				CurrentPkg ++;
			}
			else 		receive();
		}
}

⌨️ 快捷键说明

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