optical/EMBOS/Users/EmbBase/embfpga.c
2025-09-04 09:45:08 +08:00

1417 lines
27 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#define _IN_EMBFPGA_C
#include "embfpga.h"
//----------------------------------------------------------------------------
#include "corefmc.h"
#include "inout.h"
#include "shell.h"
//----------------------------------------------------------------------------
void TestFPGA(char * para1, char * para2);
//----------------------------------------------------------------------------
// 初始化FPGA
void InitEmbFpga(void)
{
int hardver = GetFpgaHardVersion();
printf("\r\nFPGA Hard Version = Ver %x.%x \r\n", (hardver&0xff00)>>8,(hardver&0x00ff));
int softver = GetFpgaSoftVersion();
printf("\r\nFPGA Soft Version = Ver %x.%x \r\n", (softver&0xff00)>>8,(softver&0x00ff));
SetExoutEnOn(); // 输出允许
//AddShellCmd("FPGA", "test rw fpga", TestFPGA);
}
//----------------------------------------------------------------------------
// 读端口
// 读取硬件版本
u16 GetFpgaHardVersion(void)
{
static u16 hardver = 0;
if ((hardver == 0) || (hardver == 0xffff))
{// 上电后只从FPGA中读一次
hardver = FmcReadReg(FPGA_HARD_VERSION);
}
return hardver;
}
// 读取软件版本
u16 GetFpgaSoftVersion(void)
{
static u16 softver = 0;
if ((softver == 0) || (softver == 0xffff))
{// 上电后只从FPGA中读一次
softver = FmcReadReg(FPGA_SOFT_VERSION);
}
return softver;
}
// 得到虚轴运行状态
u16 GetRunStatus(void)
{
SetVAxisConfig(VCTR_LOCK); // 锁存
return FmcReadReg(VAXIS_STATUS);
}
// 得到虚轴表状态
u16 GetRunStatus1(void)
{
return FmcReadReg(VAXIS_STATUS1);
}
// 得到输入端口中断信息
u16 GetInputIntFlags(void)
{
return (FmcReadReg(INPUT_INT_FLAGS) & INPUT_INT_MASK);
}
// 得到编码器中断信息
u16 GetEcdIntFlags(void)
{
return (FmcReadReg(ECD_INT_FLAGS) & ECD_INT_MASK);
}
// 读取虚轴1的运行频率
u32 GetVAxis1PPS(void)
{
u32 freq;
SetVAxisConfig(VCTR_LOCK); // 锁存
freq = FmcReadReg(CUR_VAXIS1_PPS_H); // 高字
freq <<= 16;
freq += FmcReadReg(CUR_VAXIS1_PPS_L); // 低字
return freq;
}
// 读取虚轴的运行频率
// vaxisId: VAXIS_ID1
u32 GetVAxisPPS(u16 vaxisId)
{
assert_param(IS_VAXIS_ID(vaxisId));
switch (vaxisId)
{
case VAXIS_ID1:
return GetVAxis1PPS();
default:
return 0;
}
}
// 读取上一个表结束时的虚轴频率
u32 GetLastVAxisFrequency(u16 vaxisId)
{
u32 freq;
assert_param(vaxisId == VAXIS_ID1);
if (vaxisId == VAXIS_ID1)
{
freq = FmcReadReg(VAXIS1_END_FREQUENCY_H); // 高字
freq <<= 16;
freq += FmcReadReg(VAXIS1_END_FREQUENCY_L); // 低字
}
else
{
freq = 0;
}
return freq;
}
// 读取虚轴1的计数值
u32 GetVAxis1Counter(void)
{
u32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_VAXIS1_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_VAXIS1_COUNTER_L); // 低字
return Counter;
}
// 读取虚轴的计数值
// vaxisId: VAXIS_ID1
u32 GetVAxisCounter(u16 vaxisId)
{
assert_param(IS_VAXIS_ID(vaxisId));
switch (vaxisId)
{
case VAXIS_ID1:
return GetVAxis1Counter();
default:
return 0;
}
}
// 读取实轴1计数器值
s32 GetAxis1Counter(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_AXIS1_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_AXIS1_COUNTER_L); // 低字
return Counter;
}
// 读取实轴2计数器值
s32 GetAxis2Counter(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_AXIS2_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_AXIS2_COUNTER_L); // 低字
return Counter;
}
// 读取实轴3计数器值
s32 GetAxis3Counter(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_AXIS3_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_AXIS3_COUNTER_L); // 低字
return Counter;
}
// 读取实轴4计数器值
s32 GetAxis4Counter(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_AXIS4_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_AXIS4_COUNTER_L); // 低字
return Counter;
}
// 读取实轴5计数器值
s32 GetAxis5Counter(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_AXIS5_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_AXIS5_COUNTER_L); // 低字
return Counter;
}
// 读取实轴6计数器值
s32 GetAxis6Counter(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_AXIS6_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_AXIS6_COUNTER_L); // 低字
return Counter;
}
// 读取实轴计数器值
// axisId: AXIS_ID1 ~ AXIS_ID6
s32 GetAxisCounter(u16 axisId)
{
assert_param(IS_AXIS_ID(axisId));
switch (axisId)
{
case AXIS_ID1:
return GetAxis1Counter();
case AXIS_ID2:
return GetAxis2Counter();
case AXIS_ID3:
return GetAxis3Counter();
case AXIS_ID4:
return GetAxis4Counter();
case AXIS_ID5:
return GetAxis5Counter();
case AXIS_ID6:
return GetAxis6Counter();
default:
return -1;
}
}
// 得到编码器1的数值
s32 GetEcd1Value(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_ECD1_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_ECD1_COUNTER_L); // 低字
return Counter;
}
// 得到编码器2的数值
s32 GetEcd2Value(void)
{
s32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_ECD2_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_ECD2_COUNTER_L); // 低字
return Counter;
}
// 得到编码器的数值
// ecdId: ECD_SEL1 ~ ECD_SEL2
s32 GetEcdCounter(u16 ecdId)
{
assert_param(IS_ECD_SEL(ecdId));
switch (ecdId)
{
case ECD_SEL1:
return GetEcd1Value();
case ECD_SEL2:
return GetEcd2Value();
default:
return -1;
}
}
// 读取OP计数器值
u32 GetOPCounter(void)
{
u32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_OP_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_OP_COUNTER_L); // 低字
return Counter;
}
// 读取ZP计数器值
u32 GetZPCounter(void)
{
u32 Counter;
SetVAxisConfig(VCTR_LOCK); // 锁存
Counter = FmcReadReg(CUR_ZP_COUNTER_H); // 高字
Counter <<= 16;
Counter += FmcReadReg(CUR_ZP_COUNTER_L); // 低字
return Counter;
}
// 得到实轴报警信息
u16 GetAlarmValue(void)
{
return (FmcReadReg(AXIS_ALM_STATUS) & AXIS_ALM_MASK);
}
// 得到编码器信号状态
u16 GetEcdStatus(void)
{
return (FmcReadReg(ECD_SIGNAL_STATUS) & ECD_STA_MASK);
}
// 得到输入信号状态
u16 GetInputStatus(void)
{
return (FmcReadReg(INPUT_STATUS));
}
//----------------------------------------------------------------------------
// 写端口
// 设置虚轴配置
void SetVAxisConfig(u16 cfg)
{
assert_param(IS_VAXIS_CMD(cfg));
FmcWriteReg(VAXIS_CONTROL, cfg);
}
// 功能: 清除FPGA中断
void CleanAllIntFlag(void)
{
SetVAxisConfig(VCTR_INPUT_ALM_INT); // 清除input中断标志
SetVAxisConfig(VCTR_ZP1_INT); // 编码器1:清除ZP1中断标志
SetVAxisConfig(VCTR_ZP2_INT); // 编码器2:清除ZP1中断标志
SetVAxisConfig(VCTR_VAXIS1_CLEAN_OV1); // 虚轴1清除表1完成中断标志
SetVAxisConfig(VCTR_VAXIS1_CLEAN_OV2); // 虚轴1清除表2完成中断标志
}
// 启动虚轴运动
int StartVAxisRun(VAxisCmdStr * pCmd)
{
u32 addr;
if (pCmd == NULL)
{
return -1;
}
assert_param(IS_VAXIS_ID(pCmd->vaxisId));
assert_param(IS_BUF_SEL(pCmd->bufSel));
if (pCmd->vaxisId == VAXIS_ID1) // 虚轴1
{
if (pCmd->bufSel == BUF_SEL1)
{
SetVAxisConfig(VCTR_VAXIS1_DIS_BUF1);
addr = VAXIS1_BUF1_PARA;
}
else if (pCmd->bufSel == BUF_SEL2)
{
SetVAxisConfig(VCTR_VAXIS1_DIS_BUF2);
addr = VAXIS1_BUF2_PARA;
}
else if (pCmd->bufSel == BUF_SEL3)
{
SetVAxisConfig(VCTR_VAXIS1_DIS_BUF3);
addr = VAXIS1_BUF3_PARA;
}
else
{
return -1;
}
}
else
{
return -1;
}
if ((pCmd->vaxisId == VAXIS_ID1) || // 虚轴1
0 )
{
if (pCmd->calcGap > MAX_GAP)
{
// printf("calcGap=%d > MAX_GAP\r\n", pCmd->calcGap);
pCmd->calcGap = MAX_GAP;
}
else if (pCmd->calcGap < MIN_GAP)
{
// printf("calcGap=%d < MIN_GAP\r\n", pCmd->calcGap);
pCmd->calcGap = MIN_GAP;
}
if (pCmd->startPPS > MAX_PPS)
{
printf("startPPS=%d > MAX_PPS\r\n", pCmd->startPPS);
pCmd->startPPS = MAX_PPS;
}
else if (pCmd->startPPS < MIN_PPS)
{
printf("startPPS=%d < MIN_PPS\r\n", pCmd->startPPS);
pCmd->startPPS = MIN_PPS;
return -1; // 修改防止运动太慢,认为死机
}
if (pCmd->runPPS > MAX_PPS)
{
printf("runPPS=%d > MAX_PPS\r\n", pCmd->runPPS);
pCmd->runPPS = MAX_PPS;
}
else if (pCmd->runPPS < MIN_PPS)
{
printf("runPPS=%d < MIN_PPS\r\n", pCmd->runPPS);
pCmd->runPPS = MIN_PPS;
return -1; // 修改防止运动太慢,认为死机
}
FmcWriteReg(addr, LOWORD(pCmd->calcGap));
FmcWriteReg(addr, HIWORD(pCmd->calcGap)); // 计算时间间隔1/72 us 为单位
FmcWriteReg(addr, LOWORD(pCmd->startPPS));
FmcWriteReg(addr, HIWORD(pCmd->startPPS)); // 启动频率单位pps
FmcWriteReg(addr, LOWORD(pCmd->runPPS));
FmcWriteReg(addr, HIWORD(pCmd->runPPS)); // 目标频率单位pps
if (pCmd->bufSel != BUF_SEL3)
{
assert_param(pCmd->outNum <= MAX_OUTNUM);
assert_param(pCmd->outNum >= MIN_OUTNUM);
assert_param(pCmd->jumpNum <= MAX_OUTNUM);
FmcWriteReg(addr, LOWORD(pCmd->outNum));
FmcWriteReg(addr, HIWORD(pCmd->outNum)); // 本次输出虚轴脉冲个数,单位个
FmcWriteReg(addr, LOWORD(pCmd->jumpNum));
FmcWriteReg(addr, HIWORD(pCmd->jumpNum)); // 变速跳过虚轴脉冲个数
FmcWriteReg(addr, VOK_FLAG); // OK
}
else
{
FmcWriteReg(addr, VOK_FLAG);
}
// 虚轴运行
if (pCmd->vaxisId == VAXIS_ID1)
{
// printf("vaxis 1 run cmd\r\n");
SetVAxisConfig(VCTR_VAXIS1_RUN);
}
else
{
}
}
else
{
return -1;
}
return 0;
}
// 虚轴:停止当前运动
int StopVAxisRun(u16 vaxisId)
{
assert_param(IS_VAXIS_ID(vaxisId));
//虚轴停止
if (vaxisId == VAXIS_ID1 || vaxisId == VAXIS_ID_ALL)
{
SetVAxisConfig(VCTR_VAXIS1_STOP);
SetVAxisConfig(VCTR_VAXIS1_CLEAN_OV1);
SetVAxisConfig(VCTR_VAXIS1_CLEAN_OV2);
SetVAxisConfig(VCTR_VAXIS1_DIS_BUF1);
SetVAxisConfig(VCTR_VAXIS1_DIS_BUF2);
SetVAxisConfig(VCTR_VAXIS1_DIS_BUF3);
}
return 0;
}
// 虚轴:速度解除速度临时控制
void StopSpdCtrl(u16 vaxisId)
{
assert_param(IS_VAXIS_ID(vaxisId));
if (vaxisId == VAXIS_ID1 || vaxisId == VAXIS_ID_ALL)
{
SetVAxisConfig(VCTR_VAXIS1_DIS_BUF3);
}
}
// 编码器的数值清零
// ecdId: ECD_SEL1 ~ ECD_SEL2
void ClearEcdCounter(u16 ecdId)
{
assert_param(IS_ECD_SEL(ecdId));
switch (ecdId)
{
case ECD_SEL1:
SetVAxisConfig(VCTR_ECD1_CLEAR);
break;
case ECD_SEL2:
SetVAxisConfig(VCTR_ECD2_CLEAR);
break;
default:
break;
}
}
void ReetEcdABZLevel(u16 ecdId)
{
switch (ecdId)
{
case ECD_SEL1:
SetVAxisConfig(VCTR_ECD1_LEVEL_RST);
break;
case ECD_SEL2:
SetVAxisConfig(VCTR_ECD1_LEVEL_RST);
break;
default:
break;
}
}
void SetEcdAPLevelNegative(u16 ecdId)
{
switch (ecdId)
{
case ECD_SEL1:
SetVAxisConfig(VCTR_AP1_LEVEL_NEG);
break;
case ECD_SEL2:
SetVAxisConfig(VCTR_AP2_LEVEL_NEG);
break;
default:
break;
}
}
void SetEcdAZLevelNegative(u16 ecdId)
{
switch (ecdId)
{
case ECD_SEL1:
SetVAxisConfig(VCTR_AZ1_LEVEL_NEG);
break;
case ECD_SEL2:
SetVAxisConfig(VCTR_AZ2_LEVEL_NEG);
break;
default:
break;
}
}
void SetEcdZPLevelNegative(u16 ecdId)
{
switch (ecdId)
{
case ECD_SEL1:
SetVAxisConfig(VCTR_ZP1_LEVEL_NEG);
break;
case ECD_SEL2:
SetVAxisConfig(VCTR_ZP2_LEVEL_NEG);
break;
default:
break;
}
}
// OP输出
void SetOpOutOn(void)
{
SetVAxisConfig(VCTR_OPOS_ON);
}
void SetOpOutOff(void)
{
SetVAxisConfig(VCTR_OPOS_NONE);
}
void SetZpOutOn(void)
{
SetVAxisConfig(VCTR_ZPOS_ON);
}
void SetZpOutOff(void)
{
SetVAxisConfig(VCTR_ZPOS_NONE);
}
// 设置报警命令
void SetAxisAlarmConfig(u16 axisId, u16 alm)
{
assert_param(IS_AXIS_ID(axisId));
SetVAxisConfig(MAKE_VCTR_AXIS_ALM_CMD(axisId,alm));
}
//--------------------------------------------------------------------------------------------------------------
// 设置OP输出的分频系数
void SetOpDivision(u16 div)
{
if (div != OP_OUT_DIRECT)
{
div &= 0xFFFE;
}
FmcWriteReg(OP_OUT_DIVISION, div);
}
// 设置OP计数值
void SetOpCounter(s32 cnt)
{
FmcWriteReg(OP_COUNTER_SET_L, LOWORD(cnt));
FmcWriteReg(OP_COUNTER_SET_H, HIWORD(cnt));
}
// 设置ZP计数值
void SetZpCounter(s32 cnt)
{
FmcWriteReg(ZP_COUNTER_SET_L, LOWORD(cnt));
FmcWriteReg(ZP_COUNTER_SET_H, HIWORD(cnt));
}
void SetEcd1Counter(s32 cnt)
{
FmcWriteReg(ECD1_COUNTER_SET_L, LOWORD(cnt));
FmcWriteReg(ECD1_COUNTER_SET_H, HIWORD(cnt));
}
void SetEcd2Counter(s32 cnt)
{
FmcWriteReg(ECD2_COUNTER_SET_L, LOWORD(cnt));
FmcWriteReg(ECD2_COUNTER_SET_H, HIWORD(cnt));
}
// 设置编码器计数值
void SetEcdCounter(u16 ecdId, s32 cnt)
{
assert_param(IS_ECD_SEL(ecdId));
switch(ecdId)
{
case ECD_SEL1:
{
SetEcd1Counter(cnt);
break;
}
case ECD_SEL2:
{
SetEcd2Counter(cnt);
break;
}
default:
break;
}
}
// 设置输入端口中断配置
void SetInputInt(u16 cfg)
{
FmcWriteReg(INPUT_INT_SET, cfg);
}
#define MAX_OUTPUT_NUM 8
u16 g_outputValue = 0;
void Output1On(void)
{
g_outputValue |= OUTPUT1_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output1Off(void)
{
g_outputValue &= (~OUTPUT1_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output2On(void)
{
g_outputValue |= OUTPUT2_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output2Off(void)
{
g_outputValue &= (~OUTPUT2_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output3On(void)
{
g_outputValue |= OUTPUT3_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output3Off(void)
{
g_outputValue &= (~OUTPUT3_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output4On(void)
{
g_outputValue |= OUTPUT4_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output4Off(void)
{
g_outputValue &= (~OUTPUT4_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output5On(void)
{
g_outputValue |= OUTPUT5_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output5Off(void)
{
g_outputValue &= (~OUTPUT5_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output6On(void)
{
g_outputValue |= OUTPUT6_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output6Off(void)
{
g_outputValue &= (~OUTPUT6_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output7On(void)
{
g_outputValue |= OUTPUT7_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output7Off(void)
{
g_outputValue &= (~OUTPUT7_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output8On(void)
{
g_outputValue |= OUTPUT8_BIT;
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
void Output8Off(void)
{
g_outputValue &= (~OUTPUT8_BIT);
FmcWriteReg(OUTPUT_SET, g_outputValue);
}
// 得到某个输出口状态
u8 GetOutputVal(int num)
{
if (num > 0 && num <= MAX_OUTPUT_NUM)
{
u16 mod = 0x01;
mod <<= (num-1);
if ((g_outputValue & mod) != 0)
{
return SENSOR_ON;
}
else
{
return SENSOR_OFF;
}
}
return SENSOR_OFF;
}
//-------------------------------------------------------------
// 设置实轴输出配置
void SetAxisConfig(u16 axisId, u16 cfg)
{
assert_param(IS_AXIS_ID(axisId));
assert_param(IS_AXIS_CMD(cfg));
FmcWriteReg(AXIS_CONFIG(AXIS(axisId)), cfg);
}
u32 GetSineNums(u16 sineout, u16* pBuffer, u32 num)
{
u32 sinenum, temp;
sinenum = 0;
if (sineout != 0)
{
while(num != 0)
{
temp = (*pBuffer) & 0x7fff;
sinenum += temp;
//temp = (u32)(temp * SINE_MUTI + 0.5);
temp = (u32)(temp * SINE_MUTI + 0.999f); // 20220407 ljs 李帅 王春刚 修改,修复在走少量脉冲时丢脉冲的现象
if (temp > 0x7fff)
{
printf("sine calc error\r\n");
sinenum += 0x100000; // 返回大于 0xfffff 的数,以便在调用函数中报错
}
*pBuffer &= 0x8000;
*pBuffer |= (temp & 0x7fff);
num--;
pBuffer++;
}
}
return sinenum;
}
// 写插补数据
// 返回值: 0:正常
// -1输入参数错误
// -2保留,不允许使用
// -3fpga 读写错误
// -4FPGA 版本错误
int WriteInterData(InterData * pCmd)
{
u32 sineNum;
if (pCmd == NULL)
{
printf("para is empty in WriteInterData\r\n");
return -1;
}
assert_param(IS_VAXIS_ID(pCmd->vaxisId));
assert_param(IS_AXIS_ID(pCmd->axisId));
assert_param(IS_BUF_SEL(pCmd->bufSel));
assert_param(pCmd->datBufLen < MAX_SEGMENT_PER_BUF);
assert_param(pCmd->datBufLen > 0);
assert_param(pCmd->startEscNum <= MAX_OUTNUM);
assert_param(pCmd->partVxNum <= MAX_OUTNUM);
assert_param(pCmd->partVxNum >= MIN_OUTNUM);
// 选择虚轴
switch (pCmd->vaxisId)
{
case VAXIS_ID1:
SetAxisConfig((pCmd->axisId), POUT_ENABLE_VAXIS1); // 脉冲输出允许:输入时钟为虚轴1
break;
case VAXIS_ECD:
SetAxisConfig((pCmd->axisId), POUT_ENABLE_ECD); // 脉冲输出允许:输入为编码器接口
break;
default:
SetAxisConfig((pCmd->axisId), POUT_DISABLE); // 脉冲输出禁止√
break;
}
sineNum = GetSineNums(pCmd->sineOut, pCmd->datBuff, pCmd->datBufLen);
// 配置实轴参数
if (pCmd->bufSel == BUF_SEL1)
{
// printf("\r\nwrite buff 1\r\n");
SetAxisConfig((pCmd->axisId), DIS_INTER_BUF1); // 清空表
// 正弦输出模式
FmcWriteReg(AXIS_BUF1_SINE_OUT(AXIS(pCmd->axisId)), (u16)(sineNum & 0xffff)); // 写入正弦数据低位
FmcWriteReg(AXIS_BUF1_SINE_OUT_H(AXIS(pCmd->axisId)), (u16)(sineNum>>16)); // 写入正弦数据高位
FmcWriteConstBuf(INTER_BUF1_DATA(AXIS(pCmd->axisId)), pCmd->datBuff, pCmd->datBufLen); // 写入数据
FmcWriteReg(INTER_BUF1_PARA(AXIS(pCmd->axisId)), LOWORD(pCmd->startEscNum)); // 起始跳过实轴脉冲数
FmcWriteReg(INTER_BUF1_PARA(AXIS(pCmd->axisId)), HIWORD(pCmd->startEscNum));
FmcWriteReg(INTER_BUF1_PARA(AXIS(pCmd->axisId)), LOWORD(pCmd->partVxNum)); // 每段对应虚轴脉冲数
FmcWriteReg(INTER_BUF1_PARA(AXIS(pCmd->axisId)), HIWORD(pCmd->partVxNum));
FmcWriteReg(INTER_BUF1_PARA(AXIS(pCmd->axisId)), LOWORD(pCmd->dirAttr)); // 实轴脉冲输出方向
FmcWriteReg(INTER_BUF1_PARA(AXIS(pCmd->axisId)), HIWORD(pCmd->dirAttr));
FmcWriteReg(INTER_BUF1_PARA(AXIS(pCmd->axisId)), VOK_FLAG);
}
else if (pCmd->bufSel == BUF_SEL2)
{
// printf("\r\nwrite buff 2\r\n");
SetAxisConfig((pCmd->axisId), DIS_INTER_BUF2); // 清空表
// 正弦输出模式
FmcWriteReg(AXIS_BUF2_SINE_OUT(AXIS(pCmd->axisId)), (u16)(sineNum & 0xffff)); // 写入正弦数据低位
FmcWriteReg(AXIS_BUF2_SINE_OUT_H(AXIS(pCmd->axisId)), (u16)(sineNum>>16)); // 写入正弦数据高位
FmcWriteConstBuf(INTER_BUF2_DATA(AXIS(pCmd->axisId)), pCmd->datBuff, pCmd->datBufLen); // 写入数据
FmcWriteReg(INTER_BUF2_PARA(AXIS(pCmd->axisId)), LOWORD(pCmd->startEscNum)); // 起始脉冲数
FmcWriteReg(INTER_BUF2_PARA(AXIS(pCmd->axisId)), HIWORD(pCmd->startEscNum));
FmcWriteReg(INTER_BUF2_PARA(AXIS(pCmd->axisId)), LOWORD(pCmd->partVxNum)); // 每段脉冲数
FmcWriteReg(INTER_BUF2_PARA(AXIS(pCmd->axisId)), HIWORD(pCmd->partVxNum));
FmcWriteReg(INTER_BUF2_PARA(AXIS(pCmd->axisId)), LOWORD(pCmd->dirAttr)); // 方向属性
FmcWriteReg(INTER_BUF2_PARA(AXIS(pCmd->axisId)), HIWORD(pCmd->dirAttr));
FmcWriteReg(INTER_BUF2_PARA(AXIS(pCmd->axisId)), VOK_FLAG);
}
else
{
printf("bufSel = %d, error\r\n", pCmd->bufSel);
return -1;
}
return 0;
}
void CleanAxisBuff(u16 axisId, u16 bufSel)
{
assert_param(IS_AXIS_ID(axisId));
assert_param(IS_BUF_SEL(bufSel));
if (bufSel == BUF_SEL1)
{
// printf("clean axis %d buff 1\r\n", axisId);
SetAxisConfig(axisId, DIS_INTER_BUF1); // 清空表
FmcWriteConstBuf(INTER_BUF1_DATA(AXIS(axisId)), NULL, 0); // 写入空数据
}
else if (bufSel == BUF_SEL2)
{
// printf("clean axis %d buff 2\r\n", axisId);
SetAxisConfig(axisId, DIS_INTER_BUF2); // 清空表
FmcWriteConstBuf(INTER_BUF2_DATA(AXIS(axisId)), NULL, 0); // 写入空数据
}
}
// 设置实轴计数器初值
void SetAxisCounter(u16 axisId, s32 cnt)
{
assert_param(IS_AXIS_ID(axisId));
FmcWriteReg(AXIS_COUNTER_L(AXIS(axisId)), LOWORD(cnt));
FmcWriteReg(AXIS_COUNTER_H(AXIS(axisId)), HIWORD(cnt));
}
// 设置轴PWM分频系数
void SetAxisPwmFreq(u16 axisId, u16 freq)
{
assert_param(IS_AXIS_PWM_ID(axisId));
assert_param(IS_AXIS_PWM_FREQ(freq));
FmcWriteReg(AXIS_PWM_FREQ(AXIS(axisId)), freq);
}
// 设置轴PULSE的PWM值
void SetAxisPulsePwm(u16 axisId, u16 val)
{
if (val > FPGA_PWM_MAX_VAL)
{
val = FPGA_PWM_MAX_VAL;
}
assert_param(IS_AXIS_PWM_ID(axisId));
assert_param(IS_AXIS_PWM_VAL(val));
FmcWriteReg(AXIS_PULSE_PWM(AXIS(axisId)), val);
}
// 设置轴SIGN的PWM值
void SetAxisSignPwm(u16 axisId, u16 val)
{
if (val > FPGA_PWM_MAX_VAL)
{
val = FPGA_PWM_MAX_VAL;
}
assert_param(IS_AXIS_PWM_ID(axisId));
assert_param(IS_AXIS_PWM_VAL(val));
FmcWriteReg(AXIS_SIGN_PWM(AXIS(axisId)), val);
}
//--------------------------------------------------------------------
typedef void (*InputIntProc)(void);
InputIntProc g_inputIntProcAry[16] = {NULL};
void RegInputIntProc(u16 intcfg, void(*inputProc)(void))
{
static u16 intconfig = 0;
if (intcfg == INPUT1_INT_EN)
{
g_inputIntProcAry[0] = inputProc;
}
else if (intcfg == INPUT2_INT_EN)
{
g_inputIntProcAry[1] = inputProc;
}
else if (intcfg == INPUT3_INT_EN)
{
g_inputIntProcAry[2] = inputProc;
}
else if (intcfg == INPUT4_INT_EN)
{
g_inputIntProcAry[3] = inputProc;
}
else if (intcfg == INPUT5_INT_EN)
{
g_inputIntProcAry[4] = inputProc;
}
else if (intcfg == INPUT6_INT_EN)
{
g_inputIntProcAry[5] = inputProc;
}
else if (intcfg == INPUT7_INT_EN)
{
g_inputIntProcAry[6] = inputProc;
}
else if (intcfg == INPUT8_INT_EN)
{
g_inputIntProcAry[7] = inputProc;
}
else if (intcfg == INPUT9_INT_EN)
{
g_inputIntProcAry[8] = inputProc;
}
else if (intcfg == INPUT10_INT_EN)
{
g_inputIntProcAry[9] = inputProc;
}
else if (intcfg == INPUT11_INT_EN)
{
g_inputIntProcAry[10] = inputProc;
}
else if (intcfg == INPUT12_INT_EN)
{
g_inputIntProcAry[11] = inputProc;
}
else if (intcfg == INPUT13_INT_EN)
{
g_inputIntProcAry[12] = inputProc;
}
else if (intcfg == INPUT14_INT_EN)
{
g_inputIntProcAry[13] = inputProc;
}
else if (intcfg == INPUT15_INT_EN)
{
g_inputIntProcAry[14] = inputProc;
}
else if (intcfg == INPUT16_INT_EN)
{
g_inputIntProcAry[15] = inputProc;
}
intconfig |= intcfg;
SetInputInt(intconfig);
}
InputIntProc g_ecdIntProcAry[2] = {NULL};
void RegEcdInputProc(u16 ecdId, void(*ecdProc)(void))
{
assert_param(IS_ECD_SEL(ecdId));
if (ecdId == ECD_SEL1)
{
g_ecdIntProcAry[0] = ecdProc;
}
else if (ecdId == ECD_SEL2)
{
g_ecdIntProcAry[1] = ecdProc;
}
}
// 外部中断响应函数
void FpgaIntProc(void)
{
u16 tmp16;
{
tmp16 = GetRunStatus(); // 读到运行状态
if ((tmp16 & INPUT_ALARM_FLAG) != 0) // 输入信号下降沿中断
{
//printf("Get input int, GetRunStatus=0x%x, ", tmp16);
tmp16 = GetInputIntFlags();
//printf("GetInputIntFlags=0x%x\r\n", tmp16);
SetVAxisConfig(VCTR_INPUT_ALM_INT); // 清除中断标志
if ((tmp16 & INPUT01_INT_FLAG) != 0)
{
if (g_inputIntProcAry[0] != NULL)
{
g_inputIntProcAry[0]();
}
}
if ((tmp16 & INPUT02_INT_FLAG) != 0)
{
if (g_inputIntProcAry[1] != NULL)
{
g_inputIntProcAry[1]();
}
}
if ((tmp16 & INPUT03_INT_FLAG) != 0)
{
if (g_inputIntProcAry[2] != NULL)
{
g_inputIntProcAry[2]();
}
}
if ((tmp16 & INPUT04_INT_FLAG) != 0)
{
if (g_inputIntProcAry[3] != NULL)
{
g_inputIntProcAry[3]();
}
}
if ((tmp16 & INPUT05_INT_FLAG) != 0)
{
if (g_inputIntProcAry[4] != NULL)
{
g_inputIntProcAry[4]();
}
}
if ((tmp16 & INPUT06_INT_FLAG) != 0)
{
if (g_inputIntProcAry[5] != NULL)
{
g_inputIntProcAry[5]();
}
}
if ((tmp16 & INPUT07_INT_FLAG) != 0)
{
if (g_inputIntProcAry[6] != NULL)
{
g_inputIntProcAry[6]();
}
}
if ((tmp16 & INPUT08_INT_FLAG) != 0)
{
if (g_inputIntProcAry[7] != NULL)
{
g_inputIntProcAry[7]();
}
}
if ((tmp16 & INPUT09_INT_FLAG) != 0)
{
if (g_inputIntProcAry[8] != NULL)
{
g_inputIntProcAry[8]();
}
}
if ((tmp16 & INPUT10_INT_FLAG) != 0)
{
if (g_inputIntProcAry[9] != NULL)
{
g_inputIntProcAry[9]();
}
}
if ((tmp16 & INPUT11_INT_FLAG) != 0)
{
if (g_inputIntProcAry[10] != NULL)
{
g_inputIntProcAry[10]();
}
}
if ((tmp16 & INPUT12_INT_FLAG) != 0)
{
if (g_inputIntProcAry[11] != NULL)
{
g_inputIntProcAry[11]();
}
}
if ((tmp16 & INPUT13_INT_FLAG) != 0)
{
if (g_inputIntProcAry[12] != NULL)
{
g_inputIntProcAry[12]();
}
}
if ((tmp16 & INPUT14_INT_FLAG) != 0)
{
if (g_inputIntProcAry[13] != NULL)
{
g_inputIntProcAry[13]();
}
}
if ((tmp16 & INPUT15_INT_FLAG) != 0)
{
if (g_inputIntProcAry[14] != NULL)
{
g_inputIntProcAry[14]();
}
}
if ((tmp16 & INPUT16_INT_FLAG) != 0)
{
if (g_inputIntProcAry[15] != NULL)
{
g_inputIntProcAry[15]();
}
}
}
if ((tmp16 & ENCODER_ALARM_FLAG) != 0) // 编码器ZP信号上升沿中断
{
//printf("Get zp int, GetRunStatus=0x%x, ", tmp16);
tmp16 = GetEcdIntFlags();
//printf("GetInputIntFlags=0x%x\r\n", tmp16);
if ((tmp16 & ECD1ZP_INT_FLAG) != 0)
{
SetVAxisConfig(VCTR_ZP1_INT); // 清除编码器1 ZP 中断标志
if (g_ecdIntProcAry[0] != NULL)
{
g_ecdIntProcAry[0]();
}
}
if ((tmp16 & ECD2ZP_INT_FLAG) != 0)
{
SetVAxisConfig(VCTR_ZP2_INT); // 清除编码器2 ZP 中断标志
if (g_ecdIntProcAry[1] != NULL)
{
g_ecdIntProcAry[1]();
}
}
}
}
}
//--------------------------------------------------------------------
u16 g_exOutBuf[EXIO_PORT_NUM] = {0xffff};
void SetExoutEnOn(void)
{
SetVAxisConfig(EXOUT_EN_ON);
}
void SetExoutEnOff(void)
{
SetVAxisConfig(EXOUT_EN_OFF);
}
// 设置值
void SetExOutValue(u16 addr, u8 value)
{
if (addr == 0 || addr > MAX_EXIO_ADDR)
{
return;
}
if (value == Bit_SET)
{
g_exOutBuf[(addr-1)/EXIO_PER_PORT] |= EXIO_ADDR_MOD(addr-1);
}
else
{
g_exOutBuf[(addr-1)/EXIO_PER_PORT] &= ~(EXIO_ADDR_MOD(addr-1));
}
}
u8 GetExOutValue(u16 addr)
{
if (addr == 0 || addr > MAX_EXIO_ADDR)
{
return 0xff;
}
if ((g_exOutBuf[(addr-1)/EXIO_PER_PORT] & EXIO_ADDR_MOD(addr-1)) != 0)
{
return Bit_SET;
}
return Bit_RESET;
}
void FlushExOutputs(void)
{
u16 addr;
for (addr = 0; addr < MAX_EXIO_ADDR; addr += EXIO_PER_PORT)
{
FmcWriteReg(EXIO_PORT_ADDR(addr), g_exOutBuf[(addr)/EXIO_PER_PORT]);
}
}
// 设置值并输出
void SetExOutput(u16 addr, u8 value)
{
SetExOutValue(addr, value);
#if (0)
// 只刷新输出端口
FsmcWriteReg(EXIO_PORT_ADDR(addr-1), g_exOutBuf[(addr-1)/EXIO_PER_PORT]);
#else
// 刷新所有输出端口
FlushExOutputs();
#endif
}
// 读取值
u8 GetExInput(u16 addr)
{
if (addr == 0 || addr > MAX_EXIO_ADDR)
{
return Bit_SET;
}
return (((FmcReadReg(EXIO_PORT_ADDR(addr-1)) & EXIO_ADDR_MOD(addr-1)) != 0) ? Bit_SET : Bit_RESET);
}
void GetExInputs(u16 * pBuf)
{
int i;
if (pBuf == NULL)
{
return;
}
for (i = 0; i < EXIO_PORT_NUM; i++)
{
pBuf[i] = FmcReadReg(EXIO_PORT_ADDR(i*EXIO_PER_PORT));
}
}
void TestFPGA(char * para1, char * para2)
{
int p1, p2;
if (para1 == NULL || para2 == NULL)
{
return;
}
printf("para1=%s, para2=%s\r\n", para1, para2);
p1 = 0;
p2 = 0;
if (strcmp(para1, "") != 0)
{
p1 = atoi(para1);
}
if (strcmp(para2, "") != 0)
{
p2 = atoi(para2);
}
if (p1 == p2)
{
}
if (p1 == -1)
{
u16 val = FmcReadReg(VAXIS+p2);
printf("read addr 0x%x, val=0x%x\r\n", p2, val);
}
else if (p1 >= 0)
{
FmcWriteReg(VAXIS+p1, p2);
printf("write addr 0x%x, val=0x%x\r\n", p1, p2);
}
else if (p1 == -2)
{
int hardver = GetFpgaHardVersion();
printf("\r\nFPGA Hard Version = Ver %x.%x \r\n", (hardver&0xff00)>>8,(hardver&0x00ff));
int softver = GetFpgaSoftVersion();
printf("\r\nFPGA Soft Version = Ver %x.%x \r\n", (softver&0xff00)>>8,(softver&0x00ff));
}
else if (p1 == -3)
{
printf("op counter=%d\r\n", GetOPCounter());
}
else if (p1 == -4)
{
printf("zp counter=%d\r\n", GetZPCounter());
}
else if (p1 == -5)
{
if (p2 == 1)
{
ClearEcdCounter(ECD_SEL1);
printf("ClearEcd1Counter\r\n");
}
else if (p2 == 2)
{
ClearEcdCounter(ECD_SEL2);
printf("ClearEcd2Counter\r\n");
}
}
else if (p1 == -6)
{
SetOpCounter(p2);
printf("SetOpCounter %d\r\n", p2);
}
else if (p1 == -7)
{
SetZpCounter(p2);
printf("SetZpCounter %d\r\n", p2);
}
else if (p1 == -8)
{
SetEcdCounter(ECD_SEL1, p2);
printf("SetEcd1Counter %d\r\n", p2);
}
else if (p1 == -9)
{
SetEcdCounter(ECD_SEL2, p2);
printf("SetEcd2Counter %d\r\n", p2);
}
}