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

📄 mi200e.c

📁 M200一个与单片机通信的C语言软件源代码
💻 C
字号:
/***********************************************************************************
/----------------------Copyright (c) 2005 ~ 2008 Miartech. All Rights Reserved.-----------------------/
/***********************************************************************************
**-----------------------------------------File Info--------------------------------------------
** Last modified Date:  2008-06-24
** Descriptions: MI200E(Powerline Network Interface Controller)'s Primary Functions
**--------------------------------------------------------------------------------------------
** Created By:  	Kelven
** Created Date:	2007-04-17
**--------------------------------------------------------------------------------------------
** Modified by: 	Kelven
** Modified date:	2007-09-04
** Version:		V4.0.0
** Descriptions:
**--------------------------------------------------------------------------------------------
** Modified by: 	Kelven
** Modified date:	2008-06-24
** Version:		V4.0.1
** Descriptions:	Updating Key Configrating Function, Added PLC Chip Register Value Setting Module
***********************************************************************************/

#include "..\inc\MI200E.h"

/*------------------------------------Global Value Definition------------------------------------*/
BYTE bdata g_cModCfgReg;
sbit	bMI200_RX_TXn	=	g_cModCfgReg^7;	//0:Transmitter;1:Receviver
sbit	bMI200_Code2	=	g_cModCfgReg^6;	//Spread Spectrum Code 000~111
sbit	bMI200_Code1	=	g_cModCfgReg^5;
sbit	bMI200_Code0	=	g_cModCfgReg^4;
sbit	bMI200_SS1		=	g_cModCfgReg^3;	//00:Code Length=4,Data Rate=1600/1920 bps;01:Length=8,Data Rate=800/960 bps;
sbit	bMI200_SS0		=	g_cModCfgReg^2;	//10:Code Length=16,Data Rate=400/480 bps;11:Length=32,Data Rate=200/400 bps;
sbit	bMI200_Freq1	=	g_cModCfgReg^1;	//00:Carrier Frequency=57.6KHz;01:Carrier Frequency=76.8KHz;
sbit	bMI200_Freq0	=	g_cModCfgReg^0;	//10:Not Defined;11:Carrier Frequency=115.2KHz;

BYTE bdata g_cStatusReg;
sbit	bMI200_TI        	=	g_cStatusReg^7;		//Transmit Interrupt Flag  TI=1:Transmit OK,Reset by Software
sbit	bMI200_RI          =	g_cStatusReg^6;		//Receive Interrupt Flag  RI=1:Receive OK,Reset by Software
sbit	bMI200_Carr		=	g_cStatusReg^5;		//Carrier Detected Flag
sbit	bMI200_Frame	=	g_cStatusReg^4;		//Frame Indicate Flag
sbit	bMI200_EPF		=	g_cStatusReg^3;		//End of Packet Flag
sbit	bMI200_TX_Err	=	g_cStatusReg^2;		//Transmit Error Flag
sbit	bMI200_CRC_ind	=	g_cStatusReg^1;		//CRC Bit Used by Receiver
sbit	bMI200_WEL		=	g_cStatusReg^0;		//Write Enable

BYTE bdata g_cRecModCfgReg;
sbit	bRSS1		=	g_cRecModCfgReg^7;		//RSS[1:0]:Received Spread Spectrum Factor
sbit	bRSS0		=	g_cRecModCfgReg^6;
sbit	bRL5		=	g_cRecModCfgReg^5;		//RL[5:0]:Received Packet Length
sbit	bRL4		=	g_cRecModCfgReg^4;
sbit	bRL3		=	g_cRecModCfgReg^3;
sbit	bRL2		=	g_cRecModCfgReg^2;
sbit	bRL1		=	g_cRecModCfgReg^1;
sbit	bRL0		=	g_cRecModCfgReg^0;

BYTE bdata g_cAsigCfgReg;
sbit	bHSB		=	g_cAsigCfgReg^7;	//Receiving Sensitivity Mode  1:High Sensitivity Mode;0:Normal Mode
sbit	bRSV		=	g_cAsigCfgReg^6;	
sbit	bRSOS		=	g_cAsigCfgReg^5;	//RSO Pin Function Select  1:Pin to Gain Stage Amplifier's Output;0:Pin to BPF's Output
sbit	bBPFPD		=	g_cAsigCfgReg^4;	//Bandpass Filter'sPower Down Mode  1:Normal Mode;0:Power Down Mode
sbit	bRSBFPD	=	g_cAsigCfgReg^3;	//RSO Buffer Power Down Mode  1:Normal Mode;0:Power Down Mode
sbit	bOA2		=	g_cAsigCfgReg^2;	//OA[3:0]:Output Amplitude  111:3.5 Vpp;110:3.0 Vpp
sbit	bOA1		=	g_cAsigCfgReg^1;	//101:2.5 Vpp;100:2.0 Vpp;011:1.75 Vpp;
sbit	bOA0		=	g_cAsigCfgReg^0;	//010:1.5 Vpp;001:1.25 Vpp;000:1.0 Vpp;

BYTE bdata g_cSPI_Data_Buf;
sbit	bSPI_Byte_D7 = g_cSPI_Data_Buf^7;
sbit	bSPI_Byte_D6 = g_cSPI_Data_Buf^6;
sbit	bSPI_Byte_D5 = g_cSPI_Data_Buf^5;
sbit	bSPI_Byte_D4 = g_cSPI_Data_Buf^4;
sbit	bSPI_Byte_D3 = g_cSPI_Data_Buf^3;
sbit	bSPI_Byte_D2 = g_cSPI_Data_Buf^2;
sbit	bSPI_Byte_D1 = g_cSPI_Data_Buf^1;
sbit	bSPI_Byte_D0 = g_cSPI_Data_Buf^0;
/*------------------------------------------------------------------------------------------*/

/***********************************************************************************
** Function Name:	MI200E_Init
** Input Parameters:None
** Output Parameters:None
** Implement:Initialization Of MI200E & Wirte Default Value Of MI200E's Registers
***********************************************************************************/
void	MI200E_Init(void)
{		
	MI200E_RST = 1;							//End of Reset For MI200E
/*-------------------------------------------------------------------------------------------
** -- Note: There must have 20 ms Delay After  MI200E_RST Set to High -----------------------------** 
**-----------------------------------------------------------------------------------------*/
	TOOL_Delay_MS(200);
	PLC_Write_Reg(PLCAddrWRMR,0xFF);		//Write Mode Configuration Register
	PLC_Write_Reg(PLCAddrWRTH0,0x58);		//Write Carrier detection threshold (Before Frame Sync)
	PLC_Write_Reg(PLCAddrWRTH1,0x01);		//Write Carrier detection threshold (After Frame Sync)
	PLC_Write_Reg(PLCAddrWR_F1FRE,0x66);	//Write adjustment value of 1st frequency point for BPF.
	PLC_Write_Reg(PLCAddrWR_F1Q,0x88);		//Write adjustment value of 1st Q value for BPF.
	PLC_Write_Reg(PLCAddrWR_F2FRE,0x66);	//Write adjustment value of 2nd frequency point for BPF.
	PLC_Write_Reg(PLCAddrWR_F2Q,0x88);		//Write adjustment value of 2nd Q value for BPF.
	PLC_Write_Reg(PLCAddrWR_F3FRE,0x66);	//Write adjustment value of 3rd frequency point for BPF.
	PLC_Write_Reg(PLCAddrWR_F3Q,0x88);		//Write adjustment value of 3rd Q value for BPF.
	PLC_Write_Reg(PLCAddrWRAR,0x9F);		//Write Analog Signal Processing Configuration Register
}

/***********************************************************************************
** Function Name:Write_SPI
** Input Parameters:cByte_Send:Data Send to PLC
** Output Parameters:None
** Implement:Send Data From Microcontroller to PLC
***********************************************************************************/
void	Write_SPI(BYTE cByte_Send)
{	
	g_cSPI_Data_Buf = cByte_Send;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D7;		
	MI200E_SCK = 1;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D6;		
	MI200E_SCK = 1;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D5;		
	MI200E_SCK = 1;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D4;		
	MI200E_SCK = 1;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D3;		
	MI200E_SCK = 1;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D2;		
	MI200E_SCK = 1;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D1;		
	MI200E_SCK = 1;
	
	MI200E_SCK = 0;		
	MI200E_SDI = bSPI_Byte_D0;		
	MI200E_SCK = 1;
}

/***********************************************************************************
** Function Name:Read_SPI
** Input Parameters:None
** Output Parameters:g_cSPI_Data_Buf:Data Send to Microcontroller
** Implement:Receive Data From PLC to Microcontroller
***********************************************************************************/
BYTE Read_SPI(void)
{		
	MI200E_SCK = 1;	
	MI200E_SCK = 0;
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D7 = MI200E_SDO;
	
	MI200E_SCK = 1;
	MI200E_SCK = 0;		
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D6 = MI200E_SDO;
	
	MI200E_SCK = 1;		
	MI200E_SCK = 0;		
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D5 = MI200E_SDO;
	
	MI200E_SCK = 1;		
	MI200E_SCK = 0;		
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D4 = MI200E_SDO;
	
	MI200E_SCK = 1;		
	MI200E_SCK = 0;		
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D3 = MI200E_SDO;
	
	MI200E_SCK = 1;		
	MI200E_SCK = 0;		
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D2 = MI200E_SDO;
	
	MI200E_SCK = 1;		
	MI200E_SCK = 0;		
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D1 = MI200E_SDO;
	
	MI200E_SCK = 1;		
	MI200E_SCK = 0;		
	_nop_();
	_nop_();
	_nop_();
	bSPI_Byte_D0 = MI200E_SDO;
	return(g_cSPI_Data_Buf);
}

/***********************************************************************************
** Function Name:PLC_Read_Reg
** Input Parameters:cReg_Addr:Register Address
** Output Parameters:cReg_Data:Register's Data
** Implement:Read The Value Of PLC's relative Register
***********************************************************************************/
BYTE PLC_Read_Reg(BYTE cReg_Addr)
{
	BYTE cReg_Data;
	MI200E_SCK = 0;
	MI200E_CS = 0;
	Write_SPI(cReg_Addr);
	cReg_Data = Read_SPI();
	MI200E_SCK = 0;
	MI200E_CS = 1;
	return(cReg_Data);
}

/***********************************************************************************
** Function Name:PLC_Write_Reg	
** Input Parameters:cReg_Addr:Register Address;cReg_Data:Register's Data
** Output Parameters:None
** Implement:Wirte Value Of PLC's relative Register
***********************************************************************************/
void	PLC_Write_Reg(BYTE cReg_Addr, BYTE cReg_Data)
{
	MI200E_SCK = 0;
	MI200E_CS = 0;
	Write_SPI(cReg_Addr);
	Write_SPI(cReg_Data);
	MI200E_SCK = 0;
	MI200E_CS = 1;
}

/***********************************************************************************
** Function Name:PLC_RegCheckAll	
** Input Parameters:None
** Output Parameters:None
** Implement:Wirte & Read Value to PLC's relative Register in Order to Check All Registers.
***********************************************************************************/
void	PLC_Reg_Check_All(void)
{
	BYTE xdata cSelf_Check_Error ;
	BYTE xdata cError_Cnt;
	BYTE xdata cReg_ReadValue;
	BYTE code Check_Result_Right[17]	={"SelfCheck Right!"};
	BYTE code Check_Result_Error[17]	={"SelfCheck Error!"};

	MI200E_RST = 1;	
	TOOL_Delay_MS(20);
	
	cSelf_Check_Error = 0;
	cError_Cnt = 0x00;
	cReg_ReadValue = 0x00;
	
	//-------------------------Wirte & Read Checking Register 0x01-------------------------------//
	cReg_ReadValue = PLC_Read_Reg(0x81) ;
	if ( cReg_ReadValue != 0xFF ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}

	PLC_Write_Reg(0x01, 0x00);
	cReg_ReadValue = PLC_Read_Reg(0x81) ;
	if ( cReg_ReadValue != 0x00 ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}

	PLC_Write_Reg(0x01, 0xFF);
	cReg_ReadValue = PLC_Read_Reg(0x81) ;
	if ( cReg_ReadValue != 0xFF ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}
		
	//-------------------------Wirte & Read Checking Register 0x07-------------------------------//
	cReg_ReadValue = PLC_Read_Reg(0x87) ;
	if ( cReg_ReadValue != 0xFF ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}

	PLC_Write_Reg(0x07, 0x00);
	cReg_ReadValue = PLC_Read_Reg(0x87) ;
	if ( cReg_ReadValue != 0x00 ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}

	PLC_Write_Reg(0x07, 0xFF);
	cReg_ReadValue = PLC_Read_Reg(0x87) ;
	if ( cReg_ReadValue != 0xFF ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}
			
	//----------------------------Read Checking Register 0xA8----------------------------------//
	cReg_ReadValue = PLC_Read_Reg(0xA8) ;
	if ( cReg_ReadValue != 0x00 ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}

	//----------------------------Read Checking Register 0xA9----------------------------------//
	cReg_ReadValue = PLC_Read_Reg(0xA9) ;
	if ( cReg_ReadValue != 0x00 ) 
	{
		cSelf_Check_Error = 1;
		cError_Cnt++;
	}

	if ( cSelf_Check_Error == 0 && cError_Cnt == 0) 
    	{
     		DSP_Show(0x80,Check_Result_Right);
	}
    	else
    	{
     		DSP_Show(0x80,Check_Result_Error);
	}
		DSP_Write_Cmd(0xC9);
	DSP_Write_Data((cError_Cnt/10 + 0x30));
	DSP_Write_Data(((cError_Cnt%10) + 0x30));
}

/***********************************************************************************
**										    End Of File											**
***********************************************************************************/

⌨️ 快捷键说明

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