📄 hpi.c
字号:
bHPI_HCS= 0; //选通
ucByteHigh=HPIInputb(unAddress+0x0100); //读第1个字节(HBIL=0,HR/W=1)
unCounter=0; //查询忙信号
bHPI_RDY=1;
while((!bHPI_RDY)&&(unCounter<1000))
unCounter++;
if(!bHPI_RDY) //出错处理
return(1);
ucByteLow=HPIInputb( unAddress+0x0300); //读第2个字节(HBIL=1,HR/W=1)
bHPI_HCS= 1; //关闭数据后才进行外部数据读写
EA = 1; //开中断
WordData.DataByte.ucDataH=ucByteHigh;
WordData.DataByte.ucDataL=ucByteLow;
*pDataRead= WordData.unData;
return(0);
}
/*************************************************************************
* 函数名称: HPIInit *
* 函数用途: HPI初始化 *
* 输入参数: *
* 无 *
* 输出参数: *
* 无 *
* *
**************************************************************************/
void HPIInit()
{
HPIWordWrite(HPICAdr,HPICByte);
}
/*************************************************************************
* 函数名称: HPIBlockWrite() *
* 函数用途: HPI写数据块 *
* 输入参数: *
* unAddress: 数据块目标开始地址 *
* *DataBuffer :数据块的源开始地址 *
* unLength: 数据块的字节长度(必须为偶数) *
* 输出参数: *
* 错误代码 *
* *
**************************************************************************/
uchar HPIBlockWrite(uint unAddress, uchar *DataBuffer, uint unLength )
{
uint idata unIndex;
uint idata unCounter;
uchar idata ucError;
uchar idata ucByteHigh;
uchar idata ucByteLow;
ucError=HPIWordWrite(HPIAAdr, unAddress-1); //写入数据块的目标开始地址
if(ucError==1) //出错处理
return(1);
EA = 0; //关中断
for(unIndex=0;unIndex<unLength;unIndex++) //连续写数据,不用再写入地址
{
ucByteHigh=*(DataBuffer + unIndex++); //先取数,避免在HPI操作过程中读写外部数据
ucByteLow=*(DataBuffer + unIndex);
bHPI_HCS= 0;
unCounter=0;
bHPI_RDY=1;
while((!bHPI_RDY)&&(unCounter<1000))
unCounter++;
if(!bHPI_RDY)
return(1);
HPIOutputb(HPIIAdr1W)=ucByteHigh; //HPI的自增寄存器
unCounter=0;
bHPI_RDY=1;
while((!bHPI_RDY)&&(unCounter<1000))
unCounter++;
if(!bHPI_RDY)
return(1);
HPIOutputb(HPIIAdr2W)=ucByteLow;
bHPI_HCS= 1;
}
EA = 1; //开中断
return(0);
}
/*************************************************************************
* 函数名称: HPIBlockRead() *
* 函数用途: HPI读数据块 *
* 输入参数: *
* unAddress: 数据块源开始地址 *
* *DataBuffer :数据块的目标开始地址 *
* unLength: 数据块的字节长度(必须为偶数) *
* 输出参数: *
* 错误代码 *
* *
**************************************************************************/
uchar HPIBlockRead(uint unAddress, uchar *DataBuffer, uint unLength )
{
uint idata unCounter;
uint idata unIndex;
uchar idata ucError;
uchar idata ucByteHigh;
uchar idata ucByteLow;
ucError=HPIWordWrite(HPIAAdr, unAddress);
if(ucError==1)
return(1);
EA = 0; //关中断
for(unIndex=0;unIndex<unLength;unIndex++)
{
bHPI_HCS= 0;
unCounter=0;
bHPI_RDY=1;
while((!bHPI_RDY)&&(unCounter<1000))
unCounter++;
if(!bHPI_RDY)
return(1);
ucByteHigh=HPIInputb(HPIIAdr1R); //HPI的自增寄存器
unCounter=0;
bHPI_RDY=1;
while((!bHPI_RDY)&&(unCounter<1000))
unCounter++;
if(!bHPI_RDY)
return(1);
ucByteLow=HPIInputb( HPIIAdr2R);
bHPI_HCS= 1;
*(DataBuffer + unIndex++)=ucByteHigh;
*(DataBuffer + unIndex)=ucByteLow;
}
EA = 1; //开中断
return(0);
}
/*--------------------数据传送函数-----------------------------*/
/*************************************************************************
* 函数名称: MCUMotionWrite() *
* 函数用途: MCU传送输出缓冲区 运动数据 *
* 输入参数: *
* 无 *
* 输出参数: *
* 无 *
* *
**************************************************************************/
void MCUMotionWrite()
{
if(eAlarm!=NoAlarm)
{
if((eAlarm<ParameterError)||(!bDSPStart))
return;
if((eAlarm>=YPLimtP)&&(eAlarm<=ZPLimtN))
{
if(((eAlarm == YPLimtP) && (MCUOutputBuffer.lYIncrement<0))
||((eAlarm == YPLimtN) && (MCUOutputBuffer.lYIncrement>0))
||((eAlarm == ZPLimtP) && (MCUOutputBuffer.lZIncrement<0))
||((eAlarm == ZPLimtN) && (MCUOutputBuffer.lZIncrement>0)))
{
;
}
else
return;
}
}
ProgramEndPoint.lY = CurrentProgramPoint.lY+MCUOutputBuffer.lYIncrement;
ProgramEndPoint.lZ = CurrentProgramPoint.lZ+MCUOutputBuffer.lZIncrement;
ucOutputBufferBusy=OUTPUTBUFFERBUSY;
OperateStateWrite();
MCUOutputBuffer.ucCommandStatus=ucOutputOperateState;
HPIBlockWrite(MCUOutputBufferAddress, (uchar *)&MCUOutputBuffer, 48);
ucOutputBufferBusy=OUTPUTBUFFERREADY;
OperateStateWrite();
}
/*************************************************************************
* 函数名称: MCUIOOutputWrite() *
* 函数用途: MCU传送输出缓冲区 I/O输出 *
* 输入参数: *
* 无 *
* 输出参数: *
* 无 *
* *
**************************************************************************/
void MCUIOOutputWrite()
{
if((eAlarm<ParameterError)||(!bDSPStart))
return;
MCUOutputBuffer.ucMCUOperateMode= ucbOperateMode;
MCUOutputBuffer.ucCommandStatus= ucOutputOperateState;
MCUOutputBuffer.ucF[1]=ucOUTPUT[0];
MCUOutputBuffer.ucF[3]=ucOUTPUT[1];
HPIBlockWrite(IOOutputAddress, &MCUOutputBuffer.ucReserve2, 30);
}
/*************************************************************************
* 函数名称: MCUParameterWrite() *
* 函数用途: MCU传送参数 *
* 输入参数: *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -