📄 hpi.c
字号:
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 + -