101 lines
4.7 KiB
C
101 lines
4.7 KiB
C
/*******************************************************************************
|
|
* Copyright © 2019 TRINAMIC Motion Control GmbH & Co. KG
|
|
* (now owned by Analog Devices Inc.),
|
|
*
|
|
* Copyright © 2023 Analog Devices Inc. All Rights Reserved. This software is
|
|
* proprietary & confidential to Analog Devices, Inc. and its licensors.
|
|
*******************************************************************************/
|
|
|
|
|
|
#ifndef TMC_IC_TMC2209_H_
|
|
#define TMC_IC_TMC2209_H_
|
|
|
|
#include "tmc/helpers/Constants.h"
|
|
#include "tmc/helpers/API_Header.h"
|
|
#include "TMC2209_Register.h"
|
|
#include "TMC2209_Constants.h"
|
|
#include "TMC2209_Fields.h"
|
|
|
|
// Helper macros
|
|
#define TMC2209_FIELD_READ(tdef, address, mask, shift) \
|
|
FIELD_GET(tmc2209_readInt(tdef, address), mask, shift)
|
|
#define TMC2209_FIELD_UPDATE(tdef, address, mask, shift, value) \
|
|
(tmc2209_writeInt(tdef, address, FIELD_SET(tmc2209_readInt(tdef, address), mask, shift, value)))
|
|
|
|
// Usage note: use 1 TypeDef per IC
|
|
typedef struct {
|
|
ConfigurationTypeDef *config;
|
|
|
|
int32_t registerResetState[TMC2209_REGISTER_COUNT];
|
|
uint8_t registerAccess[TMC2209_REGISTER_COUNT];
|
|
|
|
uint8_t slaveAddress;
|
|
} TMC2209TypeDef;
|
|
|
|
typedef void (*tmc2209_callback)(TMC2209TypeDef*, ConfigState);
|
|
|
|
// Default Register values
|
|
#define R00 0x00000040 // GCONF
|
|
#define R10 0x00071703 // IHOLD_IRUN
|
|
#define R11 0x00000014 // TPOWERDOWN
|
|
#define R6C 0x10000053 // CHOPCONF
|
|
#define R70 0xC10D0024 // PWMCONF
|
|
|
|
// Register access permissions:
|
|
// 0x00: none (reserved)
|
|
// 0x01: read
|
|
// 0x02: write
|
|
// 0x03: read/write
|
|
// 0x13: read/write, separate functions/values for reading or writing
|
|
// 0x23: read/write, flag register (write to clear)
|
|
// 0x42: write, has hardware presets on reset
|
|
static const uint8_t tmc2209_defaultRegisterAccess[TMC2209_REGISTER_COUNT] =
|
|
{
|
|
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
0x03, 0x23, 0x01, 0x02, 0x02, 0x01, 0x01, 0x03, ____, ____, ____, ____, ____, ____, ____, ____, // 0x00 - 0x0F
|
|
0x02, 0x02, 0x01, 0x02, 0x02, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, // 0x10 - 0x1F
|
|
____, ____, 0x02, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, // 0x20 - 0x2F
|
|
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, // 0x30 - 0x3F
|
|
0x02, 0x01, 0x02, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, // 0x40 - 0x4F
|
|
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, // 0x50 - 0x5F
|
|
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, 0x01, 0x01, 0x03, ____, ____, 0x01, // 0x60 - 0x6F
|
|
0x03, 0x01, 0x01, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ // 0x70 - 0x7F
|
|
};
|
|
|
|
static const int32_t tmc2209_defaultRegisterResetState[TMC2209_REGISTER_COUNT] =
|
|
{
|
|
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
R00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x00 - 0x0F
|
|
R10, R11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x10 - 0x1F
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x20 - 0x2F
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x30 - 0x3F
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x40 - 0x4F
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x50 - 0x5F
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, R6C, 0, 0, 0, // 0x60 - 0x6F
|
|
R70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 0x70 - 0x7F
|
|
};
|
|
|
|
// Undefine the default register values.
|
|
// This prevents warnings in case multiple TMC-API chip headers are included at once
|
|
#undef R00
|
|
#undef R10
|
|
#undef R11
|
|
#undef R6C
|
|
#undef R70
|
|
|
|
// Communication
|
|
void tmc2209_writeInt(TMC2209TypeDef *tmc2209, uint8_t address, int32_t value);
|
|
int32_t tmc2209_readInt(TMC2209TypeDef *tmc2209, uint8_t address);
|
|
|
|
void tmc2209_init(TMC2209TypeDef *tmc2209, uint8_t channel, uint8_t slaveAddress, ConfigurationTypeDef *tmc2209_config, const int32_t *registerResetState);
|
|
uint8_t tmc2209_reset(TMC2209TypeDef *tmc2209);
|
|
uint8_t tmc2209_restore(TMC2209TypeDef *tmc2209);
|
|
void tmc2209_setRegisterResetState(TMC2209TypeDef *tmc2209, const int32_t *resetState);
|
|
void tmc2209_setCallback(TMC2209TypeDef *tmc2209, tmc2209_callback callback);
|
|
void tmc2209_periodicJob(TMC2209TypeDef *tmc2209, uint32_t tick);
|
|
|
|
uint8_t tmc2209_get_slave(TMC2209TypeDef *tmc2209);
|
|
void tmc2209_set_slave(TMC2209TypeDef *tmc2209, uint8_t slaveAddress);
|
|
|
|
#endif /* TMC_IC_TMC2209_H_ */
|