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

📄 hpi.c

📁 单片机和DSP之间的hpi模块程序,实现单片机和dsp的数据传输,单片机是华邦单片机
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -