Davide Aliprandi / X_NUCLEO_IHM03A1

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Fork of X_NUCLEO_IHM03A1 by ST

Committer:
nucleosam
Date:
Tue Apr 05 15:18:56 2016 +0000
Revision:
0:00a3c3f5a8f0
Child:
1:8ce2a5d6fbf8
Initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nucleosam 0:00a3c3f5a8f0 1 /**
nucleosam 0:00a3c3f5a8f0 2 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 3 * @file powerstep01_class.cpp
nucleosam 0:00a3c3f5a8f0 4 * @author IPC Rennes
nucleosam 0:00a3c3f5a8f0 5 * @version V1.0.0
nucleosam 0:00a3c3f5a8f0 6 * @date March 18th, 2016
nucleosam 0:00a3c3f5a8f0 7 * @brief Powerstep01 motor driver (Microstepping controller with power MOSFETs)
nucleosam 0:00a3c3f5a8f0 8 * @note (C) COPYRIGHT 2016 STMicroelectronics
nucleosam 0:00a3c3f5a8f0 9 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 10 * @attention
nucleosam 0:00a3c3f5a8f0 11 *
nucleosam 0:00a3c3f5a8f0 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
nucleosam 0:00a3c3f5a8f0 13 *
nucleosam 0:00a3c3f5a8f0 14 * Redistribution and use in source and binary forms, with or without modification,
nucleosam 0:00a3c3f5a8f0 15 * are permitted provided that the following conditions are met:
nucleosam 0:00a3c3f5a8f0 16 * 1. Redistributions of source code must retain the above copyright notice,
nucleosam 0:00a3c3f5a8f0 17 * this list of conditions and the following disclaimer.
nucleosam 0:00a3c3f5a8f0 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
nucleosam 0:00a3c3f5a8f0 19 * this list of conditions and the following disclaimer in the documentation
nucleosam 0:00a3c3f5a8f0 20 * and/or other materials provided with the distribution.
nucleosam 0:00a3c3f5a8f0 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
nucleosam 0:00a3c3f5a8f0 22 * may be used to endorse or promote products derived from this software
nucleosam 0:00a3c3f5a8f0 23 * without specific prior written permission.
nucleosam 0:00a3c3f5a8f0 24 *
nucleosam 0:00a3c3f5a8f0 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
nucleosam 0:00a3c3f5a8f0 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
nucleosam 0:00a3c3f5a8f0 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
nucleosam 0:00a3c3f5a8f0 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
nucleosam 0:00a3c3f5a8f0 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nucleosam 0:00a3c3f5a8f0 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
nucleosam 0:00a3c3f5a8f0 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
nucleosam 0:00a3c3f5a8f0 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
nucleosam 0:00a3c3f5a8f0 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nucleosam 0:00a3c3f5a8f0 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nucleosam 0:00a3c3f5a8f0 35 *
nucleosam 0:00a3c3f5a8f0 36 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 37 */
nucleosam 0:00a3c3f5a8f0 38
nucleosam 0:00a3c3f5a8f0 39 /* Includes ------------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 40 #include "powerstep01_class.h"
nucleosam 0:00a3c3f5a8f0 41
nucleosam 0:00a3c3f5a8f0 42 /* Definitions ---------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 43
nucleosam 0:00a3c3f5a8f0 44 /* Error while initialising the SPI. */
nucleosam 0:00a3c3f5a8f0 45 #define POWERSTEP01_ERROR_0 (0x8000)
nucleosam 0:00a3c3f5a8f0 46
nucleosam 0:00a3c3f5a8f0 47 /* Error of bad SPI transaction. */
nucleosam 0:00a3c3f5a8f0 48 #define POWERSTEP01_ERROR_1 (0x8001)
nucleosam 0:00a3c3f5a8f0 49
nucleosam 0:00a3c3f5a8f0 50 /* Variables ----------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 51
nucleosam 0:00a3c3f5a8f0 52 /* Number of devices. */
nucleosam 0:00a3c3f5a8f0 53 uint8_t POWERSTEP01::numberOfDevices = 0;
nucleosam 0:00a3c3f5a8f0 54
nucleosam 0:00a3c3f5a8f0 55 /* ISR flags used to restart an interrupted SPI transfer when an error is reported. */
nucleosam 0:00a3c3f5a8f0 56 bool POWERSTEP01::spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 57 bool POWERSTEP01::isrFlag = FALSE;
nucleosam 0:00a3c3f5a8f0 58
nucleosam 0:00a3c3f5a8f0 59 /* SPI Transmission for Daisy-Chain Configuration. */
nucleosam 0:00a3c3f5a8f0 60 uint8_t POWERSTEP01::spiTxBursts[POWERSTEP01_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
nucleosam 0:00a3c3f5a8f0 61 uint8_t POWERSTEP01::spiRxBursts[POWERSTEP01_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
nucleosam 0:00a3c3f5a8f0 62
nucleosam 0:00a3c3f5a8f0 63
nucleosam 0:00a3c3f5a8f0 64 /* Methods -------------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 65
nucleosam 0:00a3c3f5a8f0 66 /**********************************************************
nucleosam 0:00a3c3f5a8f0 67 * @brief Starts the Powerstep01 library
nucleosam 0:00a3c3f5a8f0 68 * @param[in] pInit pointer to the initialization data
nucleosam 0:00a3c3f5a8f0 69 * @retval COMPONENT_OK in case of success.
nucleosam 0:00a3c3f5a8f0 70 **********************************************************/
nucleosam 0:00a3c3f5a8f0 71 Status_t POWERSTEP01::Powerstep01_Init(void* pInit)
nucleosam 0:00a3c3f5a8f0 72 {
nucleosam 0:00a3c3f5a8f0 73
nucleosam 0:00a3c3f5a8f0 74 /* configure the step clock */
nucleosam 0:00a3c3f5a8f0 75 Powerstep01_Board_StepClockInit();
nucleosam 0:00a3c3f5a8f0 76
nucleosam 0:00a3c3f5a8f0 77 /* Standby-reset deactivation */
nucleosam 0:00a3c3f5a8f0 78 Powerstep01_Board_ReleaseReset();
nucleosam 0:00a3c3f5a8f0 79
nucleosam 0:00a3c3f5a8f0 80 /* Let a delay after reset */
nucleosam 0:00a3c3f5a8f0 81 Powerstep01_Board_Delay(1);
nucleosam 0:00a3c3f5a8f0 82
nucleosam 0:00a3c3f5a8f0 83 if (pInit == 0)
nucleosam 0:00a3c3f5a8f0 84 {
nucleosam 0:00a3c3f5a8f0 85 // Set all registers to their predefined values
nucleosam 0:00a3c3f5a8f0 86 // from powerstep01_target_config.h
nucleosam 0:00a3c3f5a8f0 87 Powerstep01_SetRegisterToPredefinedValues();
nucleosam 0:00a3c3f5a8f0 88 }
nucleosam 0:00a3c3f5a8f0 89 else
nucleosam 0:00a3c3f5a8f0 90 {
nucleosam 0:00a3c3f5a8f0 91 Powerstep01_SetDeviceParamsToGivenValues((powerstep01_Init_u_t*) pInit);
nucleosam 0:00a3c3f5a8f0 92 }
nucleosam 0:00a3c3f5a8f0 93
nucleosam 0:00a3c3f5a8f0 94 // Put the Powerstep01 in HiZ state
nucleosam 0:00a3c3f5a8f0 95 Powerstep01_CmdHardHiZ();
nucleosam 0:00a3c3f5a8f0 96
nucleosam 0:00a3c3f5a8f0 97 Powerstep01_FetchAndClearAllStatus();
nucleosam 0:00a3c3f5a8f0 98
nucleosam 0:00a3c3f5a8f0 99 return COMPONENT_OK;
nucleosam 0:00a3c3f5a8f0 100 }
nucleosam 0:00a3c3f5a8f0 101
nucleosam 0:00a3c3f5a8f0 102 /**********************************************************
nucleosam 0:00a3c3f5a8f0 103 * @brief Read id
nucleosam 0:00a3c3f5a8f0 104 * @param[in] id pointer to the identifier to be read.
nucleosam 0:00a3c3f5a8f0 105 * @retval COMPONENT_OK in case of success.
nucleosam 0:00a3c3f5a8f0 106 **********************************************************/
nucleosam 0:00a3c3f5a8f0 107 Status_t POWERSTEP01::Powerstep01_ReadID(uint8_t *id)
nucleosam 0:00a3c3f5a8f0 108 {
nucleosam 0:00a3c3f5a8f0 109 *id = deviceInstance;
nucleosam 0:00a3c3f5a8f0 110
nucleosam 0:00a3c3f5a8f0 111 return COMPONENT_OK;
nucleosam 0:00a3c3f5a8f0 112 }
nucleosam 0:00a3c3f5a8f0 113
nucleosam 0:00a3c3f5a8f0 114 /**********************************************************
nucleosam 0:00a3c3f5a8f0 115 * @brief Attaches a user callback to the error Handler.
nucleosam 0:00a3c3f5a8f0 116 * The call back will be then called each time the library
nucleosam 0:00a3c3f5a8f0 117 * detects an error
nucleosam 0:00a3c3f5a8f0 118 * @param[in] callback Name of the callback to attach
nucleosam 0:00a3c3f5a8f0 119 * to the error Hanlder
nucleosam 0:00a3c3f5a8f0 120 * @retval None
nucleosam 0:00a3c3f5a8f0 121 **********************************************************/
nucleosam 0:00a3c3f5a8f0 122 void POWERSTEP01::Powerstep01_AttachErrorHandler(void (*callback)(uint16_t error))
nucleosam 0:00a3c3f5a8f0 123 {
nucleosam 0:00a3c3f5a8f0 124 errorHandlerCallback = (void (*)(uint16_t error)) callback;
nucleosam 0:00a3c3f5a8f0 125 }
nucleosam 0:00a3c3f5a8f0 126
nucleosam 0:00a3c3f5a8f0 127 /**********************************************************
nucleosam 0:00a3c3f5a8f0 128 * @brief Issues the GetStatus command to the Powerstep01 device
nucleosam 0:00a3c3f5a8f0 129 * @retval Status Register value
nucleosam 0:00a3c3f5a8f0 130 * @note Once the GetStatus command is performed, the flags of the
nucleosam 0:00a3c3f5a8f0 131 * status register are reset.
nucleosam 0:00a3c3f5a8f0 132 * This is not the case when the status register is read with the
nucleosam 0:00a3c3f5a8f0 133 * GetParam command (via the functions Powerstep01_ReadStatusRegister
nucleosam 0:00a3c3f5a8f0 134 * or Powerstep01_CmdGetParam).
nucleosam 0:00a3c3f5a8f0 135 **********************************************************/
nucleosam 0:00a3c3f5a8f0 136 uint16_t POWERSTEP01::Powerstep01_CmdGetStatus(void)
nucleosam 0:00a3c3f5a8f0 137 {
nucleosam 0:00a3c3f5a8f0 138 uint16_t status = 0;
nucleosam 0:00a3c3f5a8f0 139 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 140 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 141 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 142
nucleosam 0:00a3c3f5a8f0 143 do
nucleosam 0:00a3c3f5a8f0 144 {
nucleosam 0:00a3c3f5a8f0 145 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 146 if (itDisable)
nucleosam 0:00a3c3f5a8f0 147 {
nucleosam 0:00a3c3f5a8f0 148 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 149 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 150 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 151 }
nucleosam 0:00a3c3f5a8f0 152 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 153 {
nucleosam 0:00a3c3f5a8f0 154 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 155 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 156 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 157 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 158 spiRxBursts[0][loop] = 0;
nucleosam 0:00a3c3f5a8f0 159 spiRxBursts[1][loop] = 0;
nucleosam 0:00a3c3f5a8f0 160 spiRxBursts[2][loop] = 0;
nucleosam 0:00a3c3f5a8f0 161 spiRxBursts[3][loop] = 0;
nucleosam 0:00a3c3f5a8f0 162 }
nucleosam 0:00a3c3f5a8f0 163 spiTxBursts[0][spiIndex] = POWERSTEP01_GET_STATUS;
nucleosam 0:00a3c3f5a8f0 164 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 165 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 166 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 167 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 168 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 169 for (loop = 0; loop < POWERSTEP01_CMD_ARG_NB_BYTES_GET_STATUS + POWERSTEP01_RSP_NB_BYTES_GET_STATUS; loop++)
nucleosam 0:00a3c3f5a8f0 170 {
nucleosam 0:00a3c3f5a8f0 171 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 172 }
nucleosam 0:00a3c3f5a8f0 173 status = (spiRxBursts[1][spiIndex] << 8) | (spiRxBursts[2][spiIndex]);
nucleosam 0:00a3c3f5a8f0 174 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 175 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 176
nucleosam 0:00a3c3f5a8f0 177 return (status);
nucleosam 0:00a3c3f5a8f0 178 }
nucleosam 0:00a3c3f5a8f0 179
nucleosam 0:00a3c3f5a8f0 180 /**********************************************************
nucleosam 0:00a3c3f5a8f0 181 * @brief Requests the motor to move to the home position (ABS_POSITION = 0)
nucleosam 0:00a3c3f5a8f0 182 * @retval None
nucleosam 0:00a3c3f5a8f0 183 **********************************************************/
nucleosam 0:00a3c3f5a8f0 184 void POWERSTEP01::Powerstep01_CmdGoHome(void)
nucleosam 0:00a3c3f5a8f0 185 {
nucleosam 0:00a3c3f5a8f0 186 Powerstep01_SendCommand(POWERSTEP01_GO_HOME, 0);
nucleosam 0:00a3c3f5a8f0 187 }
nucleosam 0:00a3c3f5a8f0 188
nucleosam 0:00a3c3f5a8f0 189 /**********************************************************
nucleosam 0:00a3c3f5a8f0 190 * @brief Requests the motor to move to the mark position
nucleosam 0:00a3c3f5a8f0 191 * @retval None
nucleosam 0:00a3c3f5a8f0 192 **********************************************************/
nucleosam 0:00a3c3f5a8f0 193 void POWERSTEP01::Powerstep01_CmdGoMark(void)
nucleosam 0:00a3c3f5a8f0 194 {
nucleosam 0:00a3c3f5a8f0 195 Powerstep01_SendCommand(POWERSTEP01_GO_MARK, 0);
nucleosam 0:00a3c3f5a8f0 196 }
nucleosam 0:00a3c3f5a8f0 197
nucleosam 0:00a3c3f5a8f0 198 /**********************************************************
nucleosam 0:00a3c3f5a8f0 199 * @brief Requests the motor to move to the specified position
nucleosam 0:00a3c3f5a8f0 200 * @param[in] targetPosition absolute position in steps
nucleosam 0:00a3c3f5a8f0 201 * @retval None
nucleosam 0:00a3c3f5a8f0 202 **********************************************************/
nucleosam 0:00a3c3f5a8f0 203 void POWERSTEP01::Powerstep01_CmdGoTo(int32_t targetPosition)
nucleosam 0:00a3c3f5a8f0 204 {
nucleosam 0:00a3c3f5a8f0 205 Powerstep01_SendCommand(POWERSTEP01_GO_TO, targetPosition);
nucleosam 0:00a3c3f5a8f0 206 }
nucleosam 0:00a3c3f5a8f0 207
nucleosam 0:00a3c3f5a8f0 208 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 209 * @brief Issues PowerStep01 Go To Dir command
nucleosam 0:00a3c3f5a8f0 210 * @param[in] direction movement direction
nucleosam 0:00a3c3f5a8f0 211 * @param[in] abs_pos absolute position where requested to move
nucleosam 0:00a3c3f5a8f0 212 * @retval None
nucleosam 0:00a3c3f5a8f0 213 *********************************************************/
nucleosam 0:00a3c3f5a8f0 214 void POWERSTEP01::Powerstep01_CmdGoToDir(motorDir_t direction,
nucleosam 0:00a3c3f5a8f0 215 int32_t abs_pos)
nucleosam 0:00a3c3f5a8f0 216 {
nucleosam 0:00a3c3f5a8f0 217 Powerstep01_SendCommand((uint8_t)POWERSTEP01_GO_TO_DIR|
nucleosam 0:00a3c3f5a8f0 218 (uint8_t)direction, abs_pos);
nucleosam 0:00a3c3f5a8f0 219 }
nucleosam 0:00a3c3f5a8f0 220
nucleosam 0:00a3c3f5a8f0 221 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 222 * @brief Issues PowerStep01 Go Until command
nucleosam 0:00a3c3f5a8f0 223 * @param[in] action ACTION_RESET or ACTION_COPY
nucleosam 0:00a3c3f5a8f0 224 * @param[in] direction movement direction
nucleosam 0:00a3c3f5a8f0 225 * @param[in] speed in steps/tick
nucleosam 0:00a3c3f5a8f0 226 * @retval None
nucleosam 0:00a3c3f5a8f0 227 *********************************************************/
nucleosam 0:00a3c3f5a8f0 228 void POWERSTEP01::Powerstep01_CmdGoUntil(motorAction_t action,
nucleosam 0:00a3c3f5a8f0 229 motorDir_t direction,
nucleosam 0:00a3c3f5a8f0 230 uint32_t speed)
nucleosam 0:00a3c3f5a8f0 231 {
nucleosam 0:00a3c3f5a8f0 232 Powerstep01_SendCommand(
nucleosam 0:00a3c3f5a8f0 233 (uint8_t)POWERSTEP01_GO_UNTIL|(uint8_t)action|(uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 234 speed);
nucleosam 0:00a3c3f5a8f0 235 }
nucleosam 0:00a3c3f5a8f0 236
nucleosam 0:00a3c3f5a8f0 237 /**********************************************************
nucleosam 0:00a3c3f5a8f0 238 * @brief Immediatly stops the motor and disable the power bridge
nucleosam 0:00a3c3f5a8f0 239 * @retval None
nucleosam 0:00a3c3f5a8f0 240 * @note The HardHiZ command immediately disables the power bridges
nucleosam 0:00a3c3f5a8f0 241 * (high impedance state) and raises the HiZ flag.
nucleosam 0:00a3c3f5a8f0 242 * When the motor is stopped, a HardHiZ command forces the bridges
nucleosam 0:00a3c3f5a8f0 243 * to enter high impedance state.
nucleosam 0:00a3c3f5a8f0 244 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 245 *********************************************************/
nucleosam 0:00a3c3f5a8f0 246 void POWERSTEP01::Powerstep01_CmdHardHiZ(void)
nucleosam 0:00a3c3f5a8f0 247 {
nucleosam 0:00a3c3f5a8f0 248 Powerstep01_SendCommand(POWERSTEP01_HARD_HIZ, 0);
nucleosam 0:00a3c3f5a8f0 249 }
nucleosam 0:00a3c3f5a8f0 250
nucleosam 0:00a3c3f5a8f0 251 /**********************************************************
nucleosam 0:00a3c3f5a8f0 252 * @brief Immediatly stops the motor and disable the power bridge
nucleosam 0:00a3c3f5a8f0 253 * @retval None
nucleosam 0:00a3c3f5a8f0 254 * @note The HardStop command causes an immediate motor stop with
nucleosam 0:00a3c3f5a8f0 255 * infinite deceleration.
nucleosam 0:00a3c3f5a8f0 256 * When the motor is in high impedance state, a HardStop command
nucleosam 0:00a3c3f5a8f0 257 * forces the bridges to exit high impedance state; no motion is performed.
nucleosam 0:00a3c3f5a8f0 258 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 259 * This command keeps the BUSY flag low until the motor is stopped.
nucleosam 0:00a3c3f5a8f0 260 **********************************************************/
nucleosam 0:00a3c3f5a8f0 261 void POWERSTEP01::Powerstep01_CmdHardStop(void)
nucleosam 0:00a3c3f5a8f0 262 {
nucleosam 0:00a3c3f5a8f0 263 Powerstep01_SendCommand(POWERSTEP01_HARD_STOP, 0);
nucleosam 0:00a3c3f5a8f0 264 }
nucleosam 0:00a3c3f5a8f0 265
nucleosam 0:00a3c3f5a8f0 266 /**********************************************************
nucleosam 0:00a3c3f5a8f0 267 * @brief Moves the motor of the specified number of steps
nucleosam 0:00a3c3f5a8f0 268 * @param[in] direction FORWARD or BACKWARD
nucleosam 0:00a3c3f5a8f0 269 * @param[in] stepCount Number of steps to perform
nucleosam 0:00a3c3f5a8f0 270 * @retval None
nucleosam 0:00a3c3f5a8f0 271 **********************************************************/
nucleosam 0:00a3c3f5a8f0 272 void POWERSTEP01::Powerstep01_CmdMove(motorDir_t direction,
nucleosam 0:00a3c3f5a8f0 273 uint32_t stepCount)
nucleosam 0:00a3c3f5a8f0 274 {
nucleosam 0:00a3c3f5a8f0 275 Powerstep01_SendCommand((uint8_t)POWERSTEP01_MOVE|(uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 276 stepCount);
nucleosam 0:00a3c3f5a8f0 277 }
nucleosam 0:00a3c3f5a8f0 278
nucleosam 0:00a3c3f5a8f0 279 /**********************************************************
nucleosam 0:00a3c3f5a8f0 280 * @brief Issues the Nop command to the Powerstep01 device
nucleosam 0:00a3c3f5a8f0 281 * @retval None
nucleosam 0:00a3c3f5a8f0 282 **********************************************************/
nucleosam 0:00a3c3f5a8f0 283 void POWERSTEP01::Powerstep01_CmdNop(void)
nucleosam 0:00a3c3f5a8f0 284 {
nucleosam 0:00a3c3f5a8f0 285 Powerstep01_SendCommand(POWERSTEP01_NOP, 0);
nucleosam 0:00a3c3f5a8f0 286 }
nucleosam 0:00a3c3f5a8f0 287
nucleosam 0:00a3c3f5a8f0 288 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 289 * @brief Issues PowerStep01 Release SW command
nucleosam 0:00a3c3f5a8f0 290 * @param[in] action type of action to undertake when the SW
nucleosam 0:00a3c3f5a8f0 291 * input is forced high
nucleosam 0:00a3c3f5a8f0 292 * @param[in] direction movement direction
nucleosam 0:00a3c3f5a8f0 293 * @retval None
nucleosam 0:00a3c3f5a8f0 294 *********************************************************/
nucleosam 0:00a3c3f5a8f0 295 void POWERSTEP01::Powerstep01_CmdReleaseSw(motorAction_t action,
nucleosam 0:00a3c3f5a8f0 296 motorDir_t direction)
nucleosam 0:00a3c3f5a8f0 297 {
nucleosam 0:00a3c3f5a8f0 298 Powerstep01_SendCommand((uint8_t)POWERSTEP01_RELEASE_SW|
nucleosam 0:00a3c3f5a8f0 299 (uint8_t)action|
nucleosam 0:00a3c3f5a8f0 300 (uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 301 0);
nucleosam 0:00a3c3f5a8f0 302 }
nucleosam 0:00a3c3f5a8f0 303
nucleosam 0:00a3c3f5a8f0 304 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 305 * @brief Issues PowerStep01 Reset Device command
nucleosam 0:00a3c3f5a8f0 306 * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 )
nucleosam 0:00a3c3f5a8f0 307 * @retval None
nucleosam 0:00a3c3f5a8f0 308 *********************************************************/
nucleosam 0:00a3c3f5a8f0 309 void POWERSTEP01::Powerstep01_CmdResetDevice(void)
nucleosam 0:00a3c3f5a8f0 310 {
nucleosam 0:00a3c3f5a8f0 311 Powerstep01_SendCommand(POWERSTEP01_RESET_DEVICE, 0);
nucleosam 0:00a3c3f5a8f0 312 }
nucleosam 0:00a3c3f5a8f0 313
nucleosam 0:00a3c3f5a8f0 314 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 315 * @brief Issues PowerStep01 Reset Pos command
nucleosam 0:00a3c3f5a8f0 316 * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 )
nucleosam 0:00a3c3f5a8f0 317 * @retval None
nucleosam 0:00a3c3f5a8f0 318 *********************************************************/
nucleosam 0:00a3c3f5a8f0 319 void POWERSTEP01::Powerstep01_CmdResetPos(void)
nucleosam 0:00a3c3f5a8f0 320 {
nucleosam 0:00a3c3f5a8f0 321 Powerstep01_SendCommand(POWERSTEP01_RESET_POS, 0);
nucleosam 0:00a3c3f5a8f0 322 }
nucleosam 0:00a3c3f5a8f0 323
nucleosam 0:00a3c3f5a8f0 324 /**********************************************************
nucleosam 0:00a3c3f5a8f0 325 * @brief Runs the motor. It will accelerate from the min
nucleosam 0:00a3c3f5a8f0 326 * speed up to the max speed by using the device acceleration.
nucleosam 0:00a3c3f5a8f0 327 * @param[in] direction FORWARD or BACKWARD
nucleosam 0:00a3c3f5a8f0 328 * @param[in] speed in steps/s
nucleosam 0:00a3c3f5a8f0 329 * @retval None
nucleosam 0:00a3c3f5a8f0 330 **********************************************************/
nucleosam 0:00a3c3f5a8f0 331 void POWERSTEP01::Powerstep01_CmdRun(motorDir_t direction, uint32_t speed)
nucleosam 0:00a3c3f5a8f0 332 {
nucleosam 0:00a3c3f5a8f0 333 Powerstep01_SendCommand((uint8_t)POWERSTEP01_RUN|(uint8_t)direction, speed);
nucleosam 0:00a3c3f5a8f0 334 }
nucleosam 0:00a3c3f5a8f0 335
nucleosam 0:00a3c3f5a8f0 336 /**********************************************************
nucleosam 0:00a3c3f5a8f0 337 * @brief Stops the motor by using the device deceleration
nucleosam 0:00a3c3f5a8f0 338 * and disables the power bridges
nucleosam 0:00a3c3f5a8f0 339 * @retval None
nucleosam 0:00a3c3f5a8f0 340 * @note The SoftHiZ command disables the power bridges
nucleosam 0:00a3c3f5a8f0 341 * (high impedance state) after a deceleration to zero.
nucleosam 0:00a3c3f5a8f0 342 * The deceleration value used is the one stored in the DEC register.
nucleosam 0:00a3c3f5a8f0 343 * When bridges are disabled, the HiZ flag is raised.
nucleosam 0:00a3c3f5a8f0 344 * When the motor is stopped, a SoftHiZ command forces the bridges
nucleosam 0:00a3c3f5a8f0 345 * to enter high impedance state.
nucleosam 0:00a3c3f5a8f0 346 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 347 * This command keeps the BUSY flag low until the motor is stopped.
nucleosam 0:00a3c3f5a8f0 348 *********************************************************/
nucleosam 0:00a3c3f5a8f0 349 void POWERSTEP01::Powerstep01_CmdSoftHiZ(void)
nucleosam 0:00a3c3f5a8f0 350 {
nucleosam 0:00a3c3f5a8f0 351 Powerstep01_SendCommand(POWERSTEP01_SOFT_HIZ, 0);
nucleosam 0:00a3c3f5a8f0 352 }
nucleosam 0:00a3c3f5a8f0 353
nucleosam 0:00a3c3f5a8f0 354 /**********************************************************
nucleosam 0:00a3c3f5a8f0 355 * @brief Stops the motor by using the device deceleration
nucleosam 0:00a3c3f5a8f0 356 * @retval None
nucleosam 0:00a3c3f5a8f0 357 * @note The SoftStop command causes an immediate deceleration
nucleosam 0:00a3c3f5a8f0 358 * to zero speed and a consequent motor stop.
nucleosam 0:00a3c3f5a8f0 359 * The deceleration value used is the one stored in the DEC register.
nucleosam 0:00a3c3f5a8f0 360 * When the motor is in high impedance state, a SoftStop
nucleosam 0:00a3c3f5a8f0 361 * command forces the bridges to exit from high impedance state.
nucleosam 0:00a3c3f5a8f0 362 * No motion is performed.
nucleosam 0:00a3c3f5a8f0 363 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 364 * This command keeps the BUSY flag low until the motor is stopped.
nucleosam 0:00a3c3f5a8f0 365 **********************************************************/
nucleosam 0:00a3c3f5a8f0 366 void POWERSTEP01::Powerstep01_CmdSoftStop(void)
nucleosam 0:00a3c3f5a8f0 367 {
nucleosam 0:00a3c3f5a8f0 368 Powerstep01_SendCommand(POWERSTEP01_SOFT_STOP, 0);
nucleosam 0:00a3c3f5a8f0 369 }
nucleosam 0:00a3c3f5a8f0 370
nucleosam 0:00a3c3f5a8f0 371 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 372 * @brief Issues PowerStep01 Step Clock command
nucleosam 0:00a3c3f5a8f0 373 * @param[in] direction Movement direction (FORWARD, BACKWARD)
nucleosam 0:00a3c3f5a8f0 374 * @retval None
nucleosam 0:00a3c3f5a8f0 375 *********************************************************/
nucleosam 0:00a3c3f5a8f0 376 void POWERSTEP01::Powerstep01_CmdStepClock(motorDir_t direction)
nucleosam 0:00a3c3f5a8f0 377 {
nucleosam 0:00a3c3f5a8f0 378 Powerstep01_SendCommand((uint8_t)POWERSTEP01_STEP_CLOCK|(uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 379 0);
nucleosam 0:00a3c3f5a8f0 380 }
nucleosam 0:00a3c3f5a8f0 381
nucleosam 0:00a3c3f5a8f0 382 /**********************************************************
nucleosam 0:00a3c3f5a8f0 383 * @brief Error handler which calls the user callback (if defined)
nucleosam 0:00a3c3f5a8f0 384 * @param[in] error Number of the error
nucleosam 0:00a3c3f5a8f0 385 * @retval None
nucleosam 0:00a3c3f5a8f0 386 **********************************************************/
nucleosam 0:00a3c3f5a8f0 387 void POWERSTEP01::Powerstep01_ErrorHandler(uint16_t error)
nucleosam 0:00a3c3f5a8f0 388 {
nucleosam 0:00a3c3f5a8f0 389 if (errorHandlerCallback != 0)
nucleosam 0:00a3c3f5a8f0 390 {
nucleosam 0:00a3c3f5a8f0 391 (void) errorHandlerCallback(error);
nucleosam 0:00a3c3f5a8f0 392 }
nucleosam 0:00a3c3f5a8f0 393 else
nucleosam 0:00a3c3f5a8f0 394 {
nucleosam 0:00a3c3f5a8f0 395 /* Aborting the program. */
nucleosam 0:00a3c3f5a8f0 396 exit(EXIT_FAILURE);
nucleosam 0:00a3c3f5a8f0 397 }
nucleosam 0:00a3c3f5a8f0 398 }
nucleosam 0:00a3c3f5a8f0 399
nucleosam 0:00a3c3f5a8f0 400 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 401 * @brief Fetch and clear status flags of all devices
nucleosam 0:00a3c3f5a8f0 402 * by issuing a GET_STATUS command simultaneously
nucleosam 0:00a3c3f5a8f0 403 * to all devices.
nucleosam 0:00a3c3f5a8f0 404 * Then, the fetched status of each device can be retrieved
nucleosam 0:00a3c3f5a8f0 405 * by using the Powerstep01_GetFetchedStatus function
nucleosam 0:00a3c3f5a8f0 406 * provided there is no other calls to functions which
nucleosam 0:00a3c3f5a8f0 407 * use the SPI in between.
nucleosam 0:00a3c3f5a8f0 408 * @retval None
nucleosam 0:00a3c3f5a8f0 409 *********************************************************/
nucleosam 0:00a3c3f5a8f0 410 void POWERSTEP01::Powerstep01_FetchAndClearAllStatus(void)
nucleosam 0:00a3c3f5a8f0 411 {
nucleosam 0:00a3c3f5a8f0 412 uint8_t loop;
nucleosam 0:00a3c3f5a8f0 413
nucleosam 0:00a3c3f5a8f0 414 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 415 {
nucleosam 0:00a3c3f5a8f0 416 spiTxBursts[0][loop] = POWERSTEP01_GET_STATUS;
nucleosam 0:00a3c3f5a8f0 417 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 418 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 419 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 420 spiRxBursts[0][loop] = 0;
nucleosam 0:00a3c3f5a8f0 421 spiRxBursts[1][loop] = 0;
nucleosam 0:00a3c3f5a8f0 422 spiRxBursts[2][loop] = 0;
nucleosam 0:00a3c3f5a8f0 423 spiRxBursts[3][loop] = 0;
nucleosam 0:00a3c3f5a8f0 424 }
nucleosam 0:00a3c3f5a8f0 425 for (loop = 0;
nucleosam 0:00a3c3f5a8f0 426 loop < POWERSTEP01_CMD_ARG_NB_BYTES_GET_STATUS +
nucleosam 0:00a3c3f5a8f0 427 POWERSTEP01_RSP_NB_BYTES_GET_STATUS;
nucleosam 0:00a3c3f5a8f0 428 loop++)
nucleosam 0:00a3c3f5a8f0 429 {
nucleosam 0:00a3c3f5a8f0 430 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 431 }
nucleosam 0:00a3c3f5a8f0 432 }
nucleosam 0:00a3c3f5a8f0 433
nucleosam 0:00a3c3f5a8f0 434 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 435 * @brief Get the value of the STATUS register which was
nucleosam 0:00a3c3f5a8f0 436 * fetched by using Powerstep01_FetchAndClearAllStatus.
nucleosam 0:00a3c3f5a8f0 437 * The fetched values are available as long as there
nucleosam 0:00a3c3f5a8f0 438 * no other calls to functions which use the SPI.
nucleosam 0:00a3c3f5a8f0 439 * @retval Last fetched value of the STATUS register
nucleosam 0:00a3c3f5a8f0 440 *********************************************************/
nucleosam 0:00a3c3f5a8f0 441 uint16_t POWERSTEP01::Powerstep01_GetFetchedStatus(void)
nucleosam 0:00a3c3f5a8f0 442 {
nucleosam 0:00a3c3f5a8f0 443 uint16_t status = 0;
nucleosam 0:00a3c3f5a8f0 444 if (numberOfDevices > deviceInstance)
nucleosam 0:00a3c3f5a8f0 445 {
nucleosam 0:00a3c3f5a8f0 446 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 447 status = (spiRxBursts[1][spiIndex] << 8) | (spiRxBursts[2][spiIndex]);
nucleosam 0:00a3c3f5a8f0 448 }
nucleosam 0:00a3c3f5a8f0 449 return (status);
nucleosam 0:00a3c3f5a8f0 450 }
nucleosam 0:00a3c3f5a8f0 451
nucleosam 0:00a3c3f5a8f0 452 /**********************************************************
nucleosam 0:00a3c3f5a8f0 453 * @brief Returns the FW version of the library
nucleosam 0:00a3c3f5a8f0 454 * @retval POWERSTEP01_FW_VERSION
nucleosam 0:00a3c3f5a8f0 455 **********************************************************/
nucleosam 0:00a3c3f5a8f0 456 uint8_t POWERSTEP01::Powerstep01_GetFwVersion(void)
nucleosam 0:00a3c3f5a8f0 457 {
nucleosam 0:00a3c3f5a8f0 458 return (POWERSTEP01_FW_VERSION);
nucleosam 0:00a3c3f5a8f0 459 }
nucleosam 0:00a3c3f5a8f0 460
nucleosam 0:00a3c3f5a8f0 461 /**********************************************************
nucleosam 0:00a3c3f5a8f0 462 * @brief Returns the mark position device
nucleosam 0:00a3c3f5a8f0 463 * @retval Mark register value converted in a 32b signed integer
nucleosam 0:00a3c3f5a8f0 464 **********************************************************/
nucleosam 0:00a3c3f5a8f0 465 int32_t POWERSTEP01::Powerstep01_GetMark(void)
nucleosam 0:00a3c3f5a8f0 466 {
nucleosam 0:00a3c3f5a8f0 467 return Powerstep01_ConvertPosition(Powerstep01_CmdGetParam(POWERSTEP01_MARK));
nucleosam 0:00a3c3f5a8f0 468 }
nucleosam 0:00a3c3f5a8f0 469
nucleosam 0:00a3c3f5a8f0 470 /**********************************************************
nucleosam 0:00a3c3f5a8f0 471 * @brief Returns the ABS_POSITION device
nucleosam 0:00a3c3f5a8f0 472 * @retval ABS_POSITION register value converted in a 32b signed integer
nucleosam 0:00a3c3f5a8f0 473 **********************************************************/
nucleosam 0:00a3c3f5a8f0 474 int32_t POWERSTEP01::Powerstep01_GetPosition(void)
nucleosam 0:00a3c3f5a8f0 475 {
nucleosam 0:00a3c3f5a8f0 476 return Powerstep01_ConvertPosition(
nucleosam 0:00a3c3f5a8f0 477 Powerstep01_CmdGetParam(POWERSTEP01_ABS_POS));
nucleosam 0:00a3c3f5a8f0 478 }
nucleosam 0:00a3c3f5a8f0 479
nucleosam 0:00a3c3f5a8f0 480 /**********************************************************
nucleosam 0:00a3c3f5a8f0 481 * @brief Checks if the device is busy
nucleosam 0:00a3c3f5a8f0 482 * by reading the Busy flag bit of its status Register
nucleosam 0:00a3c3f5a8f0 483 * This operation clears the status register
nucleosam 0:00a3c3f5a8f0 484 * @retval true if device is busy, false zero
nucleosam 0:00a3c3f5a8f0 485 *********************************************************/
nucleosam 0:00a3c3f5a8f0 486 bool POWERSTEP01::Powerstep01_IsDeviceBusy(void)
nucleosam 0:00a3c3f5a8f0 487 {
nucleosam 0:00a3c3f5a8f0 488 if(!(Powerstep01_CmdGetStatus() & POWERSTEP01_STATUS_BUSY))
nucleosam 0:00a3c3f5a8f0 489 {
nucleosam 0:00a3c3f5a8f0 490 return TRUE;
nucleosam 0:00a3c3f5a8f0 491 }
nucleosam 0:00a3c3f5a8f0 492 else
nucleosam 0:00a3c3f5a8f0 493 {
nucleosam 0:00a3c3f5a8f0 494 return FALSE;
nucleosam 0:00a3c3f5a8f0 495 }
nucleosam 0:00a3c3f5a8f0 496 }
nucleosam 0:00a3c3f5a8f0 497
nucleosam 0:00a3c3f5a8f0 498 /**********************************************************
nucleosam 0:00a3c3f5a8f0 499 * @brief Reads the Status Register value
nucleosam 0:00a3c3f5a8f0 500 * @retval Status register value
nucleosam 0:00a3c3f5a8f0 501 * @note The status register flags are not cleared
nucleosam 0:00a3c3f5a8f0 502 * at the difference with Powerstep01_CmdGetStatus()
nucleosam 0:00a3c3f5a8f0 503 **********************************************************/
nucleosam 0:00a3c3f5a8f0 504 uint16_t POWERSTEP01::Powerstep01_ReadStatusRegister(void)
nucleosam 0:00a3c3f5a8f0 505 {
nucleosam 0:00a3c3f5a8f0 506 return (Powerstep01_CmdGetParam(POWERSTEP01_STATUS));
nucleosam 0:00a3c3f5a8f0 507 }
nucleosam 0:00a3c3f5a8f0 508
nucleosam 0:00a3c3f5a8f0 509 /**********************************************************
nucleosam 0:00a3c3f5a8f0 510 * @brief Set the stepping mode
nucleosam 0:00a3c3f5a8f0 511 * @param[in] stepMode from full step to 1/128 microstep
nucleosam 0:00a3c3f5a8f0 512 * as specified in enum motorStepMode_t
nucleosam 0:00a3c3f5a8f0 513 * @retval None
nucleosam 0:00a3c3f5a8f0 514 **********************************************************/
nucleosam 0:00a3c3f5a8f0 515 void POWERSTEP01::Powerstep01_SelectStepMode(motorStepMode_t stepMode)
nucleosam 0:00a3c3f5a8f0 516 {
nucleosam 0:00a3c3f5a8f0 517 uint8_t stepModeRegister;
nucleosam 0:00a3c3f5a8f0 518 powerstep01_StepSel_t powerstep01StepMode;
nucleosam 0:00a3c3f5a8f0 519
nucleosam 0:00a3c3f5a8f0 520 switch (stepMode)
nucleosam 0:00a3c3f5a8f0 521 {
nucleosam 0:00a3c3f5a8f0 522 case STEP_MODE_FULL:
nucleosam 0:00a3c3f5a8f0 523 powerstep01StepMode = POWERSTEP01_STEP_SEL_1;
nucleosam 0:00a3c3f5a8f0 524 break;
nucleosam 0:00a3c3f5a8f0 525 case STEP_MODE_HALF:
nucleosam 0:00a3c3f5a8f0 526 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_2;
nucleosam 0:00a3c3f5a8f0 527 break;
nucleosam 0:00a3c3f5a8f0 528 case STEP_MODE_1_4:
nucleosam 0:00a3c3f5a8f0 529 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_4;
nucleosam 0:00a3c3f5a8f0 530 break;
nucleosam 0:00a3c3f5a8f0 531 case STEP_MODE_1_8:
nucleosam 0:00a3c3f5a8f0 532 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_8;
nucleosam 0:00a3c3f5a8f0 533 break;
nucleosam 0:00a3c3f5a8f0 534 case STEP_MODE_1_16:
nucleosam 0:00a3c3f5a8f0 535 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_16;
nucleosam 0:00a3c3f5a8f0 536 break;
nucleosam 0:00a3c3f5a8f0 537 case STEP_MODE_1_32:
nucleosam 0:00a3c3f5a8f0 538 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_32;
nucleosam 0:00a3c3f5a8f0 539 break;
nucleosam 0:00a3c3f5a8f0 540 case STEP_MODE_1_64:
nucleosam 0:00a3c3f5a8f0 541 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_64;
nucleosam 0:00a3c3f5a8f0 542 break;
nucleosam 0:00a3c3f5a8f0 543 case STEP_MODE_1_128:
nucleosam 0:00a3c3f5a8f0 544 default:
nucleosam 0:00a3c3f5a8f0 545 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_128;
nucleosam 0:00a3c3f5a8f0 546 break;
nucleosam 0:00a3c3f5a8f0 547 }
nucleosam 0:00a3c3f5a8f0 548
nucleosam 0:00a3c3f5a8f0 549 /* Set the powerstep01 in HiZ state */
nucleosam 0:00a3c3f5a8f0 550 Powerstep01_CmdHardHiZ();
nucleosam 0:00a3c3f5a8f0 551
nucleosam 0:00a3c3f5a8f0 552 /* Read Step mode register and clear STEP_SEL field */
nucleosam 0:00a3c3f5a8f0 553 stepModeRegister = (uint8_t)(0xF8 & Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE)) ;
nucleosam 0:00a3c3f5a8f0 554
nucleosam 0:00a3c3f5a8f0 555 /* Apply new step mode */
nucleosam 0:00a3c3f5a8f0 556 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE, stepModeRegister | (uint8_t)powerstep01StepMode);
nucleosam 0:00a3c3f5a8f0 557
nucleosam 0:00a3c3f5a8f0 558 /* Reset abs pos register */
nucleosam 0:00a3c3f5a8f0 559 Powerstep01_CmdResetPos();
nucleosam 0:00a3c3f5a8f0 560
nucleosam 0:00a3c3f5a8f0 561 }
nucleosam 0:00a3c3f5a8f0 562
nucleosam 0:00a3c3f5a8f0 563 /**********************************************************
nucleosam 0:00a3c3f5a8f0 564 * @brief Set current position to be the Home position (ABS pos set to 0)
nucleosam 0:00a3c3f5a8f0 565 * @retval None
nucleosam 0:00a3c3f5a8f0 566 **********************************************************/
nucleosam 0:00a3c3f5a8f0 567 void POWERSTEP01::Powerstep01_SetHome(void)
nucleosam 0:00a3c3f5a8f0 568 {
nucleosam 0:00a3c3f5a8f0 569 Powerstep01_CmdSetParam(POWERSTEP01_ABS_POS, 0);
nucleosam 0:00a3c3f5a8f0 570 }
nucleosam 0:00a3c3f5a8f0 571
nucleosam 0:00a3c3f5a8f0 572 /**********************************************************
nucleosam 0:00a3c3f5a8f0 573 * @brief Sets current position to be the Mark position
nucleosam 0:00a3c3f5a8f0 574 * @retval None
nucleosam 0:00a3c3f5a8f0 575 **********************************************************/
nucleosam 0:00a3c3f5a8f0 576 void POWERSTEP01::Powerstep01_SetMark(void)
nucleosam 0:00a3c3f5a8f0 577 {
nucleosam 0:00a3c3f5a8f0 578 Powerstep01_CmdSetParam(POWERSTEP01_MARK,
nucleosam 0:00a3c3f5a8f0 579 Powerstep01_CmdGetParam(POWERSTEP01_ABS_POS));
nucleosam 0:00a3c3f5a8f0 580 }
nucleosam 0:00a3c3f5a8f0 581
nucleosam 0:00a3c3f5a8f0 582 /**********************************************************
nucleosam 0:00a3c3f5a8f0 583 * @brief Locks until the device state becomes Inactive
nucleosam 0:00a3c3f5a8f0 584 * @retval None
nucleosam 0:00a3c3f5a8f0 585 **********************************************************/
nucleosam 0:00a3c3f5a8f0 586 void POWERSTEP01::Powerstep01_WaitWhileActive(void)
nucleosam 0:00a3c3f5a8f0 587 {
nucleosam 0:00a3c3f5a8f0 588 /* Wait while motor is running */
nucleosam 0:00a3c3f5a8f0 589 while (Powerstep01_IsDeviceBusy() != 0);
nucleosam 0:00a3c3f5a8f0 590 }
nucleosam 0:00a3c3f5a8f0 591
nucleosam 0:00a3c3f5a8f0 592 /**
nucleosam 0:00a3c3f5a8f0 593 * @brief To and from register parameter conversion functions
nucleosam 0:00a3c3f5a8f0 594 */
nucleosam 0:00a3c3f5a8f0 595
nucleosam 0:00a3c3f5a8f0 596 /**********************************************************
nucleosam 0:00a3c3f5a8f0 597 * @brief Converts the ABS_POSITION register value to a 32b signed integer
nucleosam 0:00a3c3f5a8f0 598 * @param[in] abs_position_reg value of the ABS_POSITION register
nucleosam 0:00a3c3f5a8f0 599 * @retval operation_result 32b signed integer corresponding to the absolute position
nucleosam 0:00a3c3f5a8f0 600 **********************************************************/
nucleosam 0:00a3c3f5a8f0 601 int32_t POWERSTEP01::Powerstep01_ConvertPosition(uint32_t abs_position_reg)
nucleosam 0:00a3c3f5a8f0 602 {
nucleosam 0:00a3c3f5a8f0 603 int32_t operation_result;
nucleosam 0:00a3c3f5a8f0 604
nucleosam 0:00a3c3f5a8f0 605 if (abs_position_reg & POWERSTEP01_ABS_POS_SIGN_BIT_MASK)
nucleosam 0:00a3c3f5a8f0 606 {
nucleosam 0:00a3c3f5a8f0 607 /* Negative register value */
nucleosam 0:00a3c3f5a8f0 608 abs_position_reg = ~abs_position_reg;
nucleosam 0:00a3c3f5a8f0 609 abs_position_reg += 1;
nucleosam 0:00a3c3f5a8f0 610
nucleosam 0:00a3c3f5a8f0 611 operation_result = (int32_t) (abs_position_reg & POWERSTEP01_ABS_POS_VALUE_MASK);
nucleosam 0:00a3c3f5a8f0 612 operation_result = -operation_result;
nucleosam 0:00a3c3f5a8f0 613 }
nucleosam 0:00a3c3f5a8f0 614 else
nucleosam 0:00a3c3f5a8f0 615 {
nucleosam 0:00a3c3f5a8f0 616 operation_result = (int32_t) abs_position_reg;
nucleosam 0:00a3c3f5a8f0 617 }
nucleosam 0:00a3c3f5a8f0 618 return operation_result;
nucleosam 0:00a3c3f5a8f0 619 }
nucleosam 0:00a3c3f5a8f0 620
nucleosam 0:00a3c3f5a8f0 621 /**
nucleosam 0:00a3c3f5a8f0 622 * @brief Functions to initialize the registers
nucleosam 0:00a3c3f5a8f0 623 */
nucleosam 0:00a3c3f5a8f0 624
nucleosam 0:00a3c3f5a8f0 625 /**********************************************************
nucleosam 0:00a3c3f5a8f0 626 * @brief Set the parameters of the device to values of initPrm structure
nucleosam 0:00a3c3f5a8f0 627 * @param[in] initPrm structure containing values to initialize the device
nucleosam 0:00a3c3f5a8f0 628 * parameters
nucleosam 0:00a3c3f5a8f0 629 * @retval None.
nucleosam 0:00a3c3f5a8f0 630 **********************************************************/
nucleosam 0:00a3c3f5a8f0 631 void POWERSTEP01::Powerstep01_SetDeviceParamsToGivenValues(
nucleosam 0:00a3c3f5a8f0 632 powerstep01_Init_u_t *initPrm)
nucleosam 0:00a3c3f5a8f0 633 {
nucleosam 0:00a3c3f5a8f0 634 Powerstep01_CmdSetParam(POWERSTEP01_ABS_POS, 0);
nucleosam 0:00a3c3f5a8f0 635 Powerstep01_CmdSetParam(POWERSTEP01_EL_POS, 0);
nucleosam 0:00a3c3f5a8f0 636 Powerstep01_CmdSetParam(POWERSTEP01_MARK, 0);
nucleosam 0:00a3c3f5a8f0 637 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 638 AccDec_Steps_s2_to_RegVal(initPrm->cm.cp.acceleration));
nucleosam 0:00a3c3f5a8f0 639 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 640 AccDec_Steps_s2_to_RegVal(initPrm->cm.cp.deceleration));
nucleosam 0:00a3c3f5a8f0 641 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 642 MaxSpd_Steps_s_to_RegVal(initPrm->cm.cp.maxSpeed));
nucleosam 0:00a3c3f5a8f0 643 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 644 initPrm->cm.cp.lowSpeedOptimization|
nucleosam 0:00a3c3f5a8f0 645 MaxSpd_Steps_s_to_RegVal(initPrm->cm.cp.minSpeed));
nucleosam 0:00a3c3f5a8f0 646 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 647 initPrm->cm.cp.boostMode|
nucleosam 0:00a3c3f5a8f0 648 FSSpd_Steps_s_to_RegVal(initPrm->cm.cp.fullStepSpeed));
nucleosam 0:00a3c3f5a8f0 649 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 650 StallOcd_Th_to_RegVal(initPrm->cm.cp.ocdThreshold));
nucleosam 0:00a3c3f5a8f0 651 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 652 (uint8_t)initPrm->cm.cp.syncClockSelection|
nucleosam 0:00a3c3f5a8f0 653 (uint8_t)initPrm->cm.cp.cmVmSelection|
nucleosam 0:00a3c3f5a8f0 654 (uint8_t)(uint8_t)initPrm->cm.cp.stepMode);
nucleosam 0:00a3c3f5a8f0 655 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 656 initPrm->cm.cp.alarmsSelection);
nucleosam 0:00a3c3f5a8f0 657 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 658 (uint16_t)initPrm->cm.cp.iGate|
nucleosam 0:00a3c3f5a8f0 659 (uint16_t)initPrm->cm.cp.tcc|
nucleosam 0:00a3c3f5a8f0 660 (uint16_t)initPrm->cm.cp.tBoost|
nucleosam 0:00a3c3f5a8f0 661 (uint16_t)initPrm->cm.cp.wdEn);
nucleosam 0:00a3c3f5a8f0 662 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 663 (uint16_t)initPrm->cm.cp.tBlank|
nucleosam 0:00a3c3f5a8f0 664 (uint16_t)initPrm->cm.cp.tdt);
nucleosam 0:00a3c3f5a8f0 665 if (initPrm->cm.cp.cmVmSelection == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 666 {
nucleosam 0:00a3c3f5a8f0 667 //Voltage mode
nucleosam 0:00a3c3f5a8f0 668 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 669 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 670 initPrm->vm.intersectSpeed));
nucleosam 0:00a3c3f5a8f0 671 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 672 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 673 initPrm->vm.thermalCompensationFactor));
nucleosam 0:00a3c3f5a8f0 674 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 675 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 676 initPrm->vm.stallThreshold));
nucleosam 0:00a3c3f5a8f0 677 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 678 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 679 initPrm->vm.kvalHold));
nucleosam 0:00a3c3f5a8f0 680 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 681 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 682 initPrm->vm.kvalRun));
nucleosam 0:00a3c3f5a8f0 683 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 684 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 685 initPrm->vm.kvalAcc));
nucleosam 0:00a3c3f5a8f0 686 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 687 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 688 initPrm->vm.kvalDec));
nucleosam 0:00a3c3f5a8f0 689 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 690 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 691 initPrm->vm.startSlope));
nucleosam 0:00a3c3f5a8f0 692 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 693 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 694 initPrm->vm.accelerationFinalSlope));
nucleosam 0:00a3c3f5a8f0 695 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 696 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 697 initPrm->vm.decelerationFinalSlope));
nucleosam 0:00a3c3f5a8f0 698 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 699 (uint16_t)initPrm->vm.oscClkSel|
nucleosam 0:00a3c3f5a8f0 700 (uint16_t)initPrm->vm.swMode |
nucleosam 0:00a3c3f5a8f0 701 (uint16_t)initPrm->vm.enVsComp|
nucleosam 0:00a3c3f5a8f0 702 (uint16_t)initPrm->vm.ocSd|
nucleosam 0:00a3c3f5a8f0 703 (uint16_t)initPrm->vm.uvloVal|
nucleosam 0:00a3c3f5a8f0 704 (uint16_t)initPrm->vm.vccVal|
nucleosam 0:00a3c3f5a8f0 705 (uint16_t)initPrm->vm.fPwmInt|
nucleosam 0:00a3c3f5a8f0 706 (uint16_t)initPrm->vm.fPwmDec);
nucleosam 0:00a3c3f5a8f0 707 }
nucleosam 0:00a3c3f5a8f0 708 else
nucleosam 0:00a3c3f5a8f0 709 {
nucleosam 0:00a3c3f5a8f0 710 // Current mode
nucleosam 0:00a3c3f5a8f0 711 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 712 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 713 initPrm->cm.tvalHold));
nucleosam 0:00a3c3f5a8f0 714 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 715 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 716 initPrm->cm.tvalRun));
nucleosam 0:00a3c3f5a8f0 717 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 718 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 719 initPrm->cm.tvalAcc));
nucleosam 0:00a3c3f5a8f0 720 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 721 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 722 initPrm->cm.tvalDec));
nucleosam 0:00a3c3f5a8f0 723 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 724 (uint8_t)initPrm->cm.toffFast|
nucleosam 0:00a3c3f5a8f0 725 (uint8_t)initPrm->cm.fastStep);
nucleosam 0:00a3c3f5a8f0 726 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 727 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 728 initPrm->cm.tonMin));
nucleosam 0:00a3c3f5a8f0 729 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 730 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 731 initPrm->cm.toffMin));
nucleosam 0:00a3c3f5a8f0 732 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 733 (uint16_t)initPrm->cm.oscClkSel|
nucleosam 0:00a3c3f5a8f0 734 (uint16_t)initPrm->cm.swMode|
nucleosam 0:00a3c3f5a8f0 735 (uint16_t)initPrm->cm.tqReg|
nucleosam 0:00a3c3f5a8f0 736 (uint16_t)initPrm->cm.ocSd|
nucleosam 0:00a3c3f5a8f0 737 (uint16_t)initPrm->cm.uvloVal|
nucleosam 0:00a3c3f5a8f0 738 (uint16_t)initPrm->cm.vccVal|
nucleosam 0:00a3c3f5a8f0 739 (uint16_t)initPrm->cm.tsw|
nucleosam 0:00a3c3f5a8f0 740 (uint16_t)initPrm->cm.predEn);
nucleosam 0:00a3c3f5a8f0 741 }
nucleosam 0:00a3c3f5a8f0 742 }
nucleosam 0:00a3c3f5a8f0 743
nucleosam 0:00a3c3f5a8f0 744 /**********************************************************
nucleosam 0:00a3c3f5a8f0 745 * @brief Sets the registers of the Powerstep01 to their predefined values
nucleosam 0:00a3c3f5a8f0 746 * from powerstep01_target_config.h
nucleosam 0:00a3c3f5a8f0 747 * @retval None
nucleosam 0:00a3c3f5a8f0 748 **********************************************************/
nucleosam 0:00a3c3f5a8f0 749 void POWERSTEP01::Powerstep01_SetRegisterToPredefinedValues(void)
nucleosam 0:00a3c3f5a8f0 750 {
nucleosam 0:00a3c3f5a8f0 751 powerstep01_CmVm_t cmVm;
nucleosam 0:00a3c3f5a8f0 752
nucleosam 0:00a3c3f5a8f0 753 Powerstep01_CmdSetParam(
nucleosam 0:00a3c3f5a8f0 754 POWERSTEP01_ABS_POS,
nucleosam 0:00a3c3f5a8f0 755 0);
nucleosam 0:00a3c3f5a8f0 756 Powerstep01_CmdSetParam(
nucleosam 0:00a3c3f5a8f0 757 POWERSTEP01_EL_POS,
nucleosam 0:00a3c3f5a8f0 758 0);
nucleosam 0:00a3c3f5a8f0 759 Powerstep01_CmdSetParam(
nucleosam 0:00a3c3f5a8f0 760 POWERSTEP01_MARK,
nucleosam 0:00a3c3f5a8f0 761 0);
nucleosam 0:00a3c3f5a8f0 762 switch (deviceInstance)
nucleosam 0:00a3c3f5a8f0 763 {
nucleosam 0:00a3c3f5a8f0 764 case 0:
nucleosam 0:00a3c3f5a8f0 765 cmVm = POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_0;
nucleosam 0:00a3c3f5a8f0 766 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 767 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 768 POWERSTEP01_CONF_PARAM_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 769 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 770 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 771 POWERSTEP01_CONF_PARAM_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 772 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 773 MaxSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 774 POWERSTEP01_CONF_PARAM_MAX_SPEED_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 775 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 776 POWERSTEP01_CONF_PARAM_LSPD_BIT_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 777 MinSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 778 POWERSTEP01_CONF_PARAM_MIN_SPEED_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 779 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 780 POWERSTEP01_CONF_PARAM_BOOST_MODE_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 781 FSSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 782 POWERSTEP01_CONF_PARAM_FS_SPD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 783 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 784 (uint8_t)POWERSTEP01_CONF_PARAM_OCD_TH_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 785 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 786 (uint8_t)POWERSTEP01_CONF_PARAM_SYNC_MODE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 787 (uint8_t)POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 788 (uint8_t)POWERSTEP01_CONF_PARAM_STEP_MODE_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 789 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 790 POWERSTEP01_CONF_PARAM_ALARM_EN_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 791 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 792 (uint16_t)POWERSTEP01_CONF_PARAM_IGATE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 793 (uint16_t)POWERSTEP01_CONF_PARAM_TCC_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 794 (uint16_t)POWERSTEP01_CONF_PARAM_TBOOST_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 795 (uint16_t)POWERSTEP01_CONF_PARAM_WD_EN_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 796 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 797 (uint16_t)POWERSTEP01_CONF_PARAM_TBLANK_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 798 (uint16_t)POWERSTEP01_CONF_PARAM_TDT_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 799 // Voltage mode
nucleosam 0:00a3c3f5a8f0 800 if (cmVm == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 801 {
nucleosam 0:00a3c3f5a8f0 802 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 803 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 804 POWERSTEP01_CONF_PARAM_INT_SPD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 805 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 806 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 807 POWERSTEP01_CONF_PARAM_K_THERM_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 808 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 809 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 810 POWERSTEP01_CONF_PARAM_STALL_TH_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 811 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 812 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 813 POWERSTEP01_CONF_PARAM_KVAL_HOLD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 814 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 815 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 816 POWERSTEP01_CONF_PARAM_KVAL_RUN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 817 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 818 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 819 POWERSTEP01_CONF_PARAM_KVAL_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 820 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 821 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 822 POWERSTEP01_CONF_PARAM_KVAL_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 823 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 824 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 825 POWERSTEP01_CONF_PARAM_ST_SLP_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 826 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 827 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 828 POWERSTEP01_CONF_PARAM_FN_SLP_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 829 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 830 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 831 POWERSTEP01_CONF_PARAM_FN_SLP_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 832 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 833 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 834 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 835 (uint16_t)POWERSTEP01_CONF_PARAM_VS_COMP_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 836 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 837 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 838 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 839 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_DIV_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 840 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_MUL_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 841 }
nucleosam 0:00a3c3f5a8f0 842 else
nucleosam 0:00a3c3f5a8f0 843 {
nucleosam 0:00a3c3f5a8f0 844 // Current mode
nucleosam 0:00a3c3f5a8f0 845 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 846 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 847 POWERSTEP01_CONF_PARAM_TVAL_HOLD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 848 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 849 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 850 POWERSTEP01_CONF_PARAM_TVAL_RUN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 851 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 852 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 853 POWERSTEP01_CONF_PARAM_TVAL_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 854 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 855 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 856 POWERSTEP01_CONF_PARAM_TVAL_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 857 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 858 (uint8_t)POWERSTEP01_CONF_PARAM_TOFF_FAST_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 859 (uint8_t)POWERSTEP01_CONF_PARAM_FAST_STEP_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 860 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 861 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 862 POWERSTEP01_CONF_PARAM_TON_MIN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 863 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 864 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 865 POWERSTEP01_CONF_PARAM_TOFF_MIN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 866 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 867 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 868 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 869 (uint16_t)POWERSTEP01_CONF_PARAM_TQ_REG_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 870 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 871 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 872 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 873 (uint16_t)POWERSTEP01_CONF_PARAM_TSW_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 874 (uint16_t)POWERSTEP01_CONF_PARAM_PRED_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 875 }
nucleosam 0:00a3c3f5a8f0 876 break;
nucleosam 0:00a3c3f5a8f0 877 #if (MAX_NUMBER_OF_DEVICES > 1)
nucleosam 0:00a3c3f5a8f0 878 case 1:
nucleosam 0:00a3c3f5a8f0 879 cmVm = POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_1;
nucleosam 0:00a3c3f5a8f0 880 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 881 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 882 POWERSTEP01_CONF_PARAM_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 883 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 884 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 885 POWERSTEP01_CONF_PARAM_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 886 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 887 MaxSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 888 POWERSTEP01_CONF_PARAM_MAX_SPEED_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 889 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 890 POWERSTEP01_CONF_PARAM_LSPD_BIT_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 891 MinSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 892 POWERSTEP01_CONF_PARAM_MIN_SPEED_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 893 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 894 POWERSTEP01_CONF_PARAM_BOOST_MODE_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 895 FSSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 896 POWERSTEP01_CONF_PARAM_FS_SPD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 897 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 898 (uint8_t)POWERSTEP01_CONF_PARAM_OCD_TH_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 899 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 900 (uint8_t)POWERSTEP01_CONF_PARAM_SYNC_MODE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 901 (uint8_t)POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 902 (uint8_t)POWERSTEP01_CONF_PARAM_STEP_MODE_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 903 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 904 POWERSTEP01_CONF_PARAM_ALARM_EN_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 905 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 906 (uint16_t)POWERSTEP01_CONF_PARAM_IGATE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 907 (uint16_t)POWERSTEP01_CONF_PARAM_TCC_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 908 (uint16_t)POWERSTEP01_CONF_PARAM_TBOOST_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 909 (uint16_t)POWERSTEP01_CONF_PARAM_WD_EN_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 910 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 911 (uint16_t)POWERSTEP01_CONF_PARAM_TBLANK_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 912 (uint16_t)POWERSTEP01_CONF_PARAM_TDT_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 913 // Voltage mode
nucleosam 0:00a3c3f5a8f0 914 if (cmVm == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 915 {
nucleosam 0:00a3c3f5a8f0 916 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 917 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 918 POWERSTEP01_CONF_PARAM_INT_SPD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 919 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 920 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 921 POWERSTEP01_CONF_PARAM_K_THERM_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 922 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 923 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 924 POWERSTEP01_CONF_PARAM_STALL_TH_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 925 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 926 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 927 POWERSTEP01_CONF_PARAM_KVAL_HOLD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 928 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 929 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 930 POWERSTEP01_CONF_PARAM_KVAL_RUN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 931 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 932 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 933 POWERSTEP01_CONF_PARAM_KVAL_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 934 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 935 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 936 POWERSTEP01_CONF_PARAM_KVAL_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 937 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 938 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 939 POWERSTEP01_CONF_PARAM_ST_SLP_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 940 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 941 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 942 POWERSTEP01_CONF_PARAM_FN_SLP_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 943 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 944 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 945 POWERSTEP01_CONF_PARAM_FN_SLP_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 946 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 947 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 948 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 949 (uint16_t)POWERSTEP01_CONF_PARAM_VS_COMP_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 950 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 951 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 952 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 953 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_DIV_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 954 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_MUL_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 955 }
nucleosam 0:00a3c3f5a8f0 956 else
nucleosam 0:00a3c3f5a8f0 957 {
nucleosam 0:00a3c3f5a8f0 958 // Current mode
nucleosam 0:00a3c3f5a8f0 959 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 960 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 961 POWERSTEP01_CONF_PARAM_TVAL_HOLD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 962 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 963 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 964 POWERSTEP01_CONF_PARAM_TVAL_RUN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 965 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 966 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 967 POWERSTEP01_CONF_PARAM_TVAL_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 968 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 969 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 970 POWERSTEP01_CONF_PARAM_TVAL_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 971 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 972 (uint8_t)POWERSTEP01_CONF_PARAM_TOFF_FAST_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 973 (uint8_t)POWERSTEP01_CONF_PARAM_FAST_STEP_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 974 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 975 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 976 POWERSTEP01_CONF_PARAM_TON_MIN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 977 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 978 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 979 POWERSTEP01_CONF_PARAM_TOFF_MIN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 980 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 981 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 982 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 983 (uint16_t)POWERSTEP01_CONF_PARAM_TQ_REG_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 984 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 985 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 986 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 987 (uint16_t)POWERSTEP01_CONF_PARAM_TSW_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 988 (uint16_t)POWERSTEP01_CONF_PARAM_PRED_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 989 }
nucleosam 0:00a3c3f5a8f0 990 break;
nucleosam 0:00a3c3f5a8f0 991 #endif
nucleosam 0:00a3c3f5a8f0 992 #if (MAX_NUMBER_OF_DEVICES > 2)
nucleosam 0:00a3c3f5a8f0 993 case 2:
nucleosam 0:00a3c3f5a8f0 994 cmVm = POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_2;
nucleosam 0:00a3c3f5a8f0 995 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 996 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 997 POWERSTEP01_CONF_PARAM_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 998 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 999 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1000 POWERSTEP01_CONF_PARAM_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1001 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 1002 MaxSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1003 POWERSTEP01_CONF_PARAM_MAX_SPEED_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1004 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 1005 POWERSTEP01_CONF_PARAM_LSPD_BIT_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1006 MinSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1007 POWERSTEP01_CONF_PARAM_MIN_SPEED_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1008 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 1009 POWERSTEP01_CONF_PARAM_BOOST_MODE_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1010 FSSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1011 POWERSTEP01_CONF_PARAM_FS_SPD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1012 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 1013 (uint8_t)POWERSTEP01_CONF_PARAM_OCD_TH_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1014 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 1015 (uint8_t)POWERSTEP01_CONF_PARAM_SYNC_MODE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1016 (uint8_t)POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1017 (uint8_t)POWERSTEP01_CONF_PARAM_STEP_MODE_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1018 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 1019 POWERSTEP01_CONF_PARAM_ALARM_EN_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1020 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 1021 (uint16_t)POWERSTEP01_CONF_PARAM_IGATE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1022 (uint16_t)POWERSTEP01_CONF_PARAM_TCC_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1023 (uint16_t)POWERSTEP01_CONF_PARAM_TBOOST_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1024 (uint16_t)POWERSTEP01_CONF_PARAM_WD_EN_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1025 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 1026 (uint16_t)POWERSTEP01_CONF_PARAM_TBLANK_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1027 (uint16_t)POWERSTEP01_CONF_PARAM_TDT_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1028 // Voltage mode
nucleosam 0:00a3c3f5a8f0 1029 if (cmVm == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 1030 {
nucleosam 0:00a3c3f5a8f0 1031 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 1032 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1033 POWERSTEP01_CONF_PARAM_INT_SPD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1034 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 1035 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1036 POWERSTEP01_CONF_PARAM_K_THERM_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1037 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 1038 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1039 POWERSTEP01_CONF_PARAM_STALL_TH_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1040 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 1041 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1042 POWERSTEP01_CONF_PARAM_KVAL_HOLD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1043 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 1044 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1045 POWERSTEP01_CONF_PARAM_KVAL_RUN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1046 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 1047 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1048 POWERSTEP01_CONF_PARAM_KVAL_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1049 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 1050 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1051 POWERSTEP01_CONF_PARAM_KVAL_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1052 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 1053 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1054 POWERSTEP01_CONF_PARAM_ST_SLP_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1055 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 1056 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1057 POWERSTEP01_CONF_PARAM_FN_SLP_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1058 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 1059 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1060 POWERSTEP01_CONF_PARAM_FN_SLP_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1061 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 1062 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1063 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1064 (uint16_t)POWERSTEP01_CONF_PARAM_VS_COMP_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1065 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1066 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1067 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1068 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_DIV_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1069 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_MUL_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1070 }
nucleosam 0:00a3c3f5a8f0 1071 else
nucleosam 0:00a3c3f5a8f0 1072 {
nucleosam 0:00a3c3f5a8f0 1073 // Current mode
nucleosam 0:00a3c3f5a8f0 1074 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 1075 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1076 POWERSTEP01_CONF_PARAM_TVAL_HOLD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1077 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 1078 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1079 POWERSTEP01_CONF_PARAM_TVAL_RUN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1080 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 1081 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1082 POWERSTEP01_CONF_PARAM_TVAL_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1083 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 1084 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1085 POWERSTEP01_CONF_PARAM_TVAL_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1086 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 1087 (uint8_t)POWERSTEP01_CONF_PARAM_TOFF_FAST_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1088 (uint8_t)POWERSTEP01_CONF_PARAM_FAST_STEP_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1089 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 1090 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1091 POWERSTEP01_CONF_PARAM_TON_MIN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1092 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 1093 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1094 POWERSTEP01_CONF_PARAM_TOFF_MIN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1095 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 1096 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1097 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1098 (uint16_t)POWERSTEP01_CONF_PARAM_TQ_REG_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1099 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1100 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1101 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1102 (uint16_t)POWERSTEP01_CONF_PARAM_TSW_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1103 (uint16_t)POWERSTEP01_CONF_PARAM_PRED_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1104 }
nucleosam 0:00a3c3f5a8f0 1105 break;
nucleosam 0:00a3c3f5a8f0 1106 #endif
nucleosam 0:00a3c3f5a8f0 1107 default: ;
nucleosam 0:00a3c3f5a8f0 1108 }
nucleosam 0:00a3c3f5a8f0 1109 }
nucleosam 0:00a3c3f5a8f0 1110
nucleosam 0:00a3c3f5a8f0 1111 /**
nucleosam 0:00a3c3f5a8f0 1112 * @brief Functions to get and set parameters using digital or analog values
nucleosam 0:00a3c3f5a8f0 1113 */
nucleosam 0:00a3c3f5a8f0 1114
nucleosam 0:00a3c3f5a8f0 1115 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1116 * @brief Issues the GetParam command to the Powerstep01 device
nucleosam 0:00a3c3f5a8f0 1117 * @param[in] parameter Register adress (POWERSTEP01_ABS_POS,
nucleosam 0:00a3c3f5a8f0 1118 * POWERSTEP01_MARK,...)
nucleosam 0:00a3c3f5a8f0 1119 * @retval Register value
nucleosam 0:00a3c3f5a8f0 1120 **********************************************************/
nucleosam 0:00a3c3f5a8f0 1121 uint32_t POWERSTEP01::Powerstep01_CmdGetParam(powerstep01_Registers_t param)
nucleosam 0:00a3c3f5a8f0 1122 {
nucleosam 0:00a3c3f5a8f0 1123
nucleosam 0:00a3c3f5a8f0 1124 uint32_t spiRxData;
nucleosam 0:00a3c3f5a8f0 1125 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 1126 uint8_t maxArgumentNbBytes = 0;
nucleosam 0:00a3c3f5a8f0 1127 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1128 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1129
nucleosam 0:00a3c3f5a8f0 1130 do
nucleosam 0:00a3c3f5a8f0 1131 {
nucleosam 0:00a3c3f5a8f0 1132 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 1133 if (itDisable)
nucleosam 0:00a3c3f5a8f0 1134 {
nucleosam 0:00a3c3f5a8f0 1135 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 1136 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1137 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1138 }
nucleosam 0:00a3c3f5a8f0 1139 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 1140 {
nucleosam 0:00a3c3f5a8f0 1141 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1142 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1143 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1144 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1145 spiRxBursts[0][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1146 spiRxBursts[1][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1147 spiRxBursts[2][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1148 spiRxBursts[3][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1149 }
nucleosam 0:00a3c3f5a8f0 1150 switch (param)
nucleosam 0:00a3c3f5a8f0 1151 {
nucleosam 0:00a3c3f5a8f0 1152 case POWERSTEP01_ABS_POS:
nucleosam 0:00a3c3f5a8f0 1153 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1154 case POWERSTEP01_SPEED:
nucleosam 0:00a3c3f5a8f0 1155 spiTxBursts[0][spiIndex] = ((uint8_t)POWERSTEP01_GET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1156 maxArgumentNbBytes = 3;
nucleosam 0:00a3c3f5a8f0 1157 break;
nucleosam 0:00a3c3f5a8f0 1158 case POWERSTEP01_EL_POS:
nucleosam 0:00a3c3f5a8f0 1159 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1160 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1161 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1162 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1163 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1164 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1165 case POWERSTEP01_CONFIG:
nucleosam 0:00a3c3f5a8f0 1166 case POWERSTEP01_GATECFG1:
nucleosam 0:00a3c3f5a8f0 1167 case POWERSTEP01_STATUS:
nucleosam 0:00a3c3f5a8f0 1168 spiTxBursts[1][spiIndex] = ((uint8_t)POWERSTEP01_GET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1169 maxArgumentNbBytes = 2;
nucleosam 0:00a3c3f5a8f0 1170 break;
nucleosam 0:00a3c3f5a8f0 1171 default:
nucleosam 0:00a3c3f5a8f0 1172 spiTxBursts[2][spiIndex] = ((uint8_t)POWERSTEP01_GET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1173 maxArgumentNbBytes = 1;
nucleosam 0:00a3c3f5a8f0 1174 }
nucleosam 0:00a3c3f5a8f0 1175 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 1176 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1177 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 1178 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 1179 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 1180 for (loop = POWERSTEP01_CMD_ARG_MAX_NB_BYTES-1-maxArgumentNbBytes;
nucleosam 0:00a3c3f5a8f0 1181 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1182 loop++)
nucleosam 0:00a3c3f5a8f0 1183 {
nucleosam 0:00a3c3f5a8f0 1184 Powerstep01_WriteBytes(&spiTxBursts[loop][0],
nucleosam 0:00a3c3f5a8f0 1185 &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1186 }
nucleosam 0:00a3c3f5a8f0 1187 spiRxData = ((uint32_t)spiRxBursts[1][spiIndex] << 16)|
nucleosam 0:00a3c3f5a8f0 1188 (spiRxBursts[2][spiIndex] << 8) |
nucleosam 0:00a3c3f5a8f0 1189 (spiRxBursts[3][spiIndex]);
nucleosam 0:00a3c3f5a8f0 1190 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1191 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1192 return (spiRxData);
nucleosam 0:00a3c3f5a8f0 1193 }
nucleosam 0:00a3c3f5a8f0 1194
nucleosam 0:00a3c3f5a8f0 1195 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1196 * @brief Issues the SetParam command to the PowerStep01 device
nucleosam 0:00a3c3f5a8f0 1197 * @param[in] parameter Register adress (POWERSTEP01_ABS_POS,
nucleosam 0:00a3c3f5a8f0 1198 * POWERSTEP01_MARK,...)
nucleosam 0:00a3c3f5a8f0 1199 * @param[in] value Value to set in the register
nucleosam 0:00a3c3f5a8f0 1200 * @retval None
nucleosam 0:00a3c3f5a8f0 1201 **********************************************************/
nucleosam 0:00a3c3f5a8f0 1202 void POWERSTEP01::Powerstep01_CmdSetParam(powerstep01_Registers_t param,
nucleosam 0:00a3c3f5a8f0 1203 uint32_t value)
nucleosam 0:00a3c3f5a8f0 1204 {
nucleosam 0:00a3c3f5a8f0 1205 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 1206 uint8_t maxArgumentNbBytes = 0;
nucleosam 0:00a3c3f5a8f0 1207 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1208 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1209
nucleosam 0:00a3c3f5a8f0 1210 do
nucleosam 0:00a3c3f5a8f0 1211 {
nucleosam 0:00a3c3f5a8f0 1212 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 1213 if (itDisable)
nucleosam 0:00a3c3f5a8f0 1214 {
nucleosam 0:00a3c3f5a8f0 1215 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 1216 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1217 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1218 }
nucleosam 0:00a3c3f5a8f0 1219 for (loop = 0;loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 1220 {
nucleosam 0:00a3c3f5a8f0 1221 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1222 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1223 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1224 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1225 }
nucleosam 0:00a3c3f5a8f0 1226 switch (param)
nucleosam 0:00a3c3f5a8f0 1227 {
nucleosam 0:00a3c3f5a8f0 1228 case POWERSTEP01_ABS_POS: ;
nucleosam 0:00a3c3f5a8f0 1229 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1230 spiTxBursts[0][spiIndex] = ((uint8_t)POWERSTEP01_SET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1231 spiTxBursts[1][spiIndex] = (uint8_t)(value >> 16);
nucleosam 0:00a3c3f5a8f0 1232 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1233 maxArgumentNbBytes = 3;
nucleosam 0:00a3c3f5a8f0 1234 break;
nucleosam 0:00a3c3f5a8f0 1235 case POWERSTEP01_EL_POS:
nucleosam 0:00a3c3f5a8f0 1236 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1237 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1238 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1239 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1240 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1241 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1242 case POWERSTEP01_CONFIG:
nucleosam 0:00a3c3f5a8f0 1243 case POWERSTEP01_GATECFG1:
nucleosam 0:00a3c3f5a8f0 1244 spiTxBursts[1][spiIndex] = ((uint8_t)POWERSTEP01_SET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1245 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1246 maxArgumentNbBytes = 2;
nucleosam 0:00a3c3f5a8f0 1247 break;
nucleosam 0:00a3c3f5a8f0 1248 default:
nucleosam 0:00a3c3f5a8f0 1249 spiTxBursts[2][spiIndex] = ((uint8_t)POWERSTEP01_SET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1250 maxArgumentNbBytes = 1;
nucleosam 0:00a3c3f5a8f0 1251 }
nucleosam 0:00a3c3f5a8f0 1252 spiTxBursts[3][spiIndex] = (uint8_t)(value);
nucleosam 0:00a3c3f5a8f0 1253 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 1254 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1255 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 1256 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 1257 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 1258 /* SPI transfer */
nucleosam 0:00a3c3f5a8f0 1259 for (loop = POWERSTEP01_CMD_ARG_MAX_NB_BYTES - 1 - maxArgumentNbBytes;
nucleosam 0:00a3c3f5a8f0 1260 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1261 loop++)
nucleosam 0:00a3c3f5a8f0 1262 {
nucleosam 0:00a3c3f5a8f0 1263 Powerstep01_WriteBytes(&spiTxBursts[loop][0],&spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1264 }
nucleosam 0:00a3c3f5a8f0 1265 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1266 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1267 }
nucleosam 0:00a3c3f5a8f0 1268
nucleosam 0:00a3c3f5a8f0 1269 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1270 * @brief Issues PowerStep01 Get Parameter command and convert the result to
nucleosam 0:00a3c3f5a8f0 1271 * float value
nucleosam 0:00a3c3f5a8f0 1272 * @param[in] param PowerStep01 register address
nucleosam 0:00a3c3f5a8f0 1273 * @retval The parameter's float value.
nucleosam 0:00a3c3f5a8f0 1274 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1275 float POWERSTEP01::Powerstep01_GetAnalogValue(powerstep01_Registers_t param)
nucleosam 0:00a3c3f5a8f0 1276 {
nucleosam 0:00a3c3f5a8f0 1277 bool voltageMode = ((POWERSTEP01_CM_VM_CURRENT&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))==0);
nucleosam 0:00a3c3f5a8f0 1278 uint32_t registerValue = Powerstep01_CmdGetParam((powerstep01_Registers_t) param);
nucleosam 0:00a3c3f5a8f0 1279 float value;
nucleosam 0:00a3c3f5a8f0 1280 switch (param)
nucleosam 0:00a3c3f5a8f0 1281 {
nucleosam 0:00a3c3f5a8f0 1282 case POWERSTEP01_ABS_POS:
nucleosam 0:00a3c3f5a8f0 1283 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1284 value = (float) Powerstep01_ConvertPosition(registerValue);
nucleosam 0:00a3c3f5a8f0 1285 break;
nucleosam 0:00a3c3f5a8f0 1286 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1287 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1288 value = AccDec_RegVal_to_Steps_s2(registerValue);
nucleosam 0:00a3c3f5a8f0 1289 break;
nucleosam 0:00a3c3f5a8f0 1290 case POWERSTEP01_SPEED:
nucleosam 0:00a3c3f5a8f0 1291 value = Speed_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1292 break;
nucleosam 0:00a3c3f5a8f0 1293 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1294 value = MaxSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1295 break;
nucleosam 0:00a3c3f5a8f0 1296 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1297 registerValue &= POWERSTEP01_MIN_SPEED_MASK;
nucleosam 0:00a3c3f5a8f0 1298 value = MinSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1299 break;
nucleosam 0:00a3c3f5a8f0 1300 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1301 registerValue &= POWERSTEP01_FS_SPD_MASK;
nucleosam 0:00a3c3f5a8f0 1302 value = FSSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1303 break;
nucleosam 0:00a3c3f5a8f0 1304 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1305 value = IntSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1306 break;
nucleosam 0:00a3c3f5a8f0 1307 case POWERSTEP01_K_THERM:
nucleosam 0:00a3c3f5a8f0 1308 value = KTherm_RegVal_to_Comp(registerValue);
nucleosam 0:00a3c3f5a8f0 1309 break;
nucleosam 0:00a3c3f5a8f0 1310 case POWERSTEP01_OCD_TH:
nucleosam 0:00a3c3f5a8f0 1311 case POWERSTEP01_STALL_TH:
nucleosam 0:00a3c3f5a8f0 1312 value = StallOcd_RegVal_to_Th(registerValue);
nucleosam 0:00a3c3f5a8f0 1313 break;
nucleosam 0:00a3c3f5a8f0 1314 case POWERSTEP01_KVAL_HOLD: //POWERSTEP01_TVAL_HOLD
nucleosam 0:00a3c3f5a8f0 1315 case POWERSTEP01_KVAL_RUN: //POWERSTEP01_TVAL_RUN
nucleosam 0:00a3c3f5a8f0 1316 case POWERSTEP01_KVAL_ACC: //POWERSTEP01_TVAL_ACC
nucleosam 0:00a3c3f5a8f0 1317 case POWERSTEP01_KVAL_DEC: //POWERSTEP01_TVAL_DEC
nucleosam 0:00a3c3f5a8f0 1318 if (voltageMode!=FALSE) value = Kval_RegVal_to_Perc(registerValue);
nucleosam 0:00a3c3f5a8f0 1319 else value = Kval_RegVal_to_Perc(registerValue);
nucleosam 0:00a3c3f5a8f0 1320 break;
nucleosam 0:00a3c3f5a8f0 1321 case POWERSTEP01_ST_SLP:
nucleosam 0:00a3c3f5a8f0 1322 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1323 {
nucleosam 0:00a3c3f5a8f0 1324 break;
nucleosam 0:00a3c3f5a8f0 1325 }
nucleosam 0:00a3c3f5a8f0 1326 case POWERSTEP01_FN_SLP_ACC: //POWERSTEP01_TON_MIN
nucleosam 0:00a3c3f5a8f0 1327 case POWERSTEP01_FN_SLP_DEC: //POWERSTEP01_TOFF_MIN
nucleosam 0:00a3c3f5a8f0 1328 if (voltageMode!=FALSE) value = BEMFslope_RegVal_to_Perc(registerValue);
nucleosam 0:00a3c3f5a8f0 1329 else value = Tmin_RegVal_to_Time(registerValue);
nucleosam 0:00a3c3f5a8f0 1330 break;
nucleosam 0:00a3c3f5a8f0 1331 default:
nucleosam 0:00a3c3f5a8f0 1332 value = (float) registerValue;
nucleosam 0:00a3c3f5a8f0 1333 }
nucleosam 0:00a3c3f5a8f0 1334 return value;
nucleosam 0:00a3c3f5a8f0 1335 }
nucleosam 0:00a3c3f5a8f0 1336
nucleosam 0:00a3c3f5a8f0 1337 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 1338 * @brief Put commands in queue before synchronous sending
nucleosam 0:00a3c3f5a8f0 1339 * done by calling Powerstep01_SendQueuedCommands.
nucleosam 0:00a3c3f5a8f0 1340 * Any call to functions that use the SPI between the calls of
nucleosam 0:00a3c3f5a8f0 1341 * Powerstep01_QueueCommands and Powerstep01_SendQueuedCommands
nucleosam 0:00a3c3f5a8f0 1342 * will corrupt the queue.
nucleosam 0:00a3c3f5a8f0 1343 * A command for each device of the daisy chain must be
nucleosam 0:00a3c3f5a8f0 1344 * specified before calling Powerstep01_SendQueuedCommands.
nucleosam 0:00a3c3f5a8f0 1345 * @param[in] command Command to queue (all Powerstep01 commmands
nucleosam 0:00a3c3f5a8f0 1346 * except POWERSTEP01_SET_PARAM, POWERSTEP01_GET_PARAM,
nucleosam 0:00a3c3f5a8f0 1347 * POWERSTEP01_GET_STATUS)
nucleosam 0:00a3c3f5a8f0 1348 * @param[in] value argument of the command to queue
nucleosam 0:00a3c3f5a8f0 1349 * @retval None
nucleosam 0:00a3c3f5a8f0 1350 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1351 void POWERSTEP01::Powerstep01_QueueCommands(uint8_t command, int32_t value)
nucleosam 0:00a3c3f5a8f0 1352 {
nucleosam 0:00a3c3f5a8f0 1353 if (numberOfDevices > deviceInstance)
nucleosam 0:00a3c3f5a8f0 1354 {
nucleosam 0:00a3c3f5a8f0 1355 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1356
nucleosam 0:00a3c3f5a8f0 1357 switch (command & DAISY_CHAIN_COMMAND_MASK)
nucleosam 0:00a3c3f5a8f0 1358 {
nucleosam 0:00a3c3f5a8f0 1359 case POWERSTEP01_RUN: ;
nucleosam 0:00a3c3f5a8f0 1360 case POWERSTEP01_MOVE: ;
nucleosam 0:00a3c3f5a8f0 1361 case POWERSTEP01_GO_TO: ;
nucleosam 0:00a3c3f5a8f0 1362 case POWERSTEP01_GO_TO_DIR: ;
nucleosam 0:00a3c3f5a8f0 1363 case POWERSTEP01_GO_UNTIL: ;
nucleosam 0:00a3c3f5a8f0 1364 case POWERSTEP01_GO_UNTIL_ACT_CPY:
nucleosam 0:00a3c3f5a8f0 1365 spiTxBursts[0][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1366 spiTxBursts[1][spiIndex] = (uint8_t)(value >> 16);
nucleosam 0:00a3c3f5a8f0 1367 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1368 spiTxBursts[3][spiIndex] = (uint8_t)(value);
nucleosam 0:00a3c3f5a8f0 1369 break;
nucleosam 0:00a3c3f5a8f0 1370 default:
nucleosam 0:00a3c3f5a8f0 1371 spiTxBursts[0][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1372 spiTxBursts[1][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1373 spiTxBursts[2][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1374 spiTxBursts[3][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1375 }
nucleosam 0:00a3c3f5a8f0 1376 }
nucleosam 0:00a3c3f5a8f0 1377 }
nucleosam 0:00a3c3f5a8f0 1378
nucleosam 0:00a3c3f5a8f0 1379 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1380 * @brief Sends a command to the device via the SPI
nucleosam 0:00a3c3f5a8f0 1381 * @param[in] command Command to send (all Powerstep01 commmands
nucleosam 0:00a3c3f5a8f0 1382 * except POWERSTEP01_SET_PARAM, POWERSTEP01_GET_PARAM,
nucleosam 0:00a3c3f5a8f0 1383 * POWERSTEP01_GET_STATUS)
nucleosam 0:00a3c3f5a8f0 1384 * @param[in] value arguments to send on 32 bits
nucleosam 0:00a3c3f5a8f0 1385 * @retval None
nucleosam 0:00a3c3f5a8f0 1386 **********************************************************/
nucleosam 0:00a3c3f5a8f0 1387 void POWERSTEP01::Powerstep01_SendCommand(uint8_t command, uint32_t value)
nucleosam 0:00a3c3f5a8f0 1388 {
nucleosam 0:00a3c3f5a8f0 1389 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 1390 uint8_t maxArgumentNbBytes = 0;
nucleosam 0:00a3c3f5a8f0 1391 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1392 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1393
nucleosam 0:00a3c3f5a8f0 1394 do
nucleosam 0:00a3c3f5a8f0 1395 {
nucleosam 0:00a3c3f5a8f0 1396 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 1397 if (itDisable)
nucleosam 0:00a3c3f5a8f0 1398 {
nucleosam 0:00a3c3f5a8f0 1399 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 1400 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1401 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1402 }
nucleosam 0:00a3c3f5a8f0 1403 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 1404 {
nucleosam 0:00a3c3f5a8f0 1405 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1406 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1407 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1408 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1409 }
nucleosam 0:00a3c3f5a8f0 1410 switch (command & DAISY_CHAIN_COMMAND_MASK)
nucleosam 0:00a3c3f5a8f0 1411 {
nucleosam 0:00a3c3f5a8f0 1412 case POWERSTEP01_GO_TO:
nucleosam 0:00a3c3f5a8f0 1413 case POWERSTEP01_GO_TO_DIR:
nucleosam 0:00a3c3f5a8f0 1414 value = value & POWERSTEP01_ABS_POS_VALUE_MASK;
nucleosam 0:00a3c3f5a8f0 1415 case POWERSTEP01_RUN:
nucleosam 0:00a3c3f5a8f0 1416 case POWERSTEP01_MOVE:
nucleosam 0:00a3c3f5a8f0 1417 case POWERSTEP01_GO_UNTIL:
nucleosam 0:00a3c3f5a8f0 1418 case POWERSTEP01_GO_UNTIL_ACT_CPY:
nucleosam 0:00a3c3f5a8f0 1419 spiTxBursts[0][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1420 spiTxBursts[1][spiIndex] = (uint8_t)(value >> 16);
nucleosam 0:00a3c3f5a8f0 1421 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1422 spiTxBursts[3][spiIndex] = (uint8_t)(value);
nucleosam 0:00a3c3f5a8f0 1423 maxArgumentNbBytes = 3;
nucleosam 0:00a3c3f5a8f0 1424 break;
nucleosam 0:00a3c3f5a8f0 1425 default:
nucleosam 0:00a3c3f5a8f0 1426 spiTxBursts[0][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1427 spiTxBursts[1][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1428 spiTxBursts[2][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1429 spiTxBursts[3][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1430 }
nucleosam 0:00a3c3f5a8f0 1431 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 1432 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1433 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 1434 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 1435 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 1436 for (loop = POWERSTEP01_CMD_ARG_MAX_NB_BYTES - 1 - maxArgumentNbBytes;
nucleosam 0:00a3c3f5a8f0 1437 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1438 loop++)
nucleosam 0:00a3c3f5a8f0 1439 {
nucleosam 0:00a3c3f5a8f0 1440 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1441 }
nucleosam 0:00a3c3f5a8f0 1442 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1443 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1444 }
nucleosam 0:00a3c3f5a8f0 1445
nucleosam 0:00a3c3f5a8f0 1446 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 1447 * @brief Sends commands stored previously in the queue by
nucleosam 0:00a3c3f5a8f0 1448 * Powerstep01_QueueCommands
nucleosam 0:00a3c3f5a8f0 1449 * @retval None
nucleosam 0:00a3c3f5a8f0 1450 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1451 void POWERSTEP01::Powerstep01_SendQueuedCommands(void)
nucleosam 0:00a3c3f5a8f0 1452 {
nucleosam 0:00a3c3f5a8f0 1453 uint8_t loop;
nucleosam 0:00a3c3f5a8f0 1454
nucleosam 0:00a3c3f5a8f0 1455 for (loop = 0;
nucleosam 0:00a3c3f5a8f0 1456 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1457 loop++)
nucleosam 0:00a3c3f5a8f0 1458 {
nucleosam 0:00a3c3f5a8f0 1459 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1460 }
nucleosam 0:00a3c3f5a8f0 1461 }
nucleosam 0:00a3c3f5a8f0 1462
nucleosam 0:00a3c3f5a8f0 1463 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1464 * @brief Issues the SetParam command to the PowerStep01
nucleosam 0:00a3c3f5a8f0 1465 * @param[in] param PowerStep01 Register address
nucleosam 0:00a3c3f5a8f0 1466 * @param[in] value Float value to convert and set into the register
nucleosam 0:00a3c3f5a8f0 1467 * @retval TRUE if param is valid, FALSE otherwise
nucleosam 0:00a3c3f5a8f0 1468 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1469 bool POWERSTEP01::Powerstep01_SetAnalogValue(powerstep01_Registers_t param, float value)
nucleosam 0:00a3c3f5a8f0 1470 {
nucleosam 0:00a3c3f5a8f0 1471 uint32_t registerValue;
nucleosam 0:00a3c3f5a8f0 1472 bool result = TRUE;
nucleosam 0:00a3c3f5a8f0 1473 bool voltageMode = ((POWERSTEP01_CM_VM_CURRENT&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))==0);
nucleosam 0:00a3c3f5a8f0 1474 if ((value < 0)&&((param != POWERSTEP01_ABS_POS)&&(param != POWERSTEP01_MARK)))
nucleosam 0:00a3c3f5a8f0 1475 {
nucleosam 0:00a3c3f5a8f0 1476 result = FALSE;
nucleosam 0:00a3c3f5a8f0 1477 }
nucleosam 0:00a3c3f5a8f0 1478 switch (param)
nucleosam 0:00a3c3f5a8f0 1479 {
nucleosam 0:00a3c3f5a8f0 1480 case POWERSTEP01_EL_POS:
nucleosam 0:00a3c3f5a8f0 1481 if ((value > (POWERSTEP01_ELPOS_STEP_MASK|POWERSTEP01_ELPOS_MICROSTEP_MASK))||
nucleosam 0:00a3c3f5a8f0 1482 ((value!=0)&&(value < (1<<(7-(POWERSTEP01_STEP_MODE_STEP_SEL&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))))))) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1483 else registerValue = ((uint32_t) value)&(POWERSTEP01_ELPOS_STEP_MASK|POWERSTEP01_ELPOS_MICROSTEP_MASK);
nucleosam 0:00a3c3f5a8f0 1484 break;
nucleosam 0:00a3c3f5a8f0 1485 case POWERSTEP01_ABS_POS:
nucleosam 0:00a3c3f5a8f0 1486 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1487 if (value < 0)
nucleosam 0:00a3c3f5a8f0 1488 {
nucleosam 0:00a3c3f5a8f0 1489 value=-value;
nucleosam 0:00a3c3f5a8f0 1490 if (((uint32_t)value)<=(POWERSTEP01_MAX_POSITION+1))
nucleosam 0:00a3c3f5a8f0 1491 registerValue = (POWERSTEP01_ABS_POS_VALUE_MASK+1-(uint32_t)value)&POWERSTEP01_ABS_POS_VALUE_MASK;
nucleosam 0:00a3c3f5a8f0 1492 else result = FALSE;
nucleosam 0:00a3c3f5a8f0 1493 }
nucleosam 0:00a3c3f5a8f0 1494 else
nucleosam 0:00a3c3f5a8f0 1495 {
nucleosam 0:00a3c3f5a8f0 1496 if (((uint32_t)value)<=POWERSTEP01_MAX_POSITION)
nucleosam 0:00a3c3f5a8f0 1497 registerValue = ((uint32_t) value)&POWERSTEP01_ABS_POS_VALUE_MASK;
nucleosam 0:00a3c3f5a8f0 1498 else result = FALSE;
nucleosam 0:00a3c3f5a8f0 1499 }
nucleosam 0:00a3c3f5a8f0 1500 break;
nucleosam 0:00a3c3f5a8f0 1501 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1502 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1503 if (value > POWERSTEP01_ACC_DEC_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1504 else registerValue = AccDec_Steps_s2_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1505 break;
nucleosam 0:00a3c3f5a8f0 1506 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1507 if (value > POWERSTEP01_MAX_SPEED_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1508 else registerValue = MaxSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1509 break;
nucleosam 0:00a3c3f5a8f0 1510 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1511 if (value > POWERSTEP01_MIN_SPEED_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1512 else registerValue = (POWERSTEP01_LSPD_OPT&Powerstep01_CmdGetParam(param))|MinSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1513 break;
nucleosam 0:00a3c3f5a8f0 1514 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1515 if (value > POWERSTEP01_FS_SPD_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1516 else registerValue = (POWERSTEP01_BOOST_MODE&Powerstep01_CmdGetParam(param))|FSSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1517 break;
nucleosam 0:00a3c3f5a8f0 1518 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1519 if (value > POWERSTEP01_INT_SPD_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1520 else registerValue = IntSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1521 break;
nucleosam 0:00a3c3f5a8f0 1522 case POWERSTEP01_K_THERM:
nucleosam 0:00a3c3f5a8f0 1523 if ((value < POWERSTEP01_K_THERM_MIN_VALUE)||
nucleosam 0:00a3c3f5a8f0 1524 (value > POWERSTEP01_K_THERM_MAX_VALUE)) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1525 else registerValue = KTherm_Comp_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1526 break;
nucleosam 0:00a3c3f5a8f0 1527 case POWERSTEP01_OCD_TH:
nucleosam 0:00a3c3f5a8f0 1528 case POWERSTEP01_STALL_TH:
nucleosam 0:00a3c3f5a8f0 1529 if (value > POWERSTEP01_STALL_OCD_TH_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1530 else registerValue = StallOcd_Th_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1531 break;
nucleosam 0:00a3c3f5a8f0 1532 case POWERSTEP01_KVAL_HOLD: //POWERSTEP01_TVAL_HOLD
nucleosam 0:00a3c3f5a8f0 1533 case POWERSTEP01_KVAL_RUN: //POWERSTEP01_TVAL_RUN
nucleosam 0:00a3c3f5a8f0 1534 case POWERSTEP01_KVAL_ACC: //POWERSTEP01_TVAL_ACC
nucleosam 0:00a3c3f5a8f0 1535 case POWERSTEP01_KVAL_DEC: //POWERSTEP01_TVAL_DEC
nucleosam 0:00a3c3f5a8f0 1536 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1537 {
nucleosam 0:00a3c3f5a8f0 1538 if (value > POWERSTEP01_TVAL_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1539 else registerValue = Tval_Current_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1540 }
nucleosam 0:00a3c3f5a8f0 1541 else
nucleosam 0:00a3c3f5a8f0 1542 {
nucleosam 0:00a3c3f5a8f0 1543 if (value > POWERSTEP01_KVAL_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1544 else registerValue = Kval_Perc_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1545 }
nucleosam 0:00a3c3f5a8f0 1546 break;
nucleosam 0:00a3c3f5a8f0 1547 case POWERSTEP01_ST_SLP:
nucleosam 0:00a3c3f5a8f0 1548 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1549 {
nucleosam 0:00a3c3f5a8f0 1550 result = FALSE;
nucleosam 0:00a3c3f5a8f0 1551 break;
nucleosam 0:00a3c3f5a8f0 1552 }
nucleosam 0:00a3c3f5a8f0 1553 case POWERSTEP01_FN_SLP_ACC: //POWERSTEP01_TON_MIN
nucleosam 0:00a3c3f5a8f0 1554 case POWERSTEP01_FN_SLP_DEC: //POWERSTEP01_TOFF_MIN
nucleosam 0:00a3c3f5a8f0 1555 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1556 {
nucleosam 0:00a3c3f5a8f0 1557 if (value>POWERSTEP01_TOFF_TON_MIN_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1558 else registerValue = Tmin_Time_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1559 }
nucleosam 0:00a3c3f5a8f0 1560 else
nucleosam 0:00a3c3f5a8f0 1561 {
nucleosam 0:00a3c3f5a8f0 1562 if (value > POWERSTEP01_SLP_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1563 else registerValue = BEMFslope_Perc_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1564 }
nucleosam 0:00a3c3f5a8f0 1565 break;
nucleosam 0:00a3c3f5a8f0 1566 default:
nucleosam 0:00a3c3f5a8f0 1567 result = FALSE;
nucleosam 0:00a3c3f5a8f0 1568 }
nucleosam 0:00a3c3f5a8f0 1569 if (result!=FALSE)
nucleosam 0:00a3c3f5a8f0 1570 {
nucleosam 0:00a3c3f5a8f0 1571 Powerstep01_CmdSetParam(param, registerValue);
nucleosam 0:00a3c3f5a8f0 1572 }
nucleosam 0:00a3c3f5a8f0 1573 return result;
nucleosam 0:00a3c3f5a8f0 1574 }
nucleosam 0:00a3c3f5a8f0 1575
nucleosam 0:00a3c3f5a8f0 1576 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1577 * @brief Write and receive a byte via SPI
nucleosam 0:00a3c3f5a8f0 1578 * @param[in] pByteToTransmit pointer to the byte to transmit
nucleosam 0:00a3c3f5a8f0 1579 * @param[in] pReceivedByte pointer to the received byte
nucleosam 0:00a3c3f5a8f0 1580 * @retval None
nucleosam 0:00a3c3f5a8f0 1581 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1582 void POWERSTEP01::Powerstep01_WriteBytes(uint8_t *pByteToTransmit, uint8_t *pReceivedByte)
nucleosam 0:00a3c3f5a8f0 1583 {
nucleosam 0:00a3c3f5a8f0 1584 if (Powerstep01_Board_SpiWriteBytes(pByteToTransmit, pReceivedByte) != 0)
nucleosam 0:00a3c3f5a8f0 1585 {
nucleosam 0:00a3c3f5a8f0 1586 Powerstep01_ErrorHandler(POWERSTEP01_ERROR_1);
nucleosam 0:00a3c3f5a8f0 1587 }
nucleosam 0:00a3c3f5a8f0 1588 if (isrFlag)
nucleosam 0:00a3c3f5a8f0 1589 {
nucleosam 0:00a3c3f5a8f0 1590 spiPreemptionByIsr = TRUE;
nucleosam 0:00a3c3f5a8f0 1591 }
nucleosam 0:00a3c3f5a8f0 1592 }
nucleosam 0:00a3c3f5a8f0 1593
nucleosam 0:00a3c3f5a8f0 1594 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/