optical/NxFuncs/stepdriver/tmc260.c
2025-09-04 09:45:08 +08:00

1322 lines
25 KiB
C
Raw 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_TMC260_C
#include "tmc260.h"
//-------------------------------------------------------------------------
#if (TMC260_DRV_NUM != 0)
//-------------------------------------------------------------------------
#include "trigger.h"
#include "shell.h"
#include "inout.h"
//-------------------------------------------------------------------------
//------------------------------------------------------------------------
typedef struct
{
TSpiCtrlConfig spiCtrlConfig;
TStepDirConfig stepDirConfig;
TChopperConfig chopperConfig;
TSmartEnergyControl smartEnergyControl;
TStallGuardConfig stallGuardConfig;
TDriverConfig driverConfig;
TReadStatus readStatus;
u32 readData;
}TCConfig;
//------------------------------------------------------------------------
TCConfig g_tcConfig[TMC260_DRV_NUM];
//------------------------------------------------------------------------
#define SReadWrite(cs, dat) SpiReadWrite(cs, dat, 20) // 读写20位数据
void SpiCsOff(SpiCs cs)
{
#if (TMC260_DRV_NUM >= 1)
SetDriver1CsOff();
#endif
#if (TMC260_DRV_NUM >= 2)
SetDriver2CsOff();
#endif
#if (TMC260_DRV_NUM >= 3)
SetDriver3CsOff();
#endif
#if (TMC260_DRV_NUM >= 4)
SetDriver4CsOff();
#endif
#if (TMC260_DRV_NUM >= 5)
SetDriver5CsOff();
#endif
#if (TMC260_DRV_NUM >= 6)
SetDriver6CsOff();
#endif
}
void SpiCsOn(SpiCs cs)
{
SpiCsOff(cs);
switch(cs)
{
case SC_MOTO1:
#if (TMC260_DRV_NUM >= 1)
SetDriver1CsOn();
#endif
break;
case SC_MOTO2:
#if (TMC260_DRV_NUM >= 2)
SetDriver2CsOn();
#endif
break;
case SC_MOTO3:
#if (TMC260_DRV_NUM >= 3)
SetDriver3CsOn();
#endif
break;
case SC_MOTO4:
#if (TMC260_DRV_NUM >= 4)
SetDriver4CsOn();
#endif
break;
case SC_MOTO5:
#if (TMC260_DRV_NUM >= 5)
SetDriver5CsOn();
#endif
break;
case SC_MOTO6:
#if (TMC260_DRV_NUM >= 6)
SetDriver6CsOn();
#endif
break;
default:
break;
}
}
// 软件模拟 SPI 读数据子程序最多支持64位
uint64_t SpiReadWrite(SpiCs cs, uint64_t dat, u8 bitlen)
{
int i;
uint64_t rslt;
uint64_t mod;
SClockHigh();
SpiCsOn(cs); // 片选有效,开始执行读写过程
rslt = 0;
mod = 0x01;
mod <<= (bitlen-1);
for(i = 0; i < bitlen; i++)
{
// 设置好数据
if ((dat&mod) != 0)
{
SMdoDataOne();
}
else
{
SMdoDataZero();
}
SClockLow(); // 设置为低电平,下降沿芯片准备好输出数据
SClockHigh(); // 设置为高电平,上升沿芯片读取设置好的数据
if (SMdiRead() != 0) // 读取数据
{
rslt |= mod;
}
mod >>= 1;
}
SpiCsOff(cs);
//printf("SPI cs =0x%x, data =0x%x, rslt = 0x%x \r\n",cs,dat,rslt);
return(rslt);
}
//------------------------------------------------------------------------
int GetIdxFormCs(SpiCs moto)
{
int idx = moto - 1;
if (idx < 0 || idx >= TMC260_DRV_NUM)
{
printf("not support moto idx\r\n");
return -1;
}
return idx;
}
//------------------------------------------------------------------------
// 细分设置初始化子程序
void WriteStepDirConfig(SpiCs moto)
{
u32 temp;
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
temp = DRVCTRL0;
if (g_tcConfig[idx].stepDirConfig.intpol != 0)
{
temp |= INTPOL; // 使能输出脉冲的16倍频功能
}
if (g_tcConfig[idx].stepDirConfig.dEdge != 0)
{
temp |= DEDGE; // 使能双边沿脉冲
}
if (g_tcConfig[idx].stepDirConfig.mRes > MRES1)
{
g_tcConfig[idx].stepDirConfig.mRes = MRES1;
}
temp |= g_tcConfig[idx].stepDirConfig.mRes;
g_tcConfig[idx].readData = SReadWrite(moto, temp);
}
//------------------------------------------------------------------------
// SPI 控制配置
void WriteSpiCtrlConfig(SpiCs moto)
{
u32 temp;
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
temp = DRVCTRL1;
if (g_tcConfig[idx].spiCtrlConfig.polarityA != 0)
{
temp |= PHA;
}
if (g_tcConfig[idx].spiCtrlConfig.currentA > 255)
{
g_tcConfig[idx].spiCtrlConfig.currentA = 255;
}
temp |= ((u32)g_tcConfig[idx].spiCtrlConfig.currentA) << 9;
if (g_tcConfig[idx].spiCtrlConfig.polarityB != 0)
{
temp |= PHB;
}
if (g_tcConfig[idx].spiCtrlConfig.currentB > 255)
{
g_tcConfig[idx].spiCtrlConfig.currentB = 255;
}
temp |= ((u32)g_tcConfig[idx].spiCtrlConfig.currentB);
g_tcConfig[idx].readData = SReadWrite(moto, temp);
}
//------------------------------------------------------------------------
// 斩波寄存器初始化程序
void WriteChopperConfig(SpiCs moto)
{
u32 temp;
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
temp = CHOPCONF;
if (g_tcConfig[idx].chopperConfig.blankTime > 3)
{
g_tcConfig[idx].chopperConfig.blankTime = 3;
}
if (g_tcConfig[idx].chopperConfig.hysteresisDecay > 3)
{
g_tcConfig[idx].chopperConfig.hysteresisDecay = 3;
}
if (g_tcConfig[idx].chopperConfig.hysteresisEnd > 15)
{
g_tcConfig[idx].chopperConfig.hysteresisEnd = 15;
}
if (g_tcConfig[idx].chopperConfig.hysteresisStart > 7)
{
g_tcConfig[idx].chopperConfig.hysteresisStart = 7;
}
if (g_tcConfig[idx].chopperConfig.tOff > 15)
{
g_tcConfig[idx].chopperConfig.tOff = 15;
}
temp |= ((u32)g_tcConfig[idx].chopperConfig.blankTime) << 15;
if (g_tcConfig[idx].chopperConfig.chopperMode != 0)
{
temp |= CHM;
}
if (g_tcConfig[idx].chopperConfig.randomTOff != 0)
{
temp |= RNDTF;
}
temp |= ((u32)g_tcConfig[idx].chopperConfig.hysteresisDecay) << 11;
temp |= ((u32)g_tcConfig[idx].chopperConfig.hysteresisEnd) << 7;
temp |= ((u32)g_tcConfig[idx].chopperConfig.hysteresisStart) << 4;
if (g_tcConfig[idx].chopperConfig.enable != 0)
{
temp |= ((u32)g_tcConfig[idx].chopperConfig.tOff);
}
g_tcConfig[idx].readData = SReadWrite(moto, temp);
}
//------------------------------------------------------------------------
// 自适应电流控制初始化子程序
void WriteStallGuardConfig(SpiCs moto)
{
u32 temp;
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
temp = SGCSCONF;
// 8 位有符号数转为7位有符号数, 7位有符号数第7位和符号位对于(-64--63之间的数是相同的
if (g_tcConfig[idx].stallGuardConfig.stallGuardThreshold > 63)
{
g_tcConfig[idx].stallGuardConfig.stallGuardThreshold = 63;
}
else if (g_tcConfig[idx].stallGuardConfig.stallGuardThreshold < -64)
{
g_tcConfig[idx].stallGuardConfig.stallGuardThreshold = -64;
}
if(g_tcConfig[idx].stallGuardConfig.filterEnable != 0)
{
temp |= SFILT;
}
temp |= (((u32) g_tcConfig[idx].stallGuardConfig.stallGuardThreshold & 0x7f) << 8);
temp |= (g_tcConfig[idx].stallGuardConfig.currentScale & 0x1F);
g_tcConfig[idx].readData = SReadWrite(moto, temp);
}
//------------------------------------------------------------------------
// 自适应电流控制初始化程序
void WriteSmartEnergyConfig(SpiCs moto)
{
u32 temp;
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
temp = SMARTEN;
if (g_tcConfig[idx].smartEnergyControl.smartIMin != 0)
{
temp |= SEIMIN;
}
if (g_tcConfig[idx].smartEnergyControl.smartDownStep > 3)
{
g_tcConfig[idx].smartEnergyControl.smartDownStep = 3;
}
if (g_tcConfig[idx].smartEnergyControl.smartStallLevelMax > 15)
{
g_tcConfig[idx].smartEnergyControl.smartStallLevelMax = 15;
}
if (g_tcConfig[idx].smartEnergyControl.smartUpStep > 3)
{
g_tcConfig[idx].smartEnergyControl.smartUpStep = 3;
}
if (g_tcConfig[idx].smartEnergyControl.smartStallLevelMin > 15)
{
g_tcConfig[idx].smartEnergyControl.smartStallLevelMin = 15;
}
temp |= ((u32)g_tcConfig[idx].smartEnergyControl.smartDownStep) << 13;
temp |= ((u32)g_tcConfig[idx].smartEnergyControl.smartStallLevelMax) << 8;
temp |= ((u32)g_tcConfig[idx].smartEnergyControl.smartUpStep) << 5;
temp |= ((u32)g_tcConfig[idx].smartEnergyControl.smartStallLevelMin);
g_tcConfig[idx].readData = SReadWrite(moto, temp);
}
//------------------------------------------------------------------------
// 驱动器控制寄存器初始化程序
void WriteDriverConfig(SpiCs moto)
{
u32 temp;
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
temp = DRVCONF;
if (g_tcConfig[idx].driverConfig.testMode != 0)
{
temp |= TST;
}
temp |= ((u32)g_tcConfig[idx].driverConfig.slopeHighSide & 0x03) << 14;
temp |= ((u32)g_tcConfig[idx].driverConfig.slopeLowSide & 0x03) << 12;
if (g_tcConfig[idx].driverConfig.protectionDisable != 0)
{
temp |= DISS2G;
}
temp |= ((u32)g_tcConfig[idx].driverConfig.protectionTimer & 0x03) << 8;
if (g_tcConfig[idx].driverConfig.stepDirDisable != 0)
{
temp |= SDOFF;
}
if (g_tcConfig[idx].driverConfig.vSenseScale != 0)
{
temp |= VSENSE;
}
temp |= ((u32) g_tcConfig[idx].driverConfig.readBackSelect & 0x03) << 4;
g_tcConfig[idx].readData = SReadWrite(moto, temp);
}
//------------------------------------------------------------------------
// 读取状态反馈值
void ReadDriverState(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
WriteDriverConfig(moto);
switch(g_tcConfig[idx].driverConfig.readBackSelect) // 读取返回项,0:微步位置,1:负载值0--9位, 2:负载值高5位(5--9位)及设置电流控制值大小
{
case 0: // 0 A相微步位置
{
g_tcConfig[idx].readStatus.phases = (g_tcConfig[idx].readData >> 18) & 0x01; // STEP/DIR模式下的极性位; 0电流从OA1引脚流向OA2引脚。 1电流从OA2引脚流向OA1引脚。
g_tcConfig[idx].readStatus.mSteps = (g_tcConfig[idx].readData >> 10) & 0x1FF; // 线圈A在正弦表中的微步位置
break;
}
case 1: // 1 负载值
{
g_tcConfig[idx].readStatus.stallGuard = (g_tcConfig[idx].readData >> 10) & 0x3FF;
break;
}
case 2: // 2负载高5位及当前电流值大小
{
g_tcConfig[idx].readStatus.stallGuard &= 0x1f;
g_tcConfig[idx].readStatus.stallGuard |= (g_tcConfig[idx].readData >> 10) & 0x3E0;
g_tcConfig[idx].readStatus.smartEnergy = (g_tcConfig[idx].readData >> 10) & 0x1f;
break;
}
}
g_tcConfig[idx].readStatus.flags = g_tcConfig[idx].readData & 0xff; // 停顿标志位检测, STEP脉冲检测
}
//------------------------------------------------------------------------
// 驱动器初始化程序
void InitMotorDrivers(SpiCs moto)
{
int idx;
idx = moto-1;
if (idx < 0 || idx >= TMC260_DRV_NUM)
{
return;
}
memset(&(g_tcConfig[idx]), 0, sizeof(TCConfig));
g_tcConfig[idx].stallGuardConfig.filterEnable = 1; // 失步检测滤波 0:标准模式1: 4个fullstep滤波
g_tcConfig[idx].stallGuardConfig.stallGuardThreshold = 2; // 带符号失步门限-64~63值越大灵敏度越低不建议小于-10
g_tcConfig[idx].stallGuardConfig.currentScale = 1; // 驱动电流0~31
WriteStallGuardConfig(moto); // 0xd020a
g_tcConfig[idx].driverConfig.slopeHighSide = 2; // 上功率管控制斜率0:最小3: 最大
g_tcConfig[idx].driverConfig.slopeLowSide = 2; // 下功率管控制斜率0:最小3: 最大
g_tcConfig[idx].driverConfig.protectionDisable = 0; // 0:短路保护使能 1:不使能
g_tcConfig[idx].driverConfig.protectionTimer = 0; // 短路保护时间0: 3.2uS, 1: 1.6uS, 2: 1.2uS, 3: 0.8uS
g_tcConfig[idx].driverConfig.stepDirDisable = 0; // 0: 脉冲方向模式1:SPI模式
g_tcConfig[idx].driverConfig.vSenseScale = 0; // 检测参考电压0: 305mV, 1: 165mV
g_tcConfig[idx].driverConfig.readBackSelect = 1; // 读取返回项,0:微步位置,1:负载值0--9位, 2:负载值高5位(5--9位)及设置电流控制值大小
WriteDriverConfig(moto); // 0xea010
g_tcConfig[idx].smartEnergyControl.smartIMin = 1; // 智能控制最小电流0: 1/2, 1: 1/4
g_tcConfig[idx].smartEnergyControl.smartDownStep = 0; // 电流减少速度0: 32, 1: 8, 2: 2, 3: 1
g_tcConfig[idx].smartEnergyControl.smartStallLevelMax = 0; // 高位安全门限0~15
g_tcConfig[idx].smartEnergyControl.smartUpStep = 0; // 电流增加速度0: 1, 1: 2, 2: 4, 3: 8
g_tcConfig[idx].smartEnergyControl.smartStallLevelMin = 0; // 低位安全门限0~15
WriteSmartEnergyConfig(moto); // 0xa8000
g_tcConfig[idx].stepDirConfig.intpol = 0; // 16倍频模式
g_tcConfig[idx].stepDirConfig.dEdge = 0; // 双边沿模式
g_tcConfig[idx].stepDirConfig.mRes = MRES4; // 细分数
WriteStepDirConfig(moto); // 0x0
g_tcConfig[idx].chopperConfig.blankTime = 1; // 斩波空白时间也就是关断时间0: 16, 1: 24, 2: 36, 3: 54
g_tcConfig[idx].chopperConfig.chopperMode = 0; // 0: 斩波模式, 1: 常系数模式一般选择0
g_tcConfig[idx].chopperConfig.hysteresisDecay = 0; // 衰减设置0...3, 0:fast decrement 3:very slow decrement
g_tcConfig[idx].chopperConfig.hysteresisEnd = 3; // 快速衰减结束值设置 0...15
g_tcConfig[idx].chopperConfig.hysteresisStart = 3; // 快速衰减开始值设置 0...7
g_tcConfig[idx].chopperConfig.tOff = 5; // 斩波慢衰减时间,影响开关频率
g_tcConfig[idx].chopperConfig.enable = 1; // mosfet输出允许
WriteChopperConfig(moto); // 0x881b5
}
//------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------
// 微细分设置子程序
void SetStepDirMStepRes(SpiCs moto, u32 microstepResolution)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].stepDirConfig.mRes = microstepResolution;
WriteStepDirConfig(moto);
}
//
void SetStepDirInterpolation(SpiCs moto, u32 interpolation)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].stepDirConfig.intpol = interpolation;
WriteStepDirConfig(moto);
}
//
void SetStepDirDoubleEdge(SpiCs moto, u32 doubleEdge)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].stepDirConfig.dEdge = doubleEdge;
WriteStepDirConfig(moto);
}
//
u32 GetStepDirMStepRes(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].stepDirConfig.mRes;
}
//
u32 GetStepDirInterpolation(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].stepDirConfig.intpol;
}
//
u32 GetStepDirDoubleEdge(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].stepDirConfig.dEdge;
}
//------------------------------------------------------------------------
//
void SetChopperBlankTime(SpiCs moto, u32 blankTime)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.blankTime = blankTime;
WriteChopperConfig(moto);
}
//
void SetChopperMode(SpiCs moto, u32 mode)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.chopperMode = mode;
WriteChopperConfig(moto);
}
//
void SetChopperRandomTOff(SpiCs moto, u32 randomTOff)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.randomTOff = randomTOff;
WriteChopperConfig(moto);
}
//
void SetChopperHysteresisDecay(SpiCs moto, u32 hysteresisDecay)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.hysteresisDecay = hysteresisDecay;
WriteChopperConfig(moto);
}
//
void SetChopperHysteresisEnd(SpiCs moto, u32 hysteresisEnd)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.hysteresisEnd = hysteresisEnd;
WriteChopperConfig(moto);
}
//
void SetChopperHysteresisStart(SpiCs moto, u32 hysteresisStart)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.hysteresisStart = hysteresisStart;
WriteChopperConfig(moto);
}
//
void SetChopperTOff(SpiCs moto, u32 tOff)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.tOff = tOff;
WriteChopperConfig(moto);
}
void SetChopperEnable(SpiCs moto, u32 enable)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].chopperConfig.enable = enable;
WriteChopperConfig(moto);
}
//
u32 GetChopperBlankTime(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.blankTime;
}
//
u32 GetChopperMode(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.chopperMode;
}
//
u32 GetChopperRandomTOff(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.randomTOff;
}
//
u32 GetChopperHysteresisDecay(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.hysteresisDecay;
}
//
u32 GetChopperHysteresisEnd(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.hysteresisEnd;
}
//
u32 GetChopperHysteresisStart(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.hysteresisStart;
}
//
u32 GetChopperTOff(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.tOff;
}
u32 GetChopperEnable(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].chopperConfig.enable;
}
//------------------------------------------------------------------------
//
void SetSmartEnergyIMin(SpiCs moto, u32 smartIMin)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].smartEnergyControl.smartIMin = smartIMin;
WriteSmartEnergyConfig(moto);
}
//
void SetSmartEnergyDownStep(SpiCs moto, u32 smartDownStep)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].smartEnergyControl.smartDownStep = smartDownStep;
WriteSmartEnergyConfig(moto);
}
//
void SetSmartEnergyStallLevelMax(SpiCs moto, u32 stallLevelMax)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].smartEnergyControl.smartStallLevelMax = stallLevelMax;
WriteSmartEnergyConfig(moto);
}
//
void SetSmartEnergyUpStep(SpiCs moto, u32 smartUpStep)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].smartEnergyControl.smartUpStep = smartUpStep;
WriteSmartEnergyConfig(moto);
}
//
void SetSmartEnergyStallLevelMin(SpiCs moto, u32 stallLevelMin)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].smartEnergyControl.smartStallLevelMin = stallLevelMin;
WriteSmartEnergyConfig(moto);
}
//
u32 GetSmartEnergyIMin(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].smartEnergyControl.smartIMin;
}
//
u32 GetSmartEnergyDownStep(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].smartEnergyControl.smartDownStep;
}
//
u32 GetSmartEnergyStallLevelMax(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].smartEnergyControl.smartStallLevelMax;
}
//
u32 GetSmartEnergyUpStep(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].smartEnergyControl.smartUpStep;
}
//
u32 GetSmartEnergyStallLevelMin(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].smartEnergyControl.smartStallLevelMin;
}
//------------------------------------------------------------------------
//
void SetStallGuardFilter(SpiCs moto, u32 enable)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].stallGuardConfig.filterEnable = enable;
WriteStallGuardConfig(moto);
}
//
void SetStallGuardThreshold(SpiCs moto, s32 threshold)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].stallGuardConfig.stallGuardThreshold = threshold;
WriteStallGuardConfig(moto);
}
//
void SetStallGuardCurrentScale(SpiCs moto, u32 currentScale)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].stallGuardConfig.currentScale = currentScale;
WriteStallGuardConfig(moto);
}
//
u32 GetStallGuardFilter(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].stallGuardConfig.filterEnable;
}
//
s32 GetStallGuardThreshold(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].stallGuardConfig.stallGuardThreshold;
}
//
u32 GetStallGuardCurrentScale(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].stallGuardConfig.currentScale;
}
//------------------------------------------------------------------------
//
void SetDriverSlopeHighSide(SpiCs moto, u32 slopeHighSide)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.slopeHighSide = slopeHighSide;
WriteDriverConfig(moto);
}
//
void SetDriverSlopeLowSide(SpiCs moto, u32 slopeLowSide)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.slopeHighSide = slopeLowSide;
WriteDriverConfig(moto);
}
//
void SetDriverDisableProtection(SpiCs moto, u32 disableProtection)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.protectionDisable = disableProtection;
WriteDriverConfig(moto);
}
//
void SetDriverProtectionTimer(SpiCs moto, u32 protectionTimer)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.protectionTimer = protectionTimer;
WriteDriverConfig(moto);
}
//
void SetDriverStepDirectionOff(SpiCs moto, u32 sDOff)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.stepDirDisable = sDOff;
WriteDriverConfig(moto);
}
//
void SetDriverVSenseScale(SpiCs moto, u32 scale)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.vSenseScale = scale;
WriteDriverConfig(moto);
}
//
void SetDriverReadSelect(SpiCs moto, u32 readSelect)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.readBackSelect = readSelect;
WriteDriverConfig(moto);
}
//
void SetDriverTestMode(SpiCs moto, u32 testMode)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return;
}
g_tcConfig[idx].driverConfig.testMode = testMode;
WriteDriverConfig(moto);
}
//
u32 GetDriverSlopeHighSide(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.slopeHighSide;
}
//
u32 GetDriverSlopeLowSide(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.slopeLowSide;
}
//
u32 GetDriverDisableProtection(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.protectionDisable;
}
//
u32 GetDriverProtectionTimer(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.protectionTimer;
}
//
u32 GetDriverStepDirectionOff(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.stepDirDisable;
}
//
u32 GetDriverVSenseScale(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.vSenseScale;
}
//
u32 GetDriverReadSelect(SpiCs moto)
{
int idx;
idx = moto-1;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.readBackSelect;
}
//
u32 GetDriverTestMode(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].driverConfig.testMode;
}
//------------------------------------------------------------------------
u32 GetPhases(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].readStatus.phases;
}
//------------------------------------------------------------------------
u32 GetMStepPos(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].readStatus.mSteps;
}
//------------------------------------------------------------------------
u32 GetStallGuard(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].readStatus.stallGuard;
}
//------------------------------------------------------------------------
u32 GetSmartEnergy(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].readStatus.smartEnergy;
}
//------------------------------------------------------------------------
//
u32 GetDriverFlag(SpiCs moto)
{
int idx;
idx = GetIdxFormCs(moto);
if (idx < 0)
{
return 0;
}
return g_tcConfig[idx].readStatus.flags;
}
//
void DriveDisable(SpiCs moto)
{
SetChopperEnable(moto, 0);
}
//
void DriveEnable(SpiCs moto)
{
SetChopperEnable(moto, 1);
}
//----------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
void InitTmc260(void)
{
InitMotorDrivers(SC_MOTO1);
InitMotorDrivers(SC_MOTO2);
InitMotorDrivers(SC_MOTO3);
InitMotorDrivers(SC_MOTO4);
InitMotorDrivers(SC_MOTO5);
InitMotorDrivers(SC_MOTO6);
}
//------------------------------------------------------------------------
int GetResConfigFromLvnum(int subd)
{
switch(subd)
{
case 1: // 1细分
return MRES1;
case 2: // 2细分
return MRES2;
case 4: // 4细分
return MRES4;
case 8: // 8细分
return MRES8;
case 16: // 16细分
return MRES16;
case 32: // 32细分
return MRES32;
case 64: // 64细分
return MRES64;
case 128: // 128细分
return MRES128;
case 256: // 256细分
return MRES256;
default:
return MRES256;
};
}
#endif