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

📄 hpi.c

📁 在大型通信系统(机架插板式)中多块单板通过TDM总线
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************/
/*                                                                              */
/*  描述: 复用解复用板(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 + -