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

📄 hpi.c

📁 单片机和DSP之间的hpi模块程序,实现单片机和dsp的数据传输,单片机是华邦单片机
💻 C
📖 第 1 页 / 共 4 页
字号:
/******************************************************************
*   文件名称HPI . c                                                                                   *
*   文件用途: HPI通信模块                                                                 *
*                                                                                                                  *
*                                                                                                                  *
*                                                                                                                  *
*******************************************************************/

#include "Public.h"
#include "W79E532.h"
#include "Parameter.h"
#include <absacc.h>

/*===================寄存器地址=============================*/
#define HPICAdr        0xF000    //HPI控制寄存器HPIC
#define HPIIAdr1W    0xF400    //HPI地址寄存器HPIIA(自增)第一个字节写
#define HPIIAdr1R     0xF500    //HPI地址寄存器HPIIA(自增)第一个字节读
#define HPIIAdr2W    0xF600    //HPI地址寄存器HPIIA(自增)第二个字节写
#define HPIIAdr2R     0xF700    //HPI地址寄存器HPIIA(自增)第二个字节读
#define HPIAAdr        0xF800   //HPI地址寄存器HPIA
#define HPIDAdr        0xFC00    //HPI数据寄存器HPID

/*===================DSPDRAM地址=============================*/
#define  MCUOutputBufferAddress     0x0088  // 输出缓冲区首地址(32字节)
#define  MCUInputBufferAddress       0x0300  // 输入缓冲区首地址(36字节)
#define  FastMultipleAddress            0x00B4  //快速倍率地址
#define  FeedMultipleAddress           0x00B5  
#define  HWMultipleAddress              0x00B6  
#define  IOOutputAddress                  0x009B  //输出缓冲区I/O的首地址
#define  OperateStateAddress           0x0080  //工作状态字地址
#define  MCUParameterAddress         0x00AA  // 参数缓冲区首地址(98字节)
#define  YPitchOffsetAddress             0x0100  // 参数缓冲区首地址(512字节)
#define  ZPitchOffsetAddress             0x0200  // 参数缓冲区首地址(512字节)
#define  HandShakeAddress               0x0082  // 握手字节区间首地址(8字节)
#define  PLCProgramAddress             0x0400  // PLC程序空间的首地址(600*3字节)
#define  PLCDiagnoseSignelAddress  0x0380  
#define  ActualFeedrateAddress        0x0329  
#define  YHomeGrindAddress             0x031C  
#define  ZHomeGrindAddress             0x031D 
#define  YZeroOffsetAddress             0x031E 
#define  ZZeroOffsetAddress             0x031F  
#define  RadiasFeedBackAddress      0x0322  

/*===================控制字============================*/
#define HPICByte                0xE8E8                                //HPI控制字,第1个字节为高字节
#define HPIOutputb(Adr)    XBYTE[Adr]
#define HPIInputb(Adr)      XBYTE[Adr]


/*====================子函数声明=======================*/
/*------------------基本操作函数-----------------------------*/
void   HPIInit();
uchar  HPIWordWrite(uint unAddress, uint unDataWrite);                                //HPI写入1个字  
uchar   HPIWordRead(uint unAddress, uint *pDataRead);                               //HPI读出1个字
uchar   HPIBlockWrite(uint unAddress, uchar *DataBuffer, uint unLength );   //HPI写入数据块
uchar   HPIBlockRead(uint unAddress, uchar *DataBuffer, uint unLength );   //HPI读出数据块
uchar  HPITwoByteWrite(uint unAddress, uchar * pDataWrite);
uchar   HPITwoByteRead(uint unAddress, uchar *pDataRead);

/*--------------------数据传送函数-----------------------------*/
void MCUMotionWrite();
void MCUIOOutputWrite() ;
void MCUInputRead();   
void OperateStateRead() ;
void OperateStateWrite() ;
void  FeedMultipleWrite();
void  FastMultipleWrite();
void  HWMultipleWrite() ;
void MCUParameterWrite() ;  
void  PitchOffsetWrite(); 
void PLCDiagnoseSignelRead();  
//void ActualFeedrateRead();
void YHomeGridRead();
void ZHomeGridRead();
void ZeroOffsetRead();
void RadiasRead();
uchar PLCProgramWrite();
uchar HandShakeRead();
void  HandShakeWrite(uchar ucByteHigh,uchar ucByteLow);

/*====================控制信号=======================*/
sbit bHPI_HCS  = P1^0;           //HPI接口选通信号
sbit bHPI_RDY  = P1^1;           //HPI接口Ready信号
sbit bDSPReset = P1^4;           //DSP复位信号


/*====================函数实体=======================*/

/*------------------基本操作函数-----------------------------*/

/******************************************************************************
*   函数名称: HPITwoByteWrite()                                                                                            *
*   函数用途: HPI写入2个字节                                                                                      *
*   输入参数:                                                                                                                  *
*			       unAddress:目标地址			                                                                *
*                         * pDataWrite   :数据指针                                                                                          *
*   输出参数:                                                                                                                  *  
*                            错误代码                                                                                                           *
*******************************************************************************/
uchar  HPITwoByteWrite(uint unAddress, uchar * pDataWrite)
{
    uint    idata unCounter;
    uchar idata ucByteHigh;
    uchar idata ucByteLow;
   
    ucByteHigh=*pDataWrite;
    ucByteLow=*(pDataWrite+1);

    EA = 0;                                   //关中断 
 
    bHPI_HCS= 0;                                                                                               //选通                              
    HPIOutputb(unAddress)=ucByteHigh;                                          //写第1个字节(HBIL=0,HR/W=0)
    
    unCounter=0;                                               //查询忙信号
    bHPI_RDY=1;                                             //I/O引脚置高,准备读I/O引脚
    while((!bHPI_RDY)&&(unCounter<1000))     
      unCounter++;
    if(!bHPI_RDY)                                         //出错处理
      return(1);

    HPIOutputb(unAddress+0x0200)=ucByteLow;                                   //写第2个字节(HBIL=1,HR/W=0)

    bHPI_HCS= 1;                                           //关闭数据
    
   EA = 1;                                   //开中断   	

    return(0);
  
}


/******************************************************************************
*   函数名称: HPIWordWrite()                                                                                            *
*   函数用途: HPI写入1个字                                                                                      *
*   输入参数:                                                                                                                  *
*			       unAddress:目标地址			                                                                *
*                         unData   :数据                                                                                          *
*   输出参数:                                                                                                                  *  
*                          错误代码                                                                                                                *
*******************************************************************************/
uchar  HPIWordWrite(uint unAddress, uint unDataWrite)
{
    uint    idata unCounter;
    uchar idata ucByteHigh;
    uchar idata ucByteLow;
    union UINTandBYTE idata  WordData;
	
    WordData.unData=unDataWrite;

    ucByteHigh=WordData.DataByte.ucDataH;
    ucByteLow=WordData.DataByte.ucDataL;

    EA = 0;                                   //关中断 
    
    bHPI_HCS= 0;                                                                                               //选通                              
    
    HPIOutputb(unAddress)=ucByteHigh;                                          //写第1个字节(HBIL=0,HR/W=0)
    
    unCounter=0;                                               //查询忙信号
    bHPI_RDY=1;                                             //I/O引脚置高,准备读I/O引脚
    while((!bHPI_RDY)&&(unCounter<1000))     
      unCounter++;
    if(!bHPI_RDY)                                         //出错处理
      return(1);

    HPIOutputb(unAddress+0x0200)=ucByteLow;                                   //写第2个字节(HBIL=1,HR/W=0)
                                                                                              
    bHPI_HCS= 1;                                           //关闭数据
    
   EA = 1;                                   //开中断   
   
    return(0);
  
}


/*************************************************************************
*   函数名称: HPITwoByteRead()                                                                              *                         
*   函数用途: HPI读出2个字节                                                                      *
*   输入参数:                                                                                                        *
*			       ucAddress:目标地址			                                                      *
*                                 *pDataRead:数据指针                                                                                *
*   输出参数:                                                                                                        *  
*                          错误代码                                                                                                      *
*                                                                                                                                 *
**************************************************************************/
uchar   HPITwoByteRead(uint unAddress, uchar *pDataRead)
{
    uint    idata unCounter;
    uchar idata ucByteHigh;
    uchar idata ucByteLow;

    EA = 0;                                   //关中断 
    
    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;                                          //关闭数据后才进行外部数据读写

   *pDataRead=ucByteHigh;
   *(pDataRead+1)=ucByteLow;
      
   EA = 1;                                   //开中断   
   
    return(0);
  
}

/*************************************************************************
*   函数名称: HPIWordRead()                                                                                  *                         
*   函数用途: HPI读出1个字                                                                            *
*   输入参数:                                                                                                        *
*			       ucAddress:目标地址			                                                      *
*                                 *pDataRead:数据指针                                                                                *
*   输出参数:                                                                                                        *  
*                          错误代码                                                                                                    *
*                                                                                                                                 *
**************************************************************************/
uchar   HPIWordRead(uint unAddress, uint *pDataRead)
{
    uint    idata unCounter;
    uchar idata ucByteHigh;
    uchar idata ucByteLow;
    union UINTandBYTE idata  WordData;

    EA = 0;                                   //关中断 
    

⌨️ 快捷键说明

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