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