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.

158 lines
5.3 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #pragma once
  2. #if 1
  3. #include <stdbool.h>
  4. #include <stdint.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "../basic/tmc_ic_interface.hpp"
  8. #include "sdk/os/zos.hpp"
  9. #include "tmc_driver_ic.hpp"
  10. extern "C" {
  11. #include "TMC2160\TMC2160.h"
  12. #include "TMC4361A\TMC4361A.h"
  13. }
  14. #ifdef HAL_SPI_MODULE_ENABLED
  15. namespace iflytop {
  16. #define TMC4361A_LISTENER_MAX 5
  17. class TMC4361A : public IStepperMotor {
  18. public:
  19. typedef enum {
  20. IC_TMC2130 = 0, //
  21. IC_TMC2160,
  22. IC_TMC2660,
  23. } driver_ic_type_t;
  24. typedef struct {
  25. SPI_HandleTypeDef *spi;
  26. ZGPIO *csgpio;
  27. ZGPIO *resetPin;
  28. ZGPIO *fREEZEPin;
  29. ZGPIO *ennPin;
  30. ZGPIO *driverIC_ennPin;
  31. ZGPIO *driverIC_resetPin;
  32. } cfg_t;
  33. typedef enum {
  34. kvelmode,
  35. kposmode,
  36. } motor_mode_t;
  37. private:
  38. int32_t shadowRegister[TMC_REGISTER_COUNT];
  39. const uint8_t *m_registerAccessTable;
  40. const int32_t *m_defaultRegisterResetState;
  41. driver_ic_type_t m_driver_ic_type;
  42. uint32_t m_lastCallPeriodicJobTick;
  43. uint8_t m_status;
  44. SPI_HandleTypeDef *m_spi;
  45. ZGPIO *m_csgpio;
  46. ZGPIO *m_resetPin;
  47. ZGPIO *m_fREEZEPin;
  48. ZGPIO *m_ennPin;
  49. ZGPIO *m_driverIC_ennPin;
  50. ZGPIO *m_driverIC_resetPin;
  51. motor_mode_t m_motor_mode = kvelmode;
  52. public:
  53. TMC4361A(/* args */);
  54. /*******************************************************************************
  55. * ʼط?? *
  56. *******************************************************************************/
  57. /**
  58. * @brief ̬ĬϵTMC4361Aò,ʹʱֻ޸ԼҪIJ
  59. *
  60. * ע:
  61. * 1. ÷ڲʹõһ̬ÿεø÷ʱصĶͬһĵַ??
  62. * 2. ÷صֵҪͷ??
  63. * @param config
  64. */
  65. void initialize(cfg_t *cfg);
  66. void enableIC(bool enable);
  67. /*******************************************************************************
  68. * IStepperMotor impl *
  69. *******************************************************************************/
  70. // virtual void registerListener(MotorEventListener *listener);
  71. virtual void rotate(int32_t velocity);
  72. virtual void moveTo(int32_t position, uint32_t velocityMax);
  73. virtual void moveBy(int32_t relativePosition, uint32_t velocityMax);
  74. virtual void stop();
  75. virtual int32_t getXACTUAL();
  76. virtual int32_t getXTARGET();
  77. virtual void setXACTUAL(int32_t value);
  78. virtual int32_t getVACTUAL();
  79. virtual int32_t getENC_POS();
  80. virtual void setENC_POS(int32_t value);
  81. virtual void setAcceleration(float accelerationpps2); // �����������ٶ�
  82. virtual void setDeceleration(float accelerationpps2); // �����������ٶ�
  83. /*******************************************************************************
  84. * ʼ *
  85. *******************************************************************************/
  86. /**
  87. * @brief ʼ??
  88. *
  89. * @param channel SPIͨ??
  90. * @param driver_ic_type оƬ??
  91. */
  92. int32_t readICVersion();
  93. uint8_t reset();
  94. uint8_t restore();
  95. /*******************************************************************************
  96. * üĴд?? *
  97. *******************************************************************************/
  98. /*******************************************************************************
  99. * Ĵд *
  100. *******************************************************************************/
  101. void writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4);
  102. void writeInt(uint8_t address, int32_t value);
  103. int32_t readInt(uint8_t address);
  104. void readWriteCover(uint8_t *data, size_t length);
  105. void writeSubRegister(uint8_t address, uint32_t mask, uint32_t shift, uint32_t value);
  106. int32_t getENC_POS_DEV(); // ENC_POS��XACTUAL��ƫ��??
  107. uint32_t readEVENTS(); // ��ȡ�¼��Ĵ�??
  108. /*******************************************************
  109. * driverIc function *
  110. *******************************************************/
  111. int32_t readSubICVersion();
  112. virtual bool isReachTarget();
  113. virtual bool isStoped() { return isReachTarget(); }
  114. public:
  115. // only used in tmc4361A.cpp
  116. void tmc4361AConfigCallback(ConfigState state);
  117. void readWriteArray(uint8_t *data, size_t length);
  118. void setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay) { driverIC_setIHOLD_IRUN(ihold, irun, iholddelay); }
  119. void setMotorShaft(bool reverse) { driverIC_setMotorShaft(reverse); }
  120. private:
  121. uint32_t haspassedms(uint32_t now, uint32_t last);
  122. // void callOnEventCallback(StepperMotorEvent event);
  123. void driverIC_reset();
  124. void driverIC_enableIC(bool enable);
  125. void driverIC_setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay);
  126. void driverIC_writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4);
  127. void driverIC_writeInt(uint8_t address, int32_t value);
  128. int32_t driverIC_readInt(uint8_t address);
  129. void driverIC_setMotorShaft(bool reverse);
  130. uint32_t driverIC_readICVersion();
  131. };
  132. } // namespace iflytop
  133. #endif
  134. #endif