📄 plcprocess.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 + -