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

📄 plcprocess.c

📁 M200一个与单片机通信的C语言软件源代码
💻 C
字号:
/***********************************************************************************
/----------------------Copyright (c) 2005 ~ 2008 Miartech. All Rights Reserved.-----------------------/
/***********************************************************************************
**-----------------------------------------File Info--------------------------------------------
** Last modified Date:  2008-06-24
** Descriptions: MI210E(Powerline Network Interface Controller)'s Primary Process 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\PLCProcess.h"

extern BYTE	g_cTrans_Step;
extern BYTE	g_cRecv_Step;
extern BYTE	g_cRecByte_H;
extern BYTE	g_cRecByte_L;
extern BYTE	g_cSend_Data_Length;
extern BYTE	g_cMenu_Value;
extern BYTE	g_cSend_Byte_Cnt;	
extern BYTE	g_cRecv_Byte_Cnt;

extern bit bMI200_RX_TXn;
extern BYTE bdata g_cModCfgReg;
extern BYTE bdata g_cStatusReg;
extern BYTE bdata g_cRecModCfgReg;

/*------------------------------------Global Value Definition------------------------------------*/
bit	g_bError_Pkg_Flag;
bit	g_bRecv_Pkg_Flag;

BYTE g_CRC_H,g_CRC_L;
BYTE g_cPkg_Length = 0;
BYTE g_Pkg_Indication_Byte = 0;
BYTE PLC_Word_Rec_Overtime = 0;
/*------------------------------------------------------------------------------------------*/

/***********************************************************************************
** Function Name:PLC_Send_Frame	
** Input Parameters:cWRData_H,cWRData_L:The Data Send to MI200E
** Output Parameters:None
** Implement:Write The Data Send to MI200E's Sending Byte Register
***********************************************************************************/
void	PLC_Send_Frame(BYTE cWRData_H, BYTE cWRData_L)
{		
	PLC_Write_Reg(PLCAddrWRSR,(g_cStatusReg & 0x7f));	//Clear TI;Write Status Register:0x02
	MI200E_SCK = 0;
	MI200E_CS = 0;
	Write_SPI(PLCAddrWRTB0);								//Write Sending Byte Register 0:0x04
	Write_SPI(cWRData_H);
	Write_SPI(cWRData_L);
	MI200E_SCK = 0;
	MI200E_CS = 1;
}

/***********************************************************************************
** Function Name:PLC_RD_Recv_Word	
** Input Parameters:None
** Output Parameters:None
** Implement:Read The Data Received by MI200E's Receiving Byte Register
***********************************************************************************/
void	PLC_RD_Recv_Word(void)
{	
	MI200E_SCK = 0;
	MI200E_CS = 0;
	Write_SPI(PLCAddrRDRB0);								//Read Receiving Byte Register 0:0x84
	g_cRecByte_H = Read_SPI();
	g_cRecByte_L = Read_SPI();
	MI200E_SCK = 0;
	MI200E_CS = 1;
}

/***********************************************************************************
** Function Name:PLC_Clear_EPF	
** Input Parameters:None
** Output Parameters:cStatusByte:The Value Of Status Register Of MI200E
** Implement:PLC Transmit & Receive Process
***********************************************************************************/
BYTE PLC_Clear_EPF(void)
{		
	BYTE cStatusByte; 
	cStatusByte = PLC_Read_Reg(PLCAddrRDSR);			//Read Status Register:0x82
	PLC_Write_Reg(PLCAddrWRSR, (cStatusByte & 0xf5));	//Clear EPF Flag & CRC_Flag;Write Status Register:0x02
	return(cStatusByte);
}

/***********************************************************************************
** Function Name:PLC_Transmit_Process	
** Input Parameters:PBYTE ptrData_Buffer
** Output Parameters:None
** Implement:PLC Transmit Process
***********************************************************************************/
void PLC_Transmit_Process(PBYTE ptrData_Buffer)
{
	BYTE cForCnt;
	BYTE cStatusByte;
	
	LED_RX = 1;
	if (bMI200_RX_TXn == Status_TRAN)							//Working as a Transmitter  
	{		
		cStatusByte = PLC_Read_Reg(PLCAddrRDSR);					//Read status register
		if((cStatusByte & 0x80) != 0x80)
		{	
			return;
		}
		
		g_cStatusReg = cStatusByte;
		switch(g_cTrans_Step)
		{	
			case 0:
			{	
				LED_TX = 0;
				//Write Mode Cfg Reg, Code Length = 32, Data Rate = 200/400 bps;
				PLC_Write_Reg(PLCAddrWRMR, g_cModCfgReg|0x0c);
				
				PLC_Send_Frame(0xFF, 0xFF);		//First 2 Byte:0xFF 0xFF
				
				//g_Pkg_Indication_Byte = Received Spread Spectrum Factor + Recv Pkg Length(Unit in words)
				g_Pkg_Indication_Byte = (((g_cModCfgReg & 0x0c)<<4) + g_cSend_Data_Length/2 + 2);

				g_cTrans_Step = 1;
			}	
			break;
			case 1:
			{	
				PLC_Write_Reg(PLCAddrWRSR,(g_cStatusReg & 0xfd));//Initial CRC Bit;Write Status Register:0x02
				PLC_Send_Frame(0x1A, g_Pkg_Indication_Byte);	//Send Header Byte:0x1a & Packet Indication Byte 
				g_cTrans_Step = 2;		
			}	
			break;			
			case 2:
			{	
				PLC_Write_Reg(PLCAddrWRMR,g_cModCfgReg);		//Write mode configuration;
				PLC_Send_Frame(0x1F, 0xFF);						//Send 0x1f,0xff as MiarTech's PLC AMR Applications
				g_cTrans_Step = 3;
				g_cSend_Byte_Cnt = 0;
			}	
			break;
			case 3:												//Send Data(Unit in Word:16 Bytes)
			{	
				if(g_cSend_Byte_Cnt >= (g_cSend_Data_Length - 2))		
				{	
					g_cTrans_Step = 4;
				}
				PLC_Send_Frame(*ptrData_Buffer,*(ptrData_Buffer + 1));

				g_cSend_Byte_Cnt = g_cSend_Byte_Cnt + 2;

				if(g_cTrans_Step == 4)		
				{	
					for(cForCnt = 0; cForCnt < 10; cForCnt++)
					{
						_nop_(); _nop_();	_nop_();	_nop_();	_nop_();	
					}
					g_CRC_H = PLC_Read_Reg (PLCAddrRD_CRC_H);			
					g_CRC_L = PLC_Read_Reg (PLCAddrRD_CRC_L);
				}
			}	
			break;
			case 4:												//Send CRC Code:16 Bytes
			{	
				PLC_Send_Frame(g_CRC_H, g_CRC_L);
				g_cTrans_Step = 5;
			}	
			break;
			case 5:
			{	
				bMI200_RX_TXn = Status_RECV;
				PLC_Write_Reg(PLCAddrWRMR, g_cModCfgReg|0x80);	//Working as a Receiver
				g_cTrans_Step = 6;
				LED_TX = 1;
			}	
			break;
			default:	
			{	
				//g_cTrans_Step = 6;
			}	
			break;
		}
	}
}
/***********************************************************************************
** Function Name:PLC_Received_Process	
** Input Parameters:PBYTE ptrData_Buffer
** Output Parameters:None
** Implement:PLC Receive Process
***********************************************************************************/
void	PLC_Receive_Process(PBYTE ptrData_Buffer)
{
	BYTE cStatusByte;
	BYTE CRC_Correct_Flag;
      
	LED_CORRECT = 1;
	LED_TX = 1;
	g_bRecv_Pkg_Flag = 0;
	
	if(bMI200_RX_TXn == Status_RECV)							//Working as a Receiver  
	{	
		if(g_cRecv_Step == 0x10)								//Receive Process Initialization OK
		{	
			cStatusByte = PLC_Read_Reg(PLCAddrRDSR);
			g_cRecModCfgReg = PLC_Read_Reg(PLCAddrRDRR);	//Read Receiving Mode Configuration Register(0x83)
			if(g_cRecModCfgReg != 0x00)						//Have Received Spread Spectrum&Packet Length
			{	
				PLC_Write_Reg(PLCAddrWRRR,0x00);			//Clear Receiving Mode Configuration Byte					
				g_cPkg_Length = (0x3f & g_cRecModCfgReg);	//Packet Length = g_cRecModCfgReg[5:0]
				g_cRecv_Step = 0x01;
				PLC_Word_Rec_Overtime = 0;

				if((g_cMenu_Value != ACTIVE_INTER_TRANS) && (g_cMenu_Value != ACTIVE_INTER_RECV))//Not Interactive Transmitter and Received Mode
				{	
					DSP_Show(0x80,"                ");
					DSP_Write_Cmd(0x80);
				}
			}
			
			else if (((cStatusByte & 0x30) != 0x30) || (PLC_Word_Rec_Overtime  > PLC_WORD_REC_OVERTIME))
			{
				CRC_Correct_Flag = PLC_Clear_EPF();
				g_cRecv_Step = 0x00;
				LED_BUSY = 1;
				LED_RX = 1;
				return;
			}
		}

		else if(g_cRecv_Step == 0x00)
		{	
			cStatusByte = PLC_Read_Reg(PLCAddrRDSR);
			g_cStatusReg = cStatusByte;

			if( (g_cStatusReg & 0x20 ) == 0x20)					//Read Carrier Detected Flag
			{	
				LED_BUSY = 0;
				if( (g_cStatusReg & 0x10 ) == 0x10)				//Read Frame Indicate Flag				
				{	
					g_bRecv_Pkg_Flag = 0;
					g_bError_Pkg_Flag = 0;
					g_cRecv_Step = 0x10;
					LED_RX = 0;
					LED_CORRECT = 1;
					PLC_Word_Rec_Overtime = 0;					
				}						
			}
			else 
			{
				LED_RX = 1;
				LED_BUSY = 1;
			}
		}
		
		else
		{	
			cStatusByte = PLC_Read_Reg(PLCAddrRDSR);
			g_cStatusReg = cStatusByte;

			//Carrier Detected  & Frame Indicate Flag is not Correct or WORD Receive Overtime(100ms)
			if(((cStatusByte & 0x30) != 0x30) || (PLC_Word_Rec_Overtime > PLC_WORD_REC_OVERTIME))
			{
				g_cRecv_Step = 0x00;
				g_bError_Pkg_Flag = 1;
				CRC_Correct_Flag = PLC_Clear_EPF();
				LED_BUSY = 1;
				LED_TX = 1;
				return;
			}
			
			else 
			{
				if((cStatusByte & 0x40) == 0x40)				//Read Received Interrupt Flag.RI = 1:Received OK	
				{	
					PLC_Word_Rec_Overtime = 0;
					PLC_Write_Reg(PLCAddrWRSR,((g_cStatusReg & 0xbf )|0x02));//Clear RI Flag & Set MI200_CRC
					switch( g_cRecv_Step )
					{	
						case 0x01:							//Read 0x1f,0xff as MiarTech's PLC AMR Applications
						{	
							PLC_RD_Recv_Word();
							if((g_cRecByte_H == 0x1F) && (g_cRecByte_L == 0xFF))	
							{	
								g_cRecv_Step = 0x02;
								g_cRecv_Byte_Cnt = 0;
							}
							else	
							{	
								g_cRecv_Step = 0x00;
								g_bError_Pkg_Flag = 1;
								CRC_Correct_Flag = PLC_Clear_EPF();
								LED_BUSY = 1;
								LED_RX = 1;
								return;
							}
						}	
						break;				

						case 0x02:							//Read Data(Unit in Word:16 Bytes) & Save to Buffer
						{	
							if(g_cRecv_Byte_Cnt == (g_cPkg_Length - 3))	
							{	
								g_cRecv_Step = 0x03;	
							}
							PLC_RD_Recv_Word();

							
							*(ptrData_Buffer + g_cRecv_Byte_Cnt) = g_cRecByte_H;
							*(ptrData_Buffer + g_cRecv_Byte_Cnt + 1) = g_cRecByte_L;
							
							if(g_cMenu_Value == ACTIVE_RECEIVER)				//Receiver Mode
							{	
								DSP_Write_Data(g_cRecByte_H);	//Display Data on LCD	
								DSP_Write_Data(g_cRecByte_L);
							}
							g_cRecv_Byte_Cnt++ ;
						}	
						break;
						case 0x03:								//Read MI200_CRC Flag Bit
						{	
							LED_RX = 1;
							PLC_RD_Recv_Word();
							CRC_Correct_Flag = PLC_Clear_EPF();
							g_bRecv_Pkg_Flag = 1;
							
							if ((CRC_Correct_Flag & 0x02) != 0x00)	//CRC Flag Bit = 1;CRC is Correct
							{	
								LED_CORRECT = 0;
							}
							else		
							{	
								g_bError_Pkg_Flag = 1;
								LED_CORRECT = 1;	
							}
							LED_RX = 1;
							g_cRecv_Step = 0x04;
						}	
						break;
						default:	
						break;
					}
				}
			}
		}
	}
}

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

⌨️ 快捷键说明

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