📄 hpi.c
字号:
/******************************************************************
* 文件名称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 + -