📄 hpi.c
字号:
/********************************************************************************/
/* */
/* 描述: 复用解复用板(V2.0)控制器程序 */
/* VER: 2.0 */
/* REV: 0.0 */
/* 作者: 胡丙龙 */
/* 时间: 2002年02月21日 */
/* 说明: 本软件版本针对VER2.0的硬件 */
/* */
/* */
/* */
/* */
/********************************************************************************/
#pragma debug code small optimize(5) objectextend
#include "reg52.h"
#include "mdb.h"
#include "hpi.h"
#include "hdlc.h"
#include "constant.h"
#include "sab82525.h"
/* 外部函数 */
extern uchar SendMSG(void); /* 发送消息L3,外部接口 */
/* 函数声明 */
void InitHPI(void); /* 初始化HPI缓冲区及变量 */
void TestHPI(void); /* 测试HPI读写状况 */
void CheckTxHPI(void); /* 监测各DSP接收命令情况 */
void CheckRxHPI(void); /* 监测各DSP上报消息情况 */
void SendFrameHPI(void); /* 从HPI向各DSP发送数据 */
void SetDSPINT(void); /* 从HPI向各DSP发中断通知 */
void ReadFrameHPI(void); /* 从HPI读取DSP的上报消息 */
void CheckDSP(void); /* 监测各DSP运行状况 */
void GetSWVer(void); /* 获取CPU、DSP软件版本信息并上报 */
/* 变量定义 */
HPIQueue idata m_sHPIQue;
uchar idata HPITxVar[BUFSIZE+1]; /* HPI接口发送(-->DSP)暂存变量 */
uchar idata HPIRxVar[BUFSIZE+1]; /* HPI接口接收(<--DSP)暂存变量 */
uchar idata HPIRxVarA[BUFSIZE+1]; /* HPI接口接收(<--DSP)暂存变量,中断中用 */
L3Pack xdata HPIRxBuf[HPIRXBUFNUM]; /* HPI接口接收(<--DSP)缓冲区 */
uchar xdata *m_pHPI; /* 定义HPI接口地址暂存变量(指针) */
uint data m_uiHPIAREA; /* 定义HPI接口读写区变量 */
uchar data m_ucHPILEN; /* 定义HPI接口读写长度变量 */
uchar idata m_ucHPIWatchdogTC; /* 定义HPI软件看门狗计数器 */
uchar bdata m_ucHPIFlag;
sbit m_bHPITestFlag = m_ucHPIFlag^0; /* 定义HPI测试结果标志 */
sbit m_bHPIWatchdogFlag = m_ucHPIFlag^1;/* 定义HPI软件看门狗标志 */
/* 外部变量定义 */
extern uchar xdata *RESET; /* 定义DSP复位接口译码地址 */
extern uchar xdata *HPI1; /* 定义HPI-DSP1接口译码地址 */
extern uchar xdata *HPI2; /* 定义HPI-DSP2接口译码地址 */
extern uchar xdata *HPI3; /* 定义HPI-DSP3接口译码地址 */
extern uchar xdata *HPI4; /* 定义HPI-DSP4接口译码地址 */
extern L3Pack xdata L3TxVar; /* 网络层发送暂存变量,用户接口 */
extern L3Pack xdata L3RxVar; /* 网络层接收暂存变量,用户接口 */
extern uchar data m_ucVar1; /* 通用变量1 */
extern uchar data m_ucTimer0Count; /* 10ms定时计数器 */
/********************************************************************************/
/* 函数名称:void GetSWVer(void) */
/* 简要描述:/* 获取CPU、DSP软件版本信息并上报 */
/* */
/* 时 间:2002年02月21日 */
/********************************************************************************/
void GetSWVer(void)
{
uchar data i;
/* 判断缓冲区是否溢出 */
if(m_sHPIQue.ucRxPendNum <= HPIRXBUFNUM-5)
{
/* 获取DSP软件版本信息 */
for(i=0; i<4; i++)
{
WATCHDOG = ~WATCHDOG;
/* 基地址确定 */
if(i == 0)
{
m_pHPI = HPI1;
}
else if(i == 1)
{
m_pHPI = HPI2;
}
else if(i == 2)
{
m_pHPI = HPI3;
}
else if(i == 3)
{
m_pHPI = HPI4;
}
/* 设置HPI读区间和长度 */
m_uiHPIAREA = DSPSOFTVER;
m_ucHPILEN = 5;
/* 读DSPSTATUS状态字 */
ReadFrameHPI();
/* 指针获取及调整 */
EX1 = 0; /* 关中断防止指针调整出错 */
m_ucVar1 = m_sHPIQue.ucRxPlaceIndex;
m_sHPIQue.ucRxPlaceIndex++;
m_sHPIQue.ucRxPlaceIndex = m_sHPIQue.ucRxPlaceIndex%HPIRXBUFNUM;
m_sHPIQue.ucRxPendNum++;
EX1 = 1; /* 重开中断 */
HPIRxBuf[m_ucVar1].ucPID = 0x55;
HPIRxBuf[m_ucVar1].ucLength = 0x0a;
HPIRxBuf[m_ucVar1].uiType = PM_BOARDVER_IND;
HPIRxBuf[m_ucVar1].ucData[0] = i+1; /* 数据处理单元号 */
HPIRxBuf[m_ucVar1].ucData[1] = HPIRxVar[0]; /* 版本号——年 */
HPIRxBuf[m_ucVar1].ucData[2] = HPIRxVar[1]; /* 月 */
HPIRxBuf[m_ucVar1].ucData[3] = HPIRxVar[2]; /* 日 */
HPIRxBuf[m_ucVar1].ucData[4] = HPIRxVar[3]; /* 版本号 */
HPIRxBuf[m_ucVar1].ucData[5] = HPIRxVar[4]; /* 修正号 */
}
/* 指针获取及调整 */
EX1 = 0; /* 关中断防止指针调整出错 */
m_ucVar1 = m_sHPIQue.ucRxPlaceIndex;
m_sHPIQue.ucRxPlaceIndex++;
m_sHPIQue.ucRxPlaceIndex = m_sHPIQue.ucRxPlaceIndex%HPIRXBUFNUM;
m_sHPIQue.ucRxPendNum++;
EX1 = 1; /* 重开中断 */
/* 获取CPU软件版本信息 */
HPIRxBuf[m_ucVar1].ucPID = 0x55;
HPIRxBuf[m_ucVar1].ucLength = 0x0a;
HPIRxBuf[m_ucVar1].uiType = PM_BOARDVER_IND;
HPIRxBuf[m_ucVar1].ucData[0] = 0; /* 数据处理单元号 */
HPIRxBuf[m_ucVar1].ucData[1] = YEAR; /* 版本号——年 */
HPIRxBuf[m_ucVar1].ucData[2] = MONTH; /* 月 */
HPIRxBuf[m_ucVar1].ucData[3] = DATE; /* 日 */
HPIRxBuf[m_ucVar1].ucData[4] = VERSION; /* 版本号 */
HPIRxBuf[m_ucVar1].ucData[5] = REVISION; /* 修正号 */
}
return;
}
/********************************************************************************/
/* 函数名称:void CheckTxHPI(void) */
/* 简要描述:转发通过HPI发到各DSP的命令 */
/* */
/* 时 间:2002年02月21日 */
/********************************************************************************/
void CheckTxHPI(void)
{
uchar data temp1,i;
/* 转发命令 */
HPITxVar[0] = SOI;
HPITxVar[1] = L3RxVar.ucPID;
HPITxVar[2] = L3RxVar.ucLength;
HPITxVar[3] = (L3RxVar.uiType>>8)&0xff;
HPITxVar[4] = L3RxVar.uiType&0xff;
HPITxVar[5] = L3RxVar.ucData[0]%2; /* 单元号 */
/* 剩余有效字节 */
for(i=6; i<=HPITxVar[2]; i++)
{
HPITxVar[i] = L3RxVar.ucData[i-5];
}
/* 计算HPI基地址 */
temp1 = L3RxVar.ucData[0]/2;
if(temp1 == 0)
{
m_pHPI = HPI1;
}
else if(temp1 == 1)
{
m_pHPI = HPI2;
}
else if(temp1 == 2)
{
m_pHPI = HPI3;
}
else
{
m_pHPI = HPI4;
}
/* 设置HPI读写区间和长度 */
m_uiHPIAREA = AREAWRITE;
m_ucHPILEN = HPITxVar[2];
/* 写数据给C549 */
SendFrameHPI();
/* 发中断通知C549 */
SetDSPINT();
return;
}
/********************************************************************************/
/* 函数名称:void CheckRxHPI(void) */
/* 简要描述:转发通过HPI收到各DSP的上报消息 */
/* */
/* 时 间:2002年02月21日 */
/********************************************************************************/
void CheckRxHPI(void)
{
uchar data temp1;
/* 转发上报消息 */
if(m_sHPIQue.ucRxPendNum > 0)
{
L3TxVar = HPIRxBuf[m_sHPIQue.ucRxDealIndex];
temp1 = SendMSG();
if(temp1 == TRUE)
{
/* 发送成功,则调整指针,否则不调整指针 */
m_sHPIQue.ucRxDealIndex++;
m_sHPIQue.ucRxDealIndex = m_sHPIQue.ucRxDealIndex%HPIRXBUFNUM;
m_sHPIQue.ucRxPendNum--;
}
}
return;
}
/********************************************************************************/
/* 函数名称:void InitHPI(void) */
/* 简要描述:初始化HPI接口变量 */
/* */
/* 时 间:2002年02月21日 */
/********************************************************************************/
void InitHPI(void)
{
uchar data i,j;
uchar xdata *pHPI;
/* 初始化HPI接口缓冲区 */
for(i=0;i<BUFSIZE+1;i++)
{
HPIRxVar[i] = 0;
HPIRxVarA[i] = 0;
HPITxVar[i] = 0;
}
for(i=0;i<HPIRXBUFNUM;i++)
{
HPIRxBuf[i].ucPID = 0;
HPIRxBuf[i].ucLength = 0;
HPIRxBuf[i].uiType = 0;
for(j=0;j<BUFSIZE-8;j++)
{
HPIRxBuf[i].ucData[j] = 0;
}
}
/* 初始化变量 */
m_sHPIQue.ucTxPendNum = 0; /* HPI接口 */
m_sHPIQue.ucRxPendNum = 0;
m_sHPIQue.ucTxDealIndex = 0;
m_sHPIQue.ucTxPlaceIndex = 0;
m_sHPIQue.ucRxDealIndex = 0;
m_sHPIQue.ucRxPlaceIndex = 0;
m_ucHPIWatchdogTC = 0;
m_bHPIWatchdogFlag = TRUE;
return;
}
/********************************************************************************/
/* 函数名称:void TestHPI(void) */
/* 简要描述:/* 测试HPI口读写状况 */
/* */
/* 时 间:2002年02月21日 */
/********************************************************************************/
void TestHPI(void)
{
uchar data i,j,k,a;
a = 0;
for(i=0; i<4; i++)
{
WATCHDOG = ~WATCHDOG;
/* 基地址确定 */
if(i == 0)
{
m_pHPI = HPI1;
}
else if(i == 1)
{
m_pHPI = HPI2;
}
else if(i == 2)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -