#ifndef _TMC2160_H_
#define _TMC2160_H_
#include "ptz_type_select.h"
#include "gd32f4xx_gpio.h"
#include "agent_hyt.h"

#ifdef TMC2160

  #define ADD                   0x80
  #define TMC2160_GCONF         0x00  //((ADD | TMC2160_GCONF)<<32) | 0x314c,,使能DIAG0输出过热预警，DIAG1输出堵转信号
  #define TMC2160_GSTAT         0x01  //((ADD | TMC2160_GSTAT)<<32) | 0x07,读写1清零，状态标志
  #define TMC2160_IOIN          0x04  //只读，外设引脚状态
  #define TMC2160_SHORT_CONF    0x09  //短路保护
  #define TMC2160_DRV_CONF      0x0A  //((ADD | TMC2160_DRV_CONF)<<32) | 0x0820
  #define TMC2160_GLOBAL_SCALER 0x0B  //写0
  #define TMC2160_IHOLD_IRUN    0x10  //8-12为设置电流，其余设置0，如0x14:((ADD | TMC2160_IHOLD_IRUN)<<32)|(0x14<<8)
  #define TMC2160_TPOWERDOWN    0x11  //((ADD | TMC2160_TPOWERDOWN)<<32) | 0x02
  #define TMC2160_TSTEP         0x12  //只读
  #define TMC2160_TPWMTHRS      0x13
  #define TMC2160_TCOOLTHRS     0x14
  #define TMC2160_THIGH         0x15
  #define TMC2160_XDIRECT       0x2D
  #define TMC2160_VDCMIN        0x33
  #define TMC2160_MSLUT0        0x60
  #define TMC2160_MSLUT1        0x61
  #define TMC2160_MSLUT2        0x62
  #define TMC2160_MSLUT3        0x63
  #define TMC2160_MSLUT4        0x64
  #define TMC2160_MSLUT5        0x65
  #define TMC2160_MSLUT6        0x66
  #define TMC2160_MSLUT7        0x67
  #define TMC2160_MSLUTSEL      0x68
  #define TMC2160_MSLUTSTART    0x69
  #define TMC2160_MSCNT         0x6A
  #define TMC2160_MSCURACT      0x6B
  #define TMC2160_CHOPCONF      0x6C  //((ADD | TMC2160_CHOPCONF)<<32) | 0x5110083,24-27位配置细分，最后左移24位
  #define TMC2160_COOLCONF      0x6D  //智能电流控制
  #define TMC2160_DCCTRL        0x6E  //不用
  #define TMC2160_DRV_STATUS    0x6F  //只读
  #define TMC2160_PWMCONF       0x70  //((ADD | TMC2160_PWMCONF)<<32) | 0xc401321e，时钟35.1KHZ
  #define TMC2160_PWM_SCALE     0x71  //只读,斩波调幅结果
  #define TMC2160_PWM_AUTO      0x72  //只读，自动标定的偏移值
  #define TMC2160_LOST_STEPS    0x73  //只读，



/*   驱动器电源控制引脚  */

#define TMC2160_H_POWER_OFF              gpio_bit_reset(GPIOE,GPIO_PIN_0)
#define TMC2160_H_POWER_ON               gpio_bit_set(GPIOE,GPIO_PIN_0)

#define TMC2160_V_POWER_OFF              gpio_bit_reset(GPIOE,GPIO_PIN_1)
#define TMC2160_V_POWER_ON               gpio_bit_set(GPIOE,GPIO_PIN_1)




 
/// ===== SPI配置 =====
  #define TMC2160_SCLK_LOW              gpio_bit_reset(GPIOE,GPIO_PIN_13)
  #define TMC2160_SCLK_HIGH             gpio_bit_set(GPIOE,GPIO_PIN_13)

  #define TMC2160_SDATI_0               gpio_bit_reset(GPIOE,GPIO_PIN_14)
  #define TMC2160_SDATI_1               gpio_bit_set(GPIOE,GPIO_PIN_14)

  #define TMC2160_SDATO_READ            gpio_input_bit_get(GPIOE, GPIO_PIN_15)
//  #define TMC2160_SDATO_0               drv_gpio_clrbit(TMC2160_SDATO_PORT,TMC2160_SDATO_PIN)
//  #define TMC2160_SDATO_1               drv_gpio_setbit(TMC2160_SDATO_PORT,TMC2160_SDATO_PIN)


/// ===== 水平驱动器配置 =====
/// ===== 引脚定义 =====
/// ===== IO模式 =====
//SPI片选输出设置
  #define TMC2160_HORI_CSN_ENABLE         gpio_bit_reset(GPIOD,GPIO_PIN_15) //低电平使能SPI
  #define TMC2160_HORI_CSN_DISABLE        gpio_bit_set(GPIOD,GPIO_PIN_15)
//故障接收，低电平为正常状态，用于故障检测读取
  #define TMC2160_HORI_DIAG1_READ         gpio_input_bit_get(GPIOD, GPIO_PIN_13)
  #define TMC2160_HORI_DIAG0_READ         gpio_input_bit_get(GPIOD, GPIO_PIN_14)
//转向设置，R反转，F正转
  #define TMC2160_HORI_DIR_R              gpio_bit_reset(GPIOD,GPIO_PIN_11) //电机转向
  #define TMC2160_HORI_DIR_F              gpio_bit_set(GPIOD,GPIO_PIN_11)
//驱动器使能，初始化为低电平，失能驱动器
  #define TMC2160_HORI_DISABLE            gpio_bit_set(GPIOD,GPIO_PIN_10) //驱动器低电平使能
  #define TMC2160_HORI_ENABLE             gpio_bit_reset(GPIOD,GPIO_PIN_10)

/// ===== 垂直驱动器配置 =====
/// ===== 引脚定义 =====
/// ===== IO模式 =====
//SPI片选输出设置
  #define TMC2160_VERT_CSN_ENABLE         gpio_bit_reset(GPIOA,GPIO_PIN_11) //低电平使能SPI
  #define TMC2160_VERT_CSN_DISABLE        gpio_bit_set(GPIOA,GPIO_PIN_11)
//故障接收，低电平为正常状态
  #define TMC2160_VERT_DIAG1_READ         gpio_input_bit_get(GPIOA, GPIO_PIN_8)
  #define TMC2160_VERT_DIAG0_READ         gpio_input_bit_get(GPIOC, GPIO_PIN_9)
//转向设置，R反转，F正转
  #define TMC2160_VERT_DIR_R              gpio_bit_reset(GPIOC,GPIO_PIN_8) //电机转向
  #define TMC2160_VERT_DIR_F              gpio_bit_set(GPIOC,GPIO_PIN_8)
//驱动器使能，初始化为低电平，失能驱动器
  #define TMC2160_VERT_DISABLE            gpio_bit_set(GPIOC,GPIO_PIN_7) //低电平使能
  #define TMC2160_VERT_ENABLE             gpio_bit_reset(GPIOC,GPIO_PIN_7)
    

/// ===== 步进电机分频 =====
  #define TMC2160_1_1_STEP         0
  #define TMC2160_1_2_STEP         1
  #define TMC2160_1_4_STEP         2
  #define TMC2160_1_8_STEP         3
  #define TMC2160_1_16_STEP        4
  #define TMC2160_1_32_STEP        5
  #define TMC2160_1_64_STEP        6
  #define TMC2160_1_128_STEP       7
  #define TMC2160_1_256_STEP       8

/// ===== 水平电机速度 =====
// 1/8细分
  #define PTZ_HORI_1_8_STEP_V_MAX       750.0  //允许的最大转速r/minPTZ_HORI_MOTOR_MAX_SPEED
  #define PTZ_HORI_1_8_STEP_V_MIN       500.0  //允许的最小转速r/min
// 1/16细分
  #define PTZ_HORI_1_16_STEP_V_MAX      500.0  //允许的最大转速r/min
  #define PTZ_HORI_1_16_STEP_V_MIN      250.0  //允许的最小转速r/min
// 1/32细分
#define PTZ_HORI_1_32_STEP_V_MAX        250.0    //允许的最大转速r/min
#define PTZ_HORI_1_32_STEP_V_MIN        100.0    //允许的最小转速r/min
// 1/64细分
  #define PTZ_HORI_1_64_STEP_V_MAX      100.0  //允许的最大转速r/min     
  #define PTZ_HORI_1_64_STEP_V_MIN      50.0    //允许的最小转速r/min
// 1/128细分
  #define PTZ_HORI_1_128_STEP_V_MAX     50.0   //允许的最大转速r/min
  #define PTZ_HORI_1_128_STEP_V_MIN     1.0    //允许的最小转速r/min

/// ===== 垂直电机速度 =====
// 1/8细分
//#define PTZ_VERT_1_8_STEP_V_MAX       PTZ_VERT_MOTOR_MAX_SPEED//210.0//允许的最大转速r/min
//#define PTZ_VERT_1_8_STEP_V_MIN       50.0//128.0  //允许的最小转速r/min
// 1/16细分
  #define PTZ_VERT_1_16_STEP_V_MAX      500.0//128.0//允许的最大转速r/min
  #define PTZ_VERT_1_16_STEP_V_MIN      250.0//37.0  //允许的最小转速r/min
// 1/32细分
  #define PTZ_VERT_1_32_STEP_V_MAX      250.0//允许的最大转速r/min
  #define PTZ_VERT_1_32_STEP_V_MIN      100.0  //允许的最小转速r/min
// 1/64细分
  #define PTZ_VERT_1_64_STEP_V_MAX      100.0//18.0//允许的最大转速r/min
  #define PTZ_VERT_1_64_STEP_V_MIN      50.0  //允许的最小转速r/min
// 1/128细分
  #define PTZ_VERT_1_128_STEP_V_MAX     50.0//允许的最大转速r/min
  #define PTZ_VERT_1_128_STEP_V_MIN     1.0  //允许的最小转速r/min



 
/// ===== 加减速默认时间 =====
  #define PTZ_HORI_ACC_TIME_MAX   3000.0 //从0加速到最大速度所需要的时间,单位毫秒
  #define PTZ_HORI_DEC_TIME_MAX   1000.0 //从0减速到最刹车速度所需要的时间   设定减速
  #define PTZ_HORI_DEC_TIME_DEF   1000.0 //从0减速到最刹车速度所需要的时间   快速减速

  #define PTZ_VERT_ACC_TIME_MAX   3000.0//从0加速到最大速度所需要的时间
  #define PTZ_VERT_DEC_TIME_MAX   1000.0 //从0减速到最刹车速度所需要的时间   设定减速
  #define PTZ_VERT_DEC_TIME_DEF   1000.0 //从0减速到最刹车速度所需要的时间   快速减速

/// ===== 电机转动方向 =====
///电机正转
  #define TMC2160_MOTOR_DIR_FWD  1
///电机反转
  #define TMC2160_MOTOR_DIR_REV  0

/// ===== 电机是否刹车 =====
///电机刹车
  #define TMC2160_MOTOR_DISABLE  0
///电机启动
  #define TMC2160_MOTOR_ENABLE   1

/// ===== 24V供电正常运行时的TORQUE值 =====
  #define TMC2160_HORI_TORQUE_VALUE   16//默认值0-31，建议16-31，10进制
  #define TMC2160_VERT_TORQUE_VALUE   20//16//默认值

  #ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V
      #define CURR_GLOBAL_SCALER          160//电流全局缩放，取0时为最大值256,当电阻取33毫欧
  #endif
      
  #ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
      #define CURR_GLOBAL_SCALER          200//电流全局缩放，取0时为最大值256
  #endif

  #define TMC2160_WORK_TORQUE_MAX     31//量化扭矩最大值
  #define TMC2160_WORK_TORQUE_MIN     5 //量化扭矩最小值

/// ===== 选择驱动器 =====
  #define TMC2160_HORI   0
  #define TMC2160_VERT   1

/// ===== 运动参数存储 =====
#define TMC2160_PARAMETER_FLASH_ADD 0X008A0000//参数存储地址
#define TMC2160_PARAMETER_BACKUP_FLASH_ADD 0X008B0000//参数备用存储地址
#define TMC2160_PARAMETER_SAVE_FLASH_NUM       3 //参数保存次数
#define TMC2160_PARAMETER_READ_FLASH_NUM       3 //参数读取次数

/// ===== 读寄存器
typedef struct _TMC2160Regis_
{
  unsigned long int gstae;
  unsigned long int g_conf;
  unsigned long int drv_conf;
  unsigned long int global_scaler;
  unsigned long int tpowerdown;
  unsigned long int pwmconf;
  unsigned long int tpwmthrs;
  unsigned long int i_run;
  unsigned long int chop_conf;
  unsigned long int coolconf;
  unsigned long int short_conf;
}TMC2160Regis;

/// ===== 驱动器控制参数
typedef struct _TMC2160Control_ 
{
  float set_v;//设定的转速
  unsigned int start_f;//启动频率
  float set_f;//设定频率

  float f;//当前实际频率

  unsigned char microstep;//细分等级为0,1,2,3,4,5,6,7,8
  unsigned short int microstep_vlue;//细分值1,2,4,8,16,32,64,128,256

  char off_on;//芯片开启状态，0关闭状态，1开启状态

  unsigned char actual_microstep;//实际已经设置到芯片内的细分等级：0,1,2,3,4,5,6,7,8
  
  float stop_angle;
}TMC2160Control;

typedef struct _SPIpacka_ 
{
  unsigned char data[5];
}SPIpacka;

/// ===== 驱动参数设置 =====
typedef struct _TMC2160Parameter_ 
{
  char hori_step_1_1_en;//是否有效，0无效，1有效
  float hori_step_1_1_v_max;//该细分程度下对应得最大转速
  float hori_step_1_1_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_2_en;//是否有效，0无效，1有效
  float hori_step_1_2_v_max;//该细分程度下对应得最大转速
  float hori_step_1_2_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_4_en;//是否有效，0无效，1有效
  float hori_step_1_4_v_max;//该细分程度下对应得最大转速
  float hori_step_1_4_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_8_en;//是否有效，0无效，1有效
  float hori_step_1_8_v_max;//该细分程度下对应得最大转速
  float hori_step_1_8_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_16_en;//是否有效，0无效，1有效
  float hori_step_1_16_v_max;//该细分程度下对应得最大转速
  float hori_step_1_16_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_32_en;//是否有效，0无效，1有效
  float hori_step_1_32_v_max;//该细分程度下对应得最大转速
  float hori_step_1_32_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_64_en;//是否有效，0无效，1有效
  float hori_step_1_64_v_max;//该细分程度下对应得最大转速
  float hori_step_1_64_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_128_en;//是否有效，0无效，1有效
  float hori_step_1_128_v_max;//该细分程度下对应得最大转速
  float hori_step_1_128_v_min;//该细分程度下对应得最小转速
  
  char hori_step_1_256_en;//是否有效，0无效，1有效
  float hori_step_1_256_v_max;//该细分程度下对应得最大转速
  float hori_step_1_256_v_min;//该细分程度下对应得最小转速
  
  unsigned char hori_work_torque;//工作时torque的值
//  unsigned char hori_self_lock_micr;//自锁时，采用的细分等级，值为0，1，2，3，4，5，6，7，8
//  unsigned char hori_self_lock_torque;//自锁时，torque的值
  
  unsigned char hori_global_scaler;//电流全局缩放
  
  unsigned short int hori_acc_time_max;//电机从0加速到最大速度所用时间
  unsigned short int hori_dec_time_max;//电机从最大速度减速到0所用时间
  
  
  char vert_step_1_1_en;//是否有效，0无效，1有效
  float vert_step_1_1_v_max;//该细分程度下对应得最大转速
  float vert_step_1_1_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_2_en;//是否有效，0无效，1有效
  float vert_step_1_2_v_max;//该细分程度下对应得最大转速
  float vert_step_1_2_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_4_en;//是否有效，0无效，1有效
  float vert_step_1_4_v_max;//该细分程度下对应得最大转速
  float vert_step_1_4_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_8_en;//是否有效，0无效，1有效
  float vert_step_1_8_v_max;//该细分程度下对应得最大转速
  float vert_step_1_8_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_16_en;//是否有效，0无效，1有效
  float vert_step_1_16_v_max;//该细分程度下对应得最大转速
  float vert_step_1_16_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_32_en;//是否有效，0无效，1有效
  float vert_step_1_32_v_max;//该细分程度下对应得最大转速
  float vert_step_1_32_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_64_en;//是否有效，0无效，1有效
  float vert_step_1_64_v_max;//该细分程度下对应得最大转速
  float vert_step_1_64_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_128_en;//是否有效，0无效，1有效
  float vert_step_1_128_v_max;//该细分程度下对应得最大转速
  float vert_step_1_128_v_min;//该细分程度下对应得最小转速
  
  char vert_step_1_256_en;//是否有效，0无效，1有效
  float vert_step_1_256_v_max;//该细分程度下对应得最大转速
  float vert_step_1_256_v_min;//该细分程度下对应得最小转速
  
  unsigned char vert_work_torque;//工作时torque的值
//  unsigned char vert_self_lock_micr;//自锁时，采用的细分等级，值为0，1，2，3，4，5，6，7，8
//  unsigned char vert_self_lock_torque;//自锁时，torque的值
  
  unsigned char vert_global_scaler;//电流全局缩放
  
  unsigned short int vert_acc_time_max;//电机从0加速到最大速度所用时间
  unsigned short int vert_dec_time_max;//电机从最大速度减速到0所用时间
  
  unsigned int crc;//效验码
}TMC2160Parameter;



unsigned long int tmc2160_write_hori_data(char choice, unsigned char x1, unsigned char x2, unsigned char x3,unsigned char x4,unsigned char x5);
unsigned long int tmc2160_ihold_irun_data(unsigned char data);
unsigned long int tmc2160_write_vert_data(char choice, unsigned char x1, unsigned char x2, unsigned char x3,unsigned char x4,unsigned char x5);
unsigned long int tmc2160_chopconf_data(unsigned char data);
char tmc2160_write_register(char choice, unsigned char mode, unsigned char data);
char tmc2160_data_init();
char tmc2160_set_hori_dir(char dir);
char tmc2160_set_vert_dir(char dir);
char tmc2160_hori_motor_enable(char state);
char tmc2160_vert_motor_enable(char state);
void tmc2160_init();
void tmc2160_parameter_process(char dev, PTZ_DATA_PACK *pack);
void tmc2160_parameter_upload(char dev);
void tmc2160_state_return(char dev);
void read_regis();
void restart_tmc2160();


#endif

#endif 
