You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
5.4 KiB

#pragma once
#if 1
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "../basic/tmc_ic_interface.hpp"
#include "sdk/os/zos.hpp"
#include "tmc_driver_ic.hpp"
extern "C" {
#include "TMC2160\TMC2160.h"
#include "TMC4361A\TMC4361A.h"
}
#ifdef HAL_SPI_MODULE_ENABLED
namespace iflytop {
#define TMC4361A_LISTENER_MAX 5
class TMC4361A : public IStepperMotor {
public:
typedef enum {
IC_TMC2130 = 0, //
IC_TMC2160,
IC_TMC2660,
} driver_ic_type_t;
typedef struct {
SPI_HandleTypeDef *spi;
ZGPIO *csgpio;
ZGPIO *resetPin;
ZGPIO *fREEZEPin;
ZGPIO *ennPin;
ZGPIO *driverIC_ennPin;
ZGPIO *driverIC_resetPin;
} cfg_t;
typedef enum {
kvelmode,
kposmode,
} motor_mode_t;
private:
int32_t shadowRegister[TMC_REGISTER_COUNT];
const uint8_t *m_registerAccessTable;
const int32_t *m_defaultRegisterResetState;
driver_ic_type_t m_driver_ic_type;
uint32_t m_lastCallPeriodicJobTick;
uint8_t m_status;
SPI_HandleTypeDef *m_spi;
ZGPIO *m_csgpio;
ZGPIO *m_resetPin;
ZGPIO *m_fREEZEPin;
ZGPIO *m_ennPin;
ZGPIO *m_driverIC_ennPin;
ZGPIO *m_driverIC_resetPin;
motor_mode_t m_motor_mode = kvelmode;
public:
TMC4361A(/* args */);
/*******************************************************************************
* �嘥��𣇉㮾�單䲮瘜? *
*******************************************************************************/
/**
* @brief �蹱��䲮瘜𤏪��𥕦遣暺䁅恕��MC4361A�滨蔭��㺭,雿輻鍂�嗅蘨��靽格㺿�芸楛��閬����㺭�喳虾
*
* 瘜冽�:
* 1. 霂交䲮瘜訫��其蝙�函��臭�銝芷�����𧶏���隞交�甈∟��刻砲�寞��塚�餈𥪜�����臬�銝�銝芸笆鞊∠��啣��?
* 2. 霂交䲮瘜閗��䂿��啣�潔���閬�◤�𦠜𦆮�?
* @param config
*/
void initialize(cfg_t *cfg);
void enableIC(bool enable);
/*******************************************************************************
* IStepperMotor impl *
*******************************************************************************/
// virtual void registerListener(MotorEventListener *listener);
virtual void rotate(int32_t velocity);
virtual void moveTo(int32_t position, uint32_t velocityMax);
virtual void moveBy(int32_t relativePosition, uint32_t velocityMax);
virtual void stop();
virtual int32_t getXACTUAL();
virtual int32_t getXTARGET();
virtual void setXACTUAL(int32_t value);
virtual int32_t getVACTUAL();
virtual int32_t getENC_POS();
virtual void setENC_POS(int32_t value);
virtual void setAcceleration(float accelerationpps2); // 霈曄蔭��憭批��笔漲
virtual void setDeceleration(float accelerationpps2); // 霈曄蔭��憭批��笔漲
/*******************************************************************************
* 撽勗𢆡�典�憪见��寞� *
*******************************************************************************/
/**
* @brief �嘥��𡝗䲮瘜?
*
* @param channel SPI�𡁻��?
* @param driver_ic_type 撽勗𢆡�舐���掩�?
*/
int32_t readICVersion();
uint8_t reset();
uint8_t restore();
/*******************************************************************************
* 撣貊鍂撖���刻粉�蹱䲮瘜? *
*******************************************************************************/
/*******************************************************************************
* 撽勗𢆡�典�摮睃膥霂餃��寞� *
*******************************************************************************/
void writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4);
void writeInt(uint8_t address, int32_t value);
int32_t readInt(uint8_t address);
void readWriteCover(uint8_t *data, size_t length);
void writeSubRegister(uint8_t address, uint32_t mask, uint32_t shift, uint32_t value);
int32_t getENC_POS_DEV(); // ENC_POS�䬐ACTUAL���撌桀�?
uint32_t readEVENTS(); // 霂餃�鈭衤辣撖���?
/*******************************************************
* driverIc function *
*******************************************************/
int32_t readSubICVersion();
virtual bool isReachTarget();
virtual bool isStoped() { return isReachTarget(); }
public:
// only used in tmc4361A.cpp
void tmc4361AConfigCallback(ConfigState state);
void readWriteArray(uint8_t *data, size_t length);
void setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay) { driverIC_setIHOLD_IRUN(ihold, irun, iholddelay); }
void setMotorShaft(bool reverse) { driverIC_setMotorShaft(reverse); }
private:
uint32_t haspassedms(uint32_t now, uint32_t last);
// void callOnEventCallback(StepperMotorEvent event);
void driverIC_reset();
void driverIC_enableIC(bool enable);
void driverIC_setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay);
void driverIC_writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4);
void driverIC_writeInt(uint8_t address, int32_t value);
int32_t driverIC_readInt(uint8_t address);
void driverIC_setMotorShaft(bool reverse);
uint32_t driverIC_readICVersion();
};
} // namespace iflytop
#endif
#endif