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

📄 hpi.c

📁 在大型通信系统(机架插板式)中多块单板通过TDM总线
💻 C
📖 第 1 页 / 共 2 页
字号:
            m_pHPI = HPI3;
        }
        else if(i == 3)
        {
            m_pHPI = HPI4;
        }
            
        /* 设置HPI写区间和长度  */
        m_uiHPIAREA = HPITEST;
        m_ucHPILEN = BUFSIZE;
        
        for(j=0;j<BUFSIZE;j++)
        {
            HPITxVar[j] = j+0x70;
            HPIRxVar[j] = 0;
        }

        /* 写数据               */
        SendFrameHPI();

        /* 延时 */
        for(j=0;j<0xf0;j++)
                for(k=0;k<0xf0;k++);
                

        /* 读数据  */
        m_uiHPIAREA = HPITEST+1;
        ReadFrameHPI();
            
        /* 比较 */
        for(j=0;j<BUFSIZE;j++)
        {
            if( HPIRxVar[j]!=(j+0x70) )
            {
                a = 1;
            }
        }

        /* 根据结果置标志 */
        if(a==1)
        {
            m_bHPITestFlag = WRONG;
        }
        else
        {
            m_bHPITestFlag = RIGHT;
        }
    }

    return;
}       


/********************************************************************************/
/*  函数名称:void CheckDSP(void)                                                */
/*  简要描述:查询DSP是否死机                                                    */
/*                                                                              */
/*  时    间:2000年11月04日                                                     */
/********************************************************************************/
void CheckDSP(void)                  
{     
    uchar data i;

    /* 依次检查4片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 = DSPSTATUS;
        m_ucHPILEN = 1;
        
        /* 读DSPSTATUS状态字   */
        ReadFrameHPI();

        /* 判断DSP是否死机       */  
        if(HPIRxVar[0] != 0x55)
        {
            m_bHPIWatchdogFlag = FALSE;
            /* 复位 */
            *(RESET+i) = 0x0; /* b0写入0 */     
        }

        /* 设置HPI读写区间和长度 */
        HPITxVar[0] = 0;
        m_uiHPIAREA = DSPSTATUS;
        m_ucHPILEN = 1;

        /* 复位DSPSTATUS状态字   */
        SendFrameHPI();
    }
    
    if(m_bHPIWatchdogFlag == FALSE)
    {           
        m_ucHPIWatchdogTC++;

        if(m_ucHPIWatchdogTC>2)
        {
            m_ucHPIWatchdogTC = 0;
            m_bHPIWatchdogFlag = TRUE;
            
            /* 清复位   */
            *(RESET+0) = 0x01; /* b0写入1 */     
            *(RESET+1) = 0x01; /* b0写入1 */     
            *(RESET+2) = 0x01; /* b0写入1 */     
            *(RESET+3) = 0x01; /* b0写入1 */     
        }
    }
    else
    {
        m_ucHPIWatchdogTC = 0;
    }

    return;     
}


/********************************************************************************/
/*  函数名称:void SendFrameHPI(void)                                            */
/*  简要描述:通过HPI向各DSP转发命令                                             */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void SendFrameHPI(void)                 
{     
    uchar data i;

    /* 关中断 */
    EX1 = 0;
    
    *(m_pHPI+WRITE+HPIC+BYTE1) = 0x00;      /* 写HPIC第1字节为0,BOB=0   */
    *(m_pHPI+WRITE+HPIC+BYTE2) = 0x00;      /* 写HPIC第2字节为0,BOB=0   */
    *(m_pHPI+WRITE+HPIA+BYTE1) = (m_uiHPIAREA>>8)&0xff;  /* 写HPIA第1字节为写区首地址*/  /* 高字节   */
    *(m_pHPI+WRITE+HPIA+BYTE2) = m_uiHPIAREA&0xff;;         /* 写HPIA第2字节为写区首地址*/  /* 低字节   */
        
    /* 写有效字节   */
    for(i=0; i<=m_ucHPILEN; i++)
    {
        *(m_pHPI+WRITE+HPIDAI+BYTE1) = 0x0;
        *(m_pHPI+WRITE+HPIDAI+BYTE2) = HPITxVar[i];
    }    

    /* 开中断 */
    EX1 = 1;

    return;
}       


/********************************************************************************/
/*  函数名称:void SetDSPINT(void)                                               */
/*  简要描述:通过HPI向各DSP发中断通知                                           */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void SetDSPINT(void)                 
{     
    /* 关中断 */
    EX1 = 0;
    
    /* 发中断通知C549   */
    *(m_pHPI+WRITE+HPIC+BYTE1) = 0x04;    /* 写HPIC第1字节为0,DSPINT=1    */
    *(m_pHPI+WRITE+HPIC+BYTE2) = 0x04;    /* 写HPIC第2字节为0,DSPINT=1    */

    /* 开中断 */
    EX1 = 1;

    return;
}       

/********************************************************************************/
/*  函数名称:void ReadFrameHPI(void)                                            */
/*  简要描述:通过HPI读取DSP消息帧                                               */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void ReadFrameHPI(void)                  
{     
    uchar data temp1,i;

    EX1 = 0;    /* 关中断防止读出错 */

    *(m_pHPI+WRITE+HPIC+BYTE1) = 0x00;      /* 写HPIC第1字节为0,BOB=0   */
    *(m_pHPI+WRITE+HPIC+BYTE2) = 0x00;      /* 写HPIC第2字节为0,BOB=0   */
    *(m_pHPI+WRITE+HPIA+BYTE1) = (m_uiHPIAREA>>8)&0xff;     /* 写HPIA第1字节为写区首地址 */  /* 高字节   */
    *(m_pHPI+WRITE+HPIA+BYTE2) = m_uiHPIAREA&0xff;;       /* 写HPIA第2字节为写区首地址 */  /* 低字节   */
        
    /* 读有效字节   */
    for(i=0; i<=m_ucHPILEN; i++)
    {
        temp1 = *(m_pHPI+READ+HPIDAI+BYTE1);                
        HPIRxVar[i] = *(m_pHPI+READ+HPIDAI+BYTE2);   
    }    
    
    EX1 = 1;    /* 重开中断 */

    return;
}       


/********************************************************************************/
/*  函数名称:void xint1(void)                                                   */
/*  简要描述:HPI接口外部中断1服务程序                                           */
/*                                                                              */
/*  时    间:2000年11月04日                                                     */
/********************************************************************************/
void xint1(void) interrupt 2 using 3    /* use registerbank 3 for interrupt     */
{
    uchar data temp1,temp2,temp3,temp4;
    uchar data i,j;           
    uchar xdata *pHPI;

    /* 依次检查4片DSP是否有发送数据请求   */
    for(i=0; i<4; i++)
    {
        /* 基地址确定   */
        if(i == 0)
        {
            pHPI = HPI1;
        }
        else if(i == 1)
        {
            pHPI = HPI2;
        }
        else if(i == 2)
        {
            pHPI = HPI3;
        }
        else if(i == 3)
        {
            pHPI = HPI4;
        }
        
        *(pHPI+WRITE+HPIC+BYTE1) = 0x0;      /* 写HPIC第1字节为0,BOB=0      */
        *(pHPI+WRITE+HPIC+BYTE2) = 0x0;      /* 写HPIC第2字节为0,BOB=0      */
        temp1 = *(pHPI+READ+HPIC+BYTE1);     /* 读HPIC第1字节                */
        temp2 = *(pHPI+READ+HPIC+BYTE2);     /* 读HPIC第2字节                */
        temp3 = temp2&0x08;                  /* 取HINT位b3                   */
        if(temp3 == 0x08)
        {
            /* 从pHPI口读消息    */
            *(pHPI+WRITE+HPIA+BYTE1) = (AREAREAD>>8)&0xff;  /* 写HPIA第1字节为写区首地址*/  /* 高字节   */
            *(pHPI+WRITE+HPIA+BYTE2) = AREAREAD&0xff;;      /* 写HPIA第2字节为写区首地址*/  /* 低字节   */
        
            /* 读有效字节   */
            for(j=0; j<=BUFSIZE; j++)
            {
                temp4 = *(pHPI+READ+HPIDAI+BYTE1);                
                HPIRxVarA[j] = *(pHPI+READ+HPIDAI+BYTE2);   
            }    

            /* 判断缓冲区是否溢出 */
            if(m_sHPIQue.ucRxPendNum <= HPIRXBUFNUM)
            {       
                if(HPIRxVarA[0] == SOI)
                {
                    HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].ucPID     = HPIRxVarA[1]; 
                    HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].ucLength  = HPIRxVarA[2]%BUFSIZE; 
                    HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].uiType = HPIRxVarA[3]; 
                    HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].uiType = (HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].uiType<<8)|HPIRxVarA[4]; 
                    HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].ucData[0] = HPIRxVarA[5] + i*2;   /* 单元号 */
    
                    /* 读剩余有效字节   */  
                    for(j=6; j<=HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].ucLength; j++)
                    {
                        HPIRxBuf[m_sHPIQue.ucRxPlaceIndex].ucData[j-5] = HPIRxVarA[j];   
                    }
                    
                    /* 调整HPI接口接收指针 */
                    m_sHPIQue.ucRxPlaceIndex++;
                    m_sHPIQue.ucRxPlaceIndex = m_sHPIQue.ucRxPlaceIndex%HPIRXBUFNUM;
                    m_sHPIQue.ucRxPendNum++;
                }
            }

            /* 清中断       */
            *(pHPI+WRITE+HPIC+BYTE1) = 0x08;        /* 写HPIC第1字节,HINT=1        */
            *(pHPI+WRITE+HPIC+BYTE2) = 0x08;        /* 写HPIC第2字节,HINT=1        */
        }
    }

    return;
}

⌨️ 快捷键说明

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