Personal fork of the library for direct control instead of library control

Dependencies:   X_NUCLEO_COMMON

Dependents:   Thesis_Rotating_Platform

Fork of X_NUCLEO_IHM01A1 by Arkadi Rafalovich

Committer:
Arkadi
Date:
Wed May 24 13:49:40 2017 +0000
Revision:
26:e2049a15fb15
Disabled PWM & direction control in library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Arkadi 26:e2049a15fb15 1 /**
Arkadi 26:e2049a15fb15 2 ******************************************************************************
Arkadi 26:e2049a15fb15 3 * @file l6474_class.h
Arkadi 26:e2049a15fb15 4 * @author Davide Aliprandi, STMicroelectronics
Arkadi 26:e2049a15fb15 5 * @version V1.0.0
Arkadi 26:e2049a15fb15 6 * @date October 14th, 2015
Arkadi 26:e2049a15fb15 7 * @brief This file contains the class of an L6474 Motor Control component.
Arkadi 26:e2049a15fb15 8 ******************************************************************************
Arkadi 26:e2049a15fb15 9 * @attention
Arkadi 26:e2049a15fb15 10 *
Arkadi 26:e2049a15fb15 11 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
Arkadi 26:e2049a15fb15 12 *
Arkadi 26:e2049a15fb15 13 * Redistribution and use in source and binary forms, with or without modification,
Arkadi 26:e2049a15fb15 14 * are permitted provided that the following conditions are met:
Arkadi 26:e2049a15fb15 15 * 1. Redistributions of source code must retain the above copyright notice,
Arkadi 26:e2049a15fb15 16 * this list of conditions and the following disclaimer.
Arkadi 26:e2049a15fb15 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
Arkadi 26:e2049a15fb15 18 * this list of conditions and the following disclaimer in the documentation
Arkadi 26:e2049a15fb15 19 * and/or other materials provided with the distribution.
Arkadi 26:e2049a15fb15 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Arkadi 26:e2049a15fb15 21 * may be used to endorse or promote products derived from this software
Arkadi 26:e2049a15fb15 22 * without specific prior written permission.
Arkadi 26:e2049a15fb15 23 *
Arkadi 26:e2049a15fb15 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Arkadi 26:e2049a15fb15 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Arkadi 26:e2049a15fb15 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Arkadi 26:e2049a15fb15 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Arkadi 26:e2049a15fb15 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Arkadi 26:e2049a15fb15 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Arkadi 26:e2049a15fb15 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Arkadi 26:e2049a15fb15 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Arkadi 26:e2049a15fb15 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Arkadi 26:e2049a15fb15 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Arkadi 26:e2049a15fb15 34 *
Arkadi 26:e2049a15fb15 35 ******************************************************************************
Arkadi 26:e2049a15fb15 36 */
Arkadi 26:e2049a15fb15 37
Arkadi 26:e2049a15fb15 38
Arkadi 26:e2049a15fb15 39 /* Generated with STM32CubeTOO -----------------------------------------------*/
Arkadi 26:e2049a15fb15 40
Arkadi 26:e2049a15fb15 41
Arkadi 26:e2049a15fb15 42 /* Revision ------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 43 /*
Arkadi 26:e2049a15fb15 44 Repository: http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
Arkadi 26:e2049a15fb15 45 Branch/Trunk/Tag: trunk
Arkadi 26:e2049a15fb15 46 Based on: X-CUBE-SPN1/trunk/Drivers/BSP/Components/l6474/l6474.h
Arkadi 26:e2049a15fb15 47 Revision: 0
Arkadi 26:e2049a15fb15 48 */
Arkadi 26:e2049a15fb15 49
Arkadi 26:e2049a15fb15 50
Arkadi 26:e2049a15fb15 51 /* Define to prevent recursive inclusion -------------------------------------*/
Arkadi 26:e2049a15fb15 52
Arkadi 26:e2049a15fb15 53 #ifndef __L6474_CLASS_H
Arkadi 26:e2049a15fb15 54 #define __L6474_CLASS_H
Arkadi 26:e2049a15fb15 55
Arkadi 26:e2049a15fb15 56
Arkadi 26:e2049a15fb15 57 /* Includes ------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 58
Arkadi 26:e2049a15fb15 59 /* ACTION 1 ------------------------------------------------------------------*
Arkadi 26:e2049a15fb15 60 * Include here platform specific header files. *
Arkadi 26:e2049a15fb15 61 *----------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 62 #include "mbed.h"
Arkadi 26:e2049a15fb15 63 #include "DevSPI.h"
Arkadi 26:e2049a15fb15 64 /* ACTION 2 ------------------------------------------------------------------*
Arkadi 26:e2049a15fb15 65 * Include here component specific header files. *
Arkadi 26:e2049a15fb15 66 *----------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 67 #include "l6474.h"
Arkadi 26:e2049a15fb15 68 /* ACTION 3 ------------------------------------------------------------------*
Arkadi 26:e2049a15fb15 69 * Include here interface specific header files. *
Arkadi 26:e2049a15fb15 70 * *
Arkadi 26:e2049a15fb15 71 * Example: *
Arkadi 26:e2049a15fb15 72 * #include "../Interfaces/Humidity_class.h" *
Arkadi 26:e2049a15fb15 73 * #include "../Interfaces/Temperature_class.h" *
Arkadi 26:e2049a15fb15 74 *----------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 75 #include "../Interfaces/StepperMotor_class.h"
Arkadi 26:e2049a15fb15 76
Arkadi 26:e2049a15fb15 77
Arkadi 26:e2049a15fb15 78 /* Classes -------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 79
Arkadi 26:e2049a15fb15 80 /**
Arkadi 26:e2049a15fb15 81 * @brief Class representing an L6474 component.
Arkadi 26:e2049a15fb15 82 */
Arkadi 26:e2049a15fb15 83 class L6474 : public StepperMotor
Arkadi 26:e2049a15fb15 84 {
Arkadi 26:e2049a15fb15 85 public:
Arkadi 26:e2049a15fb15 86
Arkadi 26:e2049a15fb15 87 /*** Constructor and Destructor Methods ***/
Arkadi 26:e2049a15fb15 88
Arkadi 26:e2049a15fb15 89 /**
Arkadi 26:e2049a15fb15 90 * @brief Constructor.
Arkadi 26:e2049a15fb15 91 * @param flag_irq pin name of the FLAG pin of the component.
Arkadi 26:e2049a15fb15 92 * @param standby_reset pin name of the STBY\RST pin of the component.
Arkadi 26:e2049a15fb15 93 * @param direction pin name of the DIR pin of the component.
Arkadi 26:e2049a15fb15 94 * @param pwm pin name of the PWM pin of the component.
Arkadi 26:e2049a15fb15 95 * @param ssel pin name of the SSEL pin of the SPI device to be used for communication.
Arkadi 26:e2049a15fb15 96 * @param spi SPI device to be used for communication.
Arkadi 26:e2049a15fb15 97 */
Arkadi 26:e2049a15fb15 98 L6474(PinName flag_irq, PinName standby_reset, PinName direction, PinName pwm, PinName ssel, DevSPI &spi) : StepperMotor(), flag_irq(flag_irq), standby_reset(standby_reset), direction(direction), pwm(pwm), ssel(ssel), dev_spi(spi)
Arkadi 26:e2049a15fb15 99 {
Arkadi 26:e2049a15fb15 100 /* Checking stackability. */
Arkadi 26:e2049a15fb15 101 if (!(number_of_devices < MAX_NUMBER_OF_DEVICES))
Arkadi 26:e2049a15fb15 102 error("Instantiation of the L6474 component failed: it can be stacked up to %d times.\r\n", MAX_NUMBER_OF_DEVICES);
Arkadi 26:e2049a15fb15 103
Arkadi 26:e2049a15fb15 104 /* ACTION 4 ----------------------------------------------------------*
Arkadi 26:e2049a15fb15 105 * Initialize here the component's member variables, one variable per *
Arkadi 26:e2049a15fb15 106 * line. *
Arkadi 26:e2049a15fb15 107 * *
Arkadi 26:e2049a15fb15 108 * Example: *
Arkadi 26:e2049a15fb15 109 * measure = 0; *
Arkadi 26:e2049a15fb15 110 * instance_id = number_of_instances++; *
Arkadi 26:e2049a15fb15 111 *--------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 112 error_handler_callback = 0;
Arkadi 26:e2049a15fb15 113 device_instance = number_of_devices++;
Arkadi 26:e2049a15fb15 114 memset(spi_tx_bursts, 0, L6474_CMD_ARG_MAX_NB_BYTES * MAX_NUMBER_OF_DEVICES * sizeof(uint8_t));
Arkadi 26:e2049a15fb15 115 memset(spi_rx_bursts, 0, L6474_CMD_ARG_MAX_NB_BYTES * MAX_NUMBER_OF_DEVICES * sizeof(uint8_t));
Arkadi 26:e2049a15fb15 116 }
Arkadi 26:e2049a15fb15 117
Arkadi 26:e2049a15fb15 118 /**
Arkadi 26:e2049a15fb15 119 * @brief Destructor.
Arkadi 26:e2049a15fb15 120 */
Arkadi 26:e2049a15fb15 121 virtual ~L6474(void) {}
Arkadi 26:e2049a15fb15 122
Arkadi 26:e2049a15fb15 123
Arkadi 26:e2049a15fb15 124 /*** Public Component Related Methods ***/
Arkadi 26:e2049a15fb15 125
Arkadi 26:e2049a15fb15 126 /* ACTION 5 --------------------------------------------------------------*
Arkadi 26:e2049a15fb15 127 * Implement here the component's public methods, as wrappers of the C *
Arkadi 26:e2049a15fb15 128 * component's functions. *
Arkadi 26:e2049a15fb15 129 * They should be: *
Arkadi 26:e2049a15fb15 130 * + Methods with the same name of the C component's virtual table's *
Arkadi 26:e2049a15fb15 131 * functions (1); *
Arkadi 26:e2049a15fb15 132 * + Methods with the same name of the C component's extended virtual *
Arkadi 26:e2049a15fb15 133 * table's functions, if any (2). *
Arkadi 26:e2049a15fb15 134 * *
Arkadi 26:e2049a15fb15 135 * Example: *
Arkadi 26:e2049a15fb15 136 * virtual int GetValue(float *pData) //(1) *
Arkadi 26:e2049a15fb15 137 * { *
Arkadi 26:e2049a15fb15 138 * return COMPONENT_GetValue(float *pfData); *
Arkadi 26:e2049a15fb15 139 * } *
Arkadi 26:e2049a15fb15 140 * *
Arkadi 26:e2049a15fb15 141 * virtual int EnableFeature(void) //(2) *
Arkadi 26:e2049a15fb15 142 * { *
Arkadi 26:e2049a15fb15 143 * return COMPONENT_EnableFeature(); *
Arkadi 26:e2049a15fb15 144 * } *
Arkadi 26:e2049a15fb15 145 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 146 /**
Arkadi 26:e2049a15fb15 147 * @brief Initializing the component in 1/16 Microstepping mode.
Arkadi 26:e2049a15fb15 148 * @param init Pointer to device specific initalization structure.
Arkadi 26:e2049a15fb15 149 * @retval "0" in case of success, an error code otherwise.
Arkadi 26:e2049a15fb15 150 */
Arkadi 26:e2049a15fb15 151 virtual int Init(void *init = NULL)
Arkadi 26:e2049a15fb15 152 {
Arkadi 26:e2049a15fb15 153 return (int) L6474_Init((void *) init);
Arkadi 26:e2049a15fb15 154 }
Arkadi 26:e2049a15fb15 155
Arkadi 26:e2049a15fb15 156 /**
Arkadi 26:e2049a15fb15 157 * @brief Getting the ID of the component.
Arkadi 26:e2049a15fb15 158 * @param id Pointer to an allocated variable to store the ID into.
Arkadi 26:e2049a15fb15 159 * @retval "0" in case of success, an error code otherwise.
Arkadi 26:e2049a15fb15 160 */
Arkadi 26:e2049a15fb15 161 virtual int ReadID(uint8_t *id = NULL)
Arkadi 26:e2049a15fb15 162 {
Arkadi 26:e2049a15fb15 163 return (int) L6474_ReadID((uint8_t *) id);
Arkadi 26:e2049a15fb15 164 }
Arkadi 26:e2049a15fb15 165
Arkadi 26:e2049a15fb15 166 /**
Arkadi 26:e2049a15fb15 167 * @brief Getting the value of the Status Register.
Arkadi 26:e2049a15fb15 168 * @param None.
Arkadi 26:e2049a15fb15 169 * @retval None.
Arkadi 26:e2049a15fb15 170 * @note The Status Register's flags are cleared, contrary to ReadStatusRegister().
Arkadi 26:e2049a15fb15 171 */
Arkadi 26:e2049a15fb15 172 virtual unsigned int GetStatus(void)
Arkadi 26:e2049a15fb15 173 {
Arkadi 26:e2049a15fb15 174 return (unsigned int) L6474_CmdGetStatus();
Arkadi 26:e2049a15fb15 175 }
Arkadi 26:e2049a15fb15 176
Arkadi 26:e2049a15fb15 177 /**
Arkadi 26:e2049a15fb15 178 * @brief Getting a parameter.
Arkadi 26:e2049a15fb15 179 * @param parameter A parameter's register adress.
Arkadi 26:e2049a15fb15 180 * @retval The parameter's value.
Arkadi 26:e2049a15fb15 181 * @note The Status Register's flags are cleared, contrary to ReadStatusRegister().
Arkadi 26:e2049a15fb15 182 * parameter can be one of the following:
Arkadi 26:e2049a15fb15 183 * + L6474_ABS_POS
Arkadi 26:e2049a15fb15 184 * + L6474_EL_POS
Arkadi 26:e2049a15fb15 185 * + L6474_MARK
Arkadi 26:e2049a15fb15 186 * + L6474_RESERVED_REG01
Arkadi 26:e2049a15fb15 187 * + L6474_RESERVED_REG02
Arkadi 26:e2049a15fb15 188 * + L6474_RESERVED_REG03
Arkadi 26:e2049a15fb15 189 * + L6474_RESERVED_REG04
Arkadi 26:e2049a15fb15 190 * + L6474_RESERVED_REG05
Arkadi 26:e2049a15fb15 191 * + L6474_RESERVED_REG06
Arkadi 26:e2049a15fb15 192 * + L6474_TVAL : value in mA
Arkadi 26:e2049a15fb15 193 * + L6474_RESERVED_REG07
Arkadi 26:e2049a15fb15 194 * + L6474_RESERVED_REG08
Arkadi 26:e2049a15fb15 195 * + L6474_RESERVED_REG09
Arkadi 26:e2049a15fb15 196 * + L6474_RESERVED_REG10
Arkadi 26:e2049a15fb15 197 * + L6474_T_FAST
Arkadi 26:e2049a15fb15 198 * + L6474_TON_MIN : value in us
Arkadi 26:e2049a15fb15 199 * + L6474_TOFF_MIN : value in us
Arkadi 26:e2049a15fb15 200 * + L6474_RESERVED_REG11
Arkadi 26:e2049a15fb15 201 * + L6474_ADC_OUT
Arkadi 26:e2049a15fb15 202 * + L6474_OCD_TH
Arkadi 26:e2049a15fb15 203 * + L6474_RESERVED_REG12
Arkadi 26:e2049a15fb15 204 * + L6474_STEP_MODE
Arkadi 26:e2049a15fb15 205 * + L6474_ALARM_EN
Arkadi 26:e2049a15fb15 206 * + L6474_CONFIG
Arkadi 26:e2049a15fb15 207 * + L6474_STATUS
Arkadi 26:e2049a15fb15 208 * + L6474_RESERVED_REG13
Arkadi 26:e2049a15fb15 209 * + L6474_RESERVED_REG14
Arkadi 26:e2049a15fb15 210 * + L6474_INEXISTENT_REG
Arkadi 26:e2049a15fb15 211 */
Arkadi 26:e2049a15fb15 212 virtual float GetParameter(unsigned int parameter)
Arkadi 26:e2049a15fb15 213 {
Arkadi 26:e2049a15fb15 214 unsigned int register_value = (unsigned int) L6474_CmdGetParam((L6474_Registers_t) parameter);
Arkadi 26:e2049a15fb15 215 float value;
Arkadi 26:e2049a15fb15 216
Arkadi 26:e2049a15fb15 217 switch ((L6474_Registers_t) parameter)
Arkadi 26:e2049a15fb15 218 {
Arkadi 26:e2049a15fb15 219 case L6474_TVAL:
Arkadi 26:e2049a15fb15 220 value = L6474_Par_to_Tval_Current((float) register_value);
Arkadi 26:e2049a15fb15 221 break;
Arkadi 26:e2049a15fb15 222 case L6474_TON_MIN:
Arkadi 26:e2049a15fb15 223 case L6474_TOFF_MIN:
Arkadi 26:e2049a15fb15 224 value = L6474_Par_to_Tmin_Time((float) register_value);
Arkadi 26:e2049a15fb15 225 break;
Arkadi 26:e2049a15fb15 226 default:
Arkadi 26:e2049a15fb15 227 value = (float) register_value;
Arkadi 26:e2049a15fb15 228 break;
Arkadi 26:e2049a15fb15 229 }
Arkadi 26:e2049a15fb15 230
Arkadi 26:e2049a15fb15 231 return value;
Arkadi 26:e2049a15fb15 232 }
Arkadi 26:e2049a15fb15 233
Arkadi 26:e2049a15fb15 234 /**
Arkadi 26:e2049a15fb15 235 * @brief Getting the position.
Arkadi 26:e2049a15fb15 236 * @param None.
Arkadi 26:e2049a15fb15 237 * @retval The position.
Arkadi 26:e2049a15fb15 238 */
Arkadi 26:e2049a15fb15 239 virtual signed int GetPosition(void)
Arkadi 26:e2049a15fb15 240 {
Arkadi 26:e2049a15fb15 241 return (signed int) L6474_GetPosition();
Arkadi 26:e2049a15fb15 242 }
Arkadi 26:e2049a15fb15 243
Arkadi 26:e2049a15fb15 244 /**
Arkadi 26:e2049a15fb15 245 * @brief Getting the marked position.
Arkadi 26:e2049a15fb15 246 * @param None.
Arkadi 26:e2049a15fb15 247 * @retval The marked position.
Arkadi 26:e2049a15fb15 248 */
Arkadi 26:e2049a15fb15 249 virtual signed int GetMark(void)
Arkadi 26:e2049a15fb15 250 {
Arkadi 26:e2049a15fb15 251 return (signed int) L6474_GetMark();
Arkadi 26:e2049a15fb15 252 }
Arkadi 26:e2049a15fb15 253
Arkadi 26:e2049a15fb15 254 /**
Arkadi 26:e2049a15fb15 255 * @brief Getting the current speed in pps.
Arkadi 26:e2049a15fb15 256 * @param None.
Arkadi 26:e2049a15fb15 257 * @retval The current speed in pps.
Arkadi 26:e2049a15fb15 258 */
Arkadi 26:e2049a15fb15 259 virtual unsigned int GetSpeed(void)
Arkadi 26:e2049a15fb15 260 {
Arkadi 26:e2049a15fb15 261 return (unsigned int) L6474_GetCurrentSpeed();
Arkadi 26:e2049a15fb15 262 }
Arkadi 26:e2049a15fb15 263
Arkadi 26:e2049a15fb15 264 /**
Arkadi 26:e2049a15fb15 265 * @brief Getting the maximum speed in pps.
Arkadi 26:e2049a15fb15 266 * @param None.
Arkadi 26:e2049a15fb15 267 * @retval The maximum speed in pps.
Arkadi 26:e2049a15fb15 268 */
Arkadi 26:e2049a15fb15 269 virtual unsigned int GetMaxSpeed(void)
Arkadi 26:e2049a15fb15 270 {
Arkadi 26:e2049a15fb15 271 return (unsigned int) L6474_GetMaxSpeed();
Arkadi 26:e2049a15fb15 272 }
Arkadi 26:e2049a15fb15 273
Arkadi 26:e2049a15fb15 274 /**
Arkadi 26:e2049a15fb15 275 * @brief Getting the minimum speed in pps.
Arkadi 26:e2049a15fb15 276 * @param None.
Arkadi 26:e2049a15fb15 277 * @retval The minimum speed in pps.
Arkadi 26:e2049a15fb15 278 */
Arkadi 26:e2049a15fb15 279 virtual unsigned int GetMinSpeed(void)
Arkadi 26:e2049a15fb15 280 {
Arkadi 26:e2049a15fb15 281 return (unsigned int) L6474_GetMinSpeed();
Arkadi 26:e2049a15fb15 282 }
Arkadi 26:e2049a15fb15 283
Arkadi 26:e2049a15fb15 284 /**
Arkadi 26:e2049a15fb15 285 * @brief Getting the acceleration in pps^2.
Arkadi 26:e2049a15fb15 286 * @param None.
Arkadi 26:e2049a15fb15 287 * @retval The acceleration in pps^2.
Arkadi 26:e2049a15fb15 288 */
Arkadi 26:e2049a15fb15 289 virtual unsigned int GetAcceleration(void)
Arkadi 26:e2049a15fb15 290 {
Arkadi 26:e2049a15fb15 291 return (unsigned int) L6474_GetAcceleration();
Arkadi 26:e2049a15fb15 292 }
Arkadi 26:e2049a15fb15 293
Arkadi 26:e2049a15fb15 294 /**
Arkadi 26:e2049a15fb15 295 * @brief Getting the deceleration in pps^2.
Arkadi 26:e2049a15fb15 296 * @param None.
Arkadi 26:e2049a15fb15 297 * @retval The deceleration in pps^2.
Arkadi 26:e2049a15fb15 298 */
Arkadi 26:e2049a15fb15 299 virtual unsigned int GetDeceleration(void)
Arkadi 26:e2049a15fb15 300 {
Arkadi 26:e2049a15fb15 301 return (unsigned int) L6474_GetDeceleration();
Arkadi 26:e2049a15fb15 302 }
Arkadi 26:e2049a15fb15 303
Arkadi 26:e2049a15fb15 304 /**
Arkadi 26:e2049a15fb15 305 * @brief Getting the direction of rotation.
Arkadi 26:e2049a15fb15 306 * @param None.
Arkadi 26:e2049a15fb15 307 * @retval The direction of rotation.
Arkadi 26:e2049a15fb15 308 */
Arkadi 26:e2049a15fb15 309 virtual direction_t GetDirection(void)
Arkadi 26:e2049a15fb15 310 {
Arkadi 26:e2049a15fb15 311 return (direction_t) (L6474_GetDirection() == FORWARD ? StepperMotor::FWD : StepperMotor::BWD);
Arkadi 26:e2049a15fb15 312 }
Arkadi 26:e2049a15fb15 313
Arkadi 26:e2049a15fb15 314 /**
Arkadi 26:e2049a15fb15 315 * @brief Setting a parameter.
Arkadi 26:e2049a15fb15 316 * @param parameter A parameter's register adress.
Arkadi 26:e2049a15fb15 317 * @param value The parameter's value.
Arkadi 26:e2049a15fb15 318 * @retval None.
Arkadi 26:e2049a15fb15 319 * @note parameter can be one of the following:
Arkadi 26:e2049a15fb15 320 * + L6474_ABS_POS
Arkadi 26:e2049a15fb15 321 * + L6474_EL_POS
Arkadi 26:e2049a15fb15 322 * + L6474_MARK
Arkadi 26:e2049a15fb15 323 * + L6474_RESERVED_REG01
Arkadi 26:e2049a15fb15 324 * + L6474_RESERVED_REG02
Arkadi 26:e2049a15fb15 325 * + L6474_RESERVED_REG03
Arkadi 26:e2049a15fb15 326 * + L6474_RESERVED_REG04
Arkadi 26:e2049a15fb15 327 * + L6474_RESERVED_REG05
Arkadi 26:e2049a15fb15 328 * + L6474_RESERVED_REG06
Arkadi 26:e2049a15fb15 329 * + L6474_TVAL : value in mA
Arkadi 26:e2049a15fb15 330 * + L6474_RESERVED_REG07
Arkadi 26:e2049a15fb15 331 * + L6474_RESERVED_REG08
Arkadi 26:e2049a15fb15 332 * + L6474_RESERVED_REG09
Arkadi 26:e2049a15fb15 333 * + L6474_RESERVED_REG10
Arkadi 26:e2049a15fb15 334 * + L6474_T_FAST
Arkadi 26:e2049a15fb15 335 * + L6474_TON_MIN : value in us
Arkadi 26:e2049a15fb15 336 * + L6474_TOFF_MIN : value in us
Arkadi 26:e2049a15fb15 337 * + L6474_RESERVED_REG11
Arkadi 26:e2049a15fb15 338 * + L6474_ADC_OUT
Arkadi 26:e2049a15fb15 339 * + L6474_OCD_TH
Arkadi 26:e2049a15fb15 340 * + L6474_RESERVED_REG12
Arkadi 26:e2049a15fb15 341 * + L6474_STEP_MODE
Arkadi 26:e2049a15fb15 342 * + L6474_ALARM_EN
Arkadi 26:e2049a15fb15 343 * + L6474_CONFIG
Arkadi 26:e2049a15fb15 344 * + L6474_STATUS
Arkadi 26:e2049a15fb15 345 * + L6474_RESERVED_REG13
Arkadi 26:e2049a15fb15 346 * + L6474_RESERVED_REG14
Arkadi 26:e2049a15fb15 347 * + L6474_INEXISTENT_REG
Arkadi 26:e2049a15fb15 348 */
Arkadi 26:e2049a15fb15 349 virtual void SetParameter(unsigned int parameter, float value)
Arkadi 26:e2049a15fb15 350 {
Arkadi 26:e2049a15fb15 351 float register_value;
Arkadi 26:e2049a15fb15 352
Arkadi 26:e2049a15fb15 353 switch ((L6474_Registers_t) parameter)
Arkadi 26:e2049a15fb15 354 {
Arkadi 26:e2049a15fb15 355 case L6474_TVAL:
Arkadi 26:e2049a15fb15 356 register_value = L6474_Tval_Current_to_Par(value);
Arkadi 26:e2049a15fb15 357 break;
Arkadi 26:e2049a15fb15 358 case L6474_TON_MIN:
Arkadi 26:e2049a15fb15 359 case L6474_TOFF_MIN:
Arkadi 26:e2049a15fb15 360 register_value = L6474_Tmin_Time_to_Par(value);
Arkadi 26:e2049a15fb15 361 break;
Arkadi 26:e2049a15fb15 362 default:
Arkadi 26:e2049a15fb15 363 register_value = value;
Arkadi 26:e2049a15fb15 364 break;
Arkadi 26:e2049a15fb15 365 }
Arkadi 26:e2049a15fb15 366
Arkadi 26:e2049a15fb15 367 L6474_CmdSetParam((L6474_Registers_t) parameter, (unsigned int) register_value);
Arkadi 26:e2049a15fb15 368 }
Arkadi 26:e2049a15fb15 369
Arkadi 26:e2049a15fb15 370 /**
Arkadi 26:e2049a15fb15 371 * @brief Setting the current position to be the home position.
Arkadi 26:e2049a15fb15 372 * @param None.
Arkadi 26:e2049a15fb15 373 * @retval None.
Arkadi 26:e2049a15fb15 374 */
Arkadi 26:e2049a15fb15 375 virtual void SetHome(void)
Arkadi 26:e2049a15fb15 376 {
Arkadi 26:e2049a15fb15 377 L6474_SetHome();
Arkadi 26:e2049a15fb15 378 }
Arkadi 26:e2049a15fb15 379
Arkadi 26:e2049a15fb15 380 /**
Arkadi 26:e2049a15fb15 381 * @brief Setting the current position to be the marked position.
Arkadi 26:e2049a15fb15 382 * @param None.
Arkadi 26:e2049a15fb15 383 * @retval None.
Arkadi 26:e2049a15fb15 384 */
Arkadi 26:e2049a15fb15 385 virtual void SetMark(void)
Arkadi 26:e2049a15fb15 386 {
Arkadi 26:e2049a15fb15 387 L6474_SetMark();
Arkadi 26:e2049a15fb15 388 }
Arkadi 26:e2049a15fb15 389
Arkadi 26:e2049a15fb15 390 /**
Arkadi 26:e2049a15fb15 391 * @brief Setting the maximum speed in pps.
Arkadi 26:e2049a15fb15 392 * @param speed The maximum speed in pps.
Arkadi 26:e2049a15fb15 393 * @retval None.
Arkadi 26:e2049a15fb15 394 */
Arkadi 26:e2049a15fb15 395 virtual void SetMaxSpeed(unsigned int speed)
Arkadi 26:e2049a15fb15 396 {
Arkadi 26:e2049a15fb15 397 L6474_SetMaxSpeed((unsigned int) speed);
Arkadi 26:e2049a15fb15 398 }
Arkadi 26:e2049a15fb15 399
Arkadi 26:e2049a15fb15 400 /**
Arkadi 26:e2049a15fb15 401 * @brief Setting the minimum speed in pps.
Arkadi 26:e2049a15fb15 402 * @param speed The minimum speed in pps.
Arkadi 26:e2049a15fb15 403 * @retval None.
Arkadi 26:e2049a15fb15 404 */
Arkadi 26:e2049a15fb15 405 virtual void SetMinSpeed(unsigned int speed)
Arkadi 26:e2049a15fb15 406 {
Arkadi 26:e2049a15fb15 407 L6474_SetMinSpeed((unsigned int) speed);
Arkadi 26:e2049a15fb15 408 }
Arkadi 26:e2049a15fb15 409
Arkadi 26:e2049a15fb15 410 /**
Arkadi 26:e2049a15fb15 411 * @brief Setting the acceleration in pps^2.
Arkadi 26:e2049a15fb15 412 * @param acceleration The acceleration in pps^2.
Arkadi 26:e2049a15fb15 413 * @retval None.
Arkadi 26:e2049a15fb15 414 */
Arkadi 26:e2049a15fb15 415 virtual void SetAcceleration(unsigned int acceleration)
Arkadi 26:e2049a15fb15 416 {
Arkadi 26:e2049a15fb15 417 L6474_SetAcceleration((unsigned int) acceleration);
Arkadi 26:e2049a15fb15 418 }
Arkadi 26:e2049a15fb15 419
Arkadi 26:e2049a15fb15 420 /**
Arkadi 26:e2049a15fb15 421 * @brief Setting the deceleration in pps^2.
Arkadi 26:e2049a15fb15 422 * @param deceleration The deceleration in pps^2.
Arkadi 26:e2049a15fb15 423 * @retval None.
Arkadi 26:e2049a15fb15 424 */
Arkadi 26:e2049a15fb15 425 virtual void SetDeceleration(unsigned int deceleration)
Arkadi 26:e2049a15fb15 426 {
Arkadi 26:e2049a15fb15 427 L6474_SetDeceleration((unsigned int) deceleration);
Arkadi 26:e2049a15fb15 428 }
Arkadi 26:e2049a15fb15 429
Arkadi 26:e2049a15fb15 430 /**
Arkadi 26:e2049a15fb15 431 * @brief Going to a specified position.
Arkadi 26:e2049a15fb15 432 * @param position The desired position.
Arkadi 26:e2049a15fb15 433 * @retval None.
Arkadi 26:e2049a15fb15 434 */
Arkadi 26:e2049a15fb15 435 virtual void GoTo(signed int position)
Arkadi 26:e2049a15fb15 436 {
Arkadi 26:e2049a15fb15 437 L6474_GoTo((signed int) position);
Arkadi 26:e2049a15fb15 438 }
Arkadi 26:e2049a15fb15 439
Arkadi 26:e2049a15fb15 440 /**
Arkadi 26:e2049a15fb15 441 * @brief Going to the home position.
Arkadi 26:e2049a15fb15 442 * @param None.
Arkadi 26:e2049a15fb15 443 * @retval None.
Arkadi 26:e2049a15fb15 444 */
Arkadi 26:e2049a15fb15 445 virtual void GoHome(void)
Arkadi 26:e2049a15fb15 446 {
Arkadi 26:e2049a15fb15 447 L6474_GoHome();
Arkadi 26:e2049a15fb15 448 }
Arkadi 26:e2049a15fb15 449
Arkadi 26:e2049a15fb15 450 /**
Arkadi 26:e2049a15fb15 451 * @brief Going to the marked position.
Arkadi 26:e2049a15fb15 452 * @param None.
Arkadi 26:e2049a15fb15 453 * @retval None.
Arkadi 26:e2049a15fb15 454 */
Arkadi 26:e2049a15fb15 455 virtual void GoMark(void)
Arkadi 26:e2049a15fb15 456 {
Arkadi 26:e2049a15fb15 457 L6474_GoMark();
Arkadi 26:e2049a15fb15 458 }
Arkadi 26:e2049a15fb15 459
Arkadi 26:e2049a15fb15 460 /**
Arkadi 26:e2049a15fb15 461 * @brief Running the motor towards a specified direction.
Arkadi 26:e2049a15fb15 462 * @param direction The direction of rotation.
Arkadi 26:e2049a15fb15 463 * @retval None.
Arkadi 26:e2049a15fb15 464 */
Arkadi 26:e2049a15fb15 465 virtual void Run(direction_t direction)
Arkadi 26:e2049a15fb15 466 {
Arkadi 26:e2049a15fb15 467 L6474_Run((motorDir_t) (direction == StepperMotor::FWD ? FORWARD : BACKWARD));
Arkadi 26:e2049a15fb15 468 }
Arkadi 26:e2049a15fb15 469
Arkadi 26:e2049a15fb15 470 /**
Arkadi 26:e2049a15fb15 471 * @brief Moving the motor towards a specified direction for a certain number of steps.
Arkadi 26:e2049a15fb15 472 * @param direction The direction of rotation.
Arkadi 26:e2049a15fb15 473 * @param steps The desired number of steps.
Arkadi 26:e2049a15fb15 474 * @retval None.
Arkadi 26:e2049a15fb15 475 */
Arkadi 26:e2049a15fb15 476 virtual void Move(direction_t direction, unsigned int steps)
Arkadi 26:e2049a15fb15 477 {
Arkadi 26:e2049a15fb15 478 L6474_Move((motorDir_t) (direction == StepperMotor::FWD ? FORWARD : BACKWARD), (unsigned int) steps);
Arkadi 26:e2049a15fb15 479 }
Arkadi 26:e2049a15fb15 480
Arkadi 26:e2049a15fb15 481 /**
Arkadi 26:e2049a15fb15 482 * @brief Stopping the motor through an immediate deceleration up to zero speed.
Arkadi 26:e2049a15fb15 483 * @param None.
Arkadi 26:e2049a15fb15 484 * @retval None.
Arkadi 26:e2049a15fb15 485 */
Arkadi 26:e2049a15fb15 486 virtual void SoftStop(void)
Arkadi 26:e2049a15fb15 487 {
Arkadi 26:e2049a15fb15 488 L6474_SoftStop();
Arkadi 26:e2049a15fb15 489 }
Arkadi 26:e2049a15fb15 490
Arkadi 26:e2049a15fb15 491 /**
Arkadi 26:e2049a15fb15 492 * @brief Stopping the motor through an immediate infinite deceleration.
Arkadi 26:e2049a15fb15 493 * @param None.
Arkadi 26:e2049a15fb15 494 * @retval None.
Arkadi 26:e2049a15fb15 495 */
Arkadi 26:e2049a15fb15 496 virtual void HardStop(void)
Arkadi 26:e2049a15fb15 497 {
Arkadi 26:e2049a15fb15 498 L6474_HardStop();
Arkadi 26:e2049a15fb15 499 }
Arkadi 26:e2049a15fb15 500
Arkadi 26:e2049a15fb15 501 /**
Arkadi 26:e2049a15fb15 502 * @brief Disabling the power bridge after performing a deceleration to zero.
Arkadi 26:e2049a15fb15 503 * @param None.
Arkadi 26:e2049a15fb15 504 * @retval None.
Arkadi 26:e2049a15fb15 505 */
Arkadi 26:e2049a15fb15 506 virtual void SoftHiZ(void)
Arkadi 26:e2049a15fb15 507 {
Arkadi 26:e2049a15fb15 508 L6474_SoftStop();
Arkadi 26:e2049a15fb15 509 L6474_CmdDisable();
Arkadi 26:e2049a15fb15 510 }
Arkadi 26:e2049a15fb15 511
Arkadi 26:e2049a15fb15 512 /**
Arkadi 26:e2049a15fb15 513 * @brief Disabling the power bridge immediately.
Arkadi 26:e2049a15fb15 514 * @param None.
Arkadi 26:e2049a15fb15 515 * @retval None.
Arkadi 26:e2049a15fb15 516 */
Arkadi 26:e2049a15fb15 517 virtual void HardHiZ(void)
Arkadi 26:e2049a15fb15 518 {
Arkadi 26:e2049a15fb15 519 L6474_HardStop();
Arkadi 26:e2049a15fb15 520 L6474_CmdDisable();
Arkadi 26:e2049a15fb15 521 }
Arkadi 26:e2049a15fb15 522
Arkadi 26:e2049a15fb15 523 /**
Arkadi 26:e2049a15fb15 524 * @brief Waiting while the motor is active.
Arkadi 26:e2049a15fb15 525 * @param None.
Arkadi 26:e2049a15fb15 526 * @retval None.
Arkadi 26:e2049a15fb15 527 */
Arkadi 26:e2049a15fb15 528 virtual void WaitWhileActive(void)
Arkadi 26:e2049a15fb15 529 {
Arkadi 26:e2049a15fb15 530 L6474_WaitWhileActive();
Arkadi 26:e2049a15fb15 531 }
Arkadi 26:e2049a15fb15 532
Arkadi 26:e2049a15fb15 533 /**
Arkadi 26:e2049a15fb15 534 * @brief Getting the device state.
Arkadi 26:e2049a15fb15 535 * @param None.
Arkadi 26:e2049a15fb15 536 * @retval The device state.
Arkadi 26:e2049a15fb15 537 * @note The device state can be one of the following:
Arkadi 26:e2049a15fb15 538 * + ACCELERATING
Arkadi 26:e2049a15fb15 539 * + DECELERATING
Arkadi 26:e2049a15fb15 540 * + STEADY
Arkadi 26:e2049a15fb15 541 * + INACTIVE
Arkadi 26:e2049a15fb15 542 */
Arkadi 26:e2049a15fb15 543 virtual motorState_t GetDeviceState(void)
Arkadi 26:e2049a15fb15 544 {
Arkadi 26:e2049a15fb15 545 return (motorState_t) L6474_GetDeviceState();
Arkadi 26:e2049a15fb15 546 }
Arkadi 26:e2049a15fb15 547
Arkadi 26:e2049a15fb15 548 /**
Arkadi 26:e2049a15fb15 549 * @brief Reading the Status Register.
Arkadi 26:e2049a15fb15 550 * @param None.
Arkadi 26:e2049a15fb15 551 * @retval None.
Arkadi 26:e2049a15fb15 552 * @note The Status Register's flags are not cleared, contrary to GetStatus().
Arkadi 26:e2049a15fb15 553 */
Arkadi 26:e2049a15fb15 554 virtual uint16_t ReadStatusRegister(void)
Arkadi 26:e2049a15fb15 555 {
Arkadi 26:e2049a15fb15 556 return (uint16_t) L6474_ReadStatusRegister();
Arkadi 26:e2049a15fb15 557 }
Arkadi 26:e2049a15fb15 558
Arkadi 26:e2049a15fb15 559 /**
Arkadi 26:e2049a15fb15 560 * @brief Setting the Step Mode.
Arkadi 26:e2049a15fb15 561 * @param step_mode The Step Mode.
Arkadi 26:e2049a15fb15 562 * @retval None.
Arkadi 26:e2049a15fb15 563 * @note step_mode can be one of the following:
Arkadi 26:e2049a15fb15 564 * + STEP_MODE_FULL
Arkadi 26:e2049a15fb15 565 * + STEP_MODE_HALF
Arkadi 26:e2049a15fb15 566 * + STEP_MODE_1_4
Arkadi 26:e2049a15fb15 567 * + STEP_MODE_1_8
Arkadi 26:e2049a15fb15 568 * + STEP_MODE_1_16
Arkadi 26:e2049a15fb15 569 * + STEP_MODE_1_32
Arkadi 26:e2049a15fb15 570 * + STEP_MODE_1_64
Arkadi 26:e2049a15fb15 571 * + STEP_MODE_1_128
Arkadi 26:e2049a15fb15 572 */
Arkadi 26:e2049a15fb15 573 virtual void SetStepMode(motorStepMode_t step_mode)
Arkadi 26:e2049a15fb15 574 {
Arkadi 26:e2049a15fb15 575 L6474_SelectStepMode((motorStepMode_t) step_mode);
Arkadi 26:e2049a15fb15 576 }
Arkadi 26:e2049a15fb15 577
Arkadi 26:e2049a15fb15 578 /**
Arkadi 26:e2049a15fb15 579 * @brief Attaching an error handler.
Arkadi 26:e2049a15fb15 580 * @param fptr An error handler.
Arkadi 26:e2049a15fb15 581 * @retval None.
Arkadi 26:e2049a15fb15 582 */
Arkadi 26:e2049a15fb15 583 virtual void AttachErrorHandler(void (*fptr)(uint16_t error))
Arkadi 26:e2049a15fb15 584 {
Arkadi 26:e2049a15fb15 585 L6474_AttachErrorHandler((void (*)(uint16_t error)) fptr);
Arkadi 26:e2049a15fb15 586 }
Arkadi 26:e2049a15fb15 587
Arkadi 26:e2049a15fb15 588 /**
Arkadi 26:e2049a15fb15 589 * @brief Enabling the device.
Arkadi 26:e2049a15fb15 590 * @param None.
Arkadi 26:e2049a15fb15 591 * @retval None.
Arkadi 26:e2049a15fb15 592 */
Arkadi 26:e2049a15fb15 593 virtual void Enable(void)
Arkadi 26:e2049a15fb15 594 {
Arkadi 26:e2049a15fb15 595 L6474_CmdEnable();
Arkadi 26:e2049a15fb15 596 }
Arkadi 26:e2049a15fb15 597
Arkadi 26:e2049a15fb15 598 /**
Arkadi 26:e2049a15fb15 599 * @brief Disabling the device.
Arkadi 26:e2049a15fb15 600 * @param None.
Arkadi 26:e2049a15fb15 601 * @retval None.
Arkadi 26:e2049a15fb15 602 */
Arkadi 26:e2049a15fb15 603 virtual void Disable(void)
Arkadi 26:e2049a15fb15 604 {
Arkadi 26:e2049a15fb15 605 L6474_CmdDisable();
Arkadi 26:e2049a15fb15 606 }
Arkadi 26:e2049a15fb15 607
Arkadi 26:e2049a15fb15 608 /**
Arkadi 26:e2049a15fb15 609 * @brief Getting the version of the firmware.
Arkadi 26:e2049a15fb15 610 * @param None.
Arkadi 26:e2049a15fb15 611 * @retval The version of the firmware.
Arkadi 26:e2049a15fb15 612 */
Arkadi 26:e2049a15fb15 613 virtual uint8_t GetFwVersion(void)
Arkadi 26:e2049a15fb15 614 {
Arkadi 26:e2049a15fb15 615 return (uint8_t) L6474_GetFwVersion();
Arkadi 26:e2049a15fb15 616 }
Arkadi 26:e2049a15fb15 617
Arkadi 26:e2049a15fb15 618
Arkadi 26:e2049a15fb15 619 /*** Public Interrupt Related Methods ***/
Arkadi 26:e2049a15fb15 620
Arkadi 26:e2049a15fb15 621 /* ACTION 6 --------------------------------------------------------------*
Arkadi 26:e2049a15fb15 622 * Implement here interrupt related methods, if any. *
Arkadi 26:e2049a15fb15 623 * Note that interrupt handling is platform dependent, e.g.: *
Arkadi 26:e2049a15fb15 624 * + mbed: *
Arkadi 26:e2049a15fb15 625 * InterruptIn feature_irq(pin); //Interrupt object. *
Arkadi 26:e2049a15fb15 626 * feature_irq.rise(callback); //Attach a callback. *
Arkadi 26:e2049a15fb15 627 * feature_irq.mode(PullNone); //Set interrupt mode. *
Arkadi 26:e2049a15fb15 628 * feature_irq.enable_irq(); //Enable interrupt. *
Arkadi 26:e2049a15fb15 629 * feature_irq.disable_irq(); //Disable interrupt. *
Arkadi 26:e2049a15fb15 630 * + Arduino: *
Arkadi 26:e2049a15fb15 631 * attachInterrupt(pin, callback, RISING); //Attach a callback. *
Arkadi 26:e2049a15fb15 632 * detachInterrupt(pin); //Detach a callback. *
Arkadi 26:e2049a15fb15 633 * *
Arkadi 26:e2049a15fb15 634 * Example (mbed): *
Arkadi 26:e2049a15fb15 635 * void AttachFeatureIRQ(void (*fptr) (void)) *
Arkadi 26:e2049a15fb15 636 * { *
Arkadi 26:e2049a15fb15 637 * feature_irq.rise(fptr); *
Arkadi 26:e2049a15fb15 638 * } *
Arkadi 26:e2049a15fb15 639 * *
Arkadi 26:e2049a15fb15 640 * void EnableFeatureIRQ(void) *
Arkadi 26:e2049a15fb15 641 * { *
Arkadi 26:e2049a15fb15 642 * feature_irq.enable_irq(); *
Arkadi 26:e2049a15fb15 643 * } *
Arkadi 26:e2049a15fb15 644 * *
Arkadi 26:e2049a15fb15 645 * void DisableFeatureIRQ(void) *
Arkadi 26:e2049a15fb15 646 * { *
Arkadi 26:e2049a15fb15 647 * feature_irq.disable_irq(); *
Arkadi 26:e2049a15fb15 648 * } *
Arkadi 26:e2049a15fb15 649 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 650 /**
Arkadi 26:e2049a15fb15 651 * @brief Attaching an interrupt handler to the FLAG interrupt.
Arkadi 26:e2049a15fb15 652 * @param fptr An interrupt handler.
Arkadi 26:e2049a15fb15 653 * @retval None.
Arkadi 26:e2049a15fb15 654 */
Arkadi 26:e2049a15fb15 655 void AttachFlagIRQ(void (*fptr)(void))
Arkadi 26:e2049a15fb15 656 {
Arkadi 26:e2049a15fb15 657 flag_irq.fall(fptr);
Arkadi 26:e2049a15fb15 658 }
Arkadi 26:e2049a15fb15 659
Arkadi 26:e2049a15fb15 660 /**
Arkadi 26:e2049a15fb15 661 * @brief Enabling the FLAG interrupt handling.
Arkadi 26:e2049a15fb15 662 * @param None.
Arkadi 26:e2049a15fb15 663 * @retval None.
Arkadi 26:e2049a15fb15 664 */
Arkadi 26:e2049a15fb15 665 void EnableFlagIRQ(void)
Arkadi 26:e2049a15fb15 666 {
Arkadi 26:e2049a15fb15 667 flag_irq.enable_irq();
Arkadi 26:e2049a15fb15 668 }
Arkadi 26:e2049a15fb15 669
Arkadi 26:e2049a15fb15 670 /**
Arkadi 26:e2049a15fb15 671 * @brief Disabling the FLAG interrupt handling.
Arkadi 26:e2049a15fb15 672 * @param None.
Arkadi 26:e2049a15fb15 673 * @retval None.
Arkadi 26:e2049a15fb15 674 */
Arkadi 26:e2049a15fb15 675 void DisableFlagIRQ(void)
Arkadi 26:e2049a15fb15 676 {
Arkadi 26:e2049a15fb15 677 flag_irq.disable_irq();
Arkadi 26:e2049a15fb15 678 }
Arkadi 26:e2049a15fb15 679
Arkadi 26:e2049a15fb15 680
Arkadi 26:e2049a15fb15 681 protected:
Arkadi 26:e2049a15fb15 682
Arkadi 26:e2049a15fb15 683 /*** Protected Component Related Methods ***/
Arkadi 26:e2049a15fb15 684
Arkadi 26:e2049a15fb15 685 /* ACTION 7 --------------------------------------------------------------*
Arkadi 26:e2049a15fb15 686 * Declare here the component's specific methods. *
Arkadi 26:e2049a15fb15 687 * They should be: *
Arkadi 26:e2049a15fb15 688 * + Methods with the same name of the C component's virtual table's *
Arkadi 26:e2049a15fb15 689 * functions (1); *
Arkadi 26:e2049a15fb15 690 * + Methods with the same name of the C component's extended virtual *
Arkadi 26:e2049a15fb15 691 * table's functions, if any (2); *
Arkadi 26:e2049a15fb15 692 * + Helper methods, if any, like functions declared in the component's *
Arkadi 26:e2049a15fb15 693 * source files but not pointed by the component's virtual table (3). *
Arkadi 26:e2049a15fb15 694 * *
Arkadi 26:e2049a15fb15 695 * Example: *
Arkadi 26:e2049a15fb15 696 * Status_t COMPONENT_GetValue(float *f); //(1) *
Arkadi 26:e2049a15fb15 697 * Status_t COMPONENT_EnableFeature(void); //(2) *
Arkadi 26:e2049a15fb15 698 * Status_t COMPONENT_ComputeAverage(void); //(3) *
Arkadi 26:e2049a15fb15 699 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 700 void L6474_AttachErrorHandler(void (*callback)(uint16_t error));
Arkadi 26:e2049a15fb15 701 Status_t L6474_Init(void *init);
Arkadi 26:e2049a15fb15 702 Status_t L6474_ReadID(uint8_t *id);
Arkadi 26:e2049a15fb15 703 uint16_t L6474_GetAcceleration(void);
Arkadi 26:e2049a15fb15 704 uint16_t L6474_GetCurrentSpeed(void);
Arkadi 26:e2049a15fb15 705 uint16_t L6474_GetDeceleration(void);
Arkadi 26:e2049a15fb15 706 motorState_t L6474_GetDeviceState(void);
Arkadi 26:e2049a15fb15 707 uint8_t L6474_GetFwVersion(void);
Arkadi 26:e2049a15fb15 708 int32_t L6474_GetMark(void);
Arkadi 26:e2049a15fb15 709 uint16_t L6474_GetMaxSpeed(void);
Arkadi 26:e2049a15fb15 710 uint16_t L6474_GetMinSpeed(void);
Arkadi 26:e2049a15fb15 711 int32_t L6474_GetPosition(void);
Arkadi 26:e2049a15fb15 712 void L6474_GoHome(void);
Arkadi 26:e2049a15fb15 713 void L6474_GoMark(void);
Arkadi 26:e2049a15fb15 714 void L6474_GoTo(int32_t targetPosition);
Arkadi 26:e2049a15fb15 715 void L6474_HardStop(void);
Arkadi 26:e2049a15fb15 716 void L6474_Move(motorDir_t direction, uint32_t stepCount);
Arkadi 26:e2049a15fb15 717 void L6474_Run(motorDir_t direction);
Arkadi 26:e2049a15fb15 718 bool L6474_SetAcceleration(uint16_t newAcc);
Arkadi 26:e2049a15fb15 719 bool L6474_SetDeceleration(uint16_t newDec);
Arkadi 26:e2049a15fb15 720 void L6474_SetHome(void);
Arkadi 26:e2049a15fb15 721 void L6474_SetMark(void);
Arkadi 26:e2049a15fb15 722 bool L6474_SetMaxSpeed(uint16_t newMaxSpeed);
Arkadi 26:e2049a15fb15 723 bool L6474_SetMinSpeed(uint16_t newMinSpeed);
Arkadi 26:e2049a15fb15 724 bool L6474_SoftStop(void);
Arkadi 26:e2049a15fb15 725 void L6474_WaitWhileActive(void);
Arkadi 26:e2049a15fb15 726 void L6474_CmdDisable(void);
Arkadi 26:e2049a15fb15 727 void L6474_CmdEnable(void);
Arkadi 26:e2049a15fb15 728 uint32_t L6474_CmdGetParam(L6474_Registers_t parameter);
Arkadi 26:e2049a15fb15 729 uint16_t L6474_CmdGetStatus(void);
Arkadi 26:e2049a15fb15 730 void L6474_CmdNop(void);
Arkadi 26:e2049a15fb15 731 void L6474_CmdSetParam(L6474_Registers_t parameter, uint32_t value);
Arkadi 26:e2049a15fb15 732 uint16_t L6474_ReadStatusRegister(void);
Arkadi 26:e2049a15fb15 733 void L6474_SelectStepMode(motorStepMode_t stepMod);
Arkadi 26:e2049a15fb15 734 motorDir_t L6474_GetDirection(void);
Arkadi 26:e2049a15fb15 735 void L6474_SetDirection(motorDir_t direction);
Arkadi 26:e2049a15fb15 736 void L6474_ApplySpeed(uint16_t newSpeed);
Arkadi 26:e2049a15fb15 737 void L6474_ComputeSpeedProfile(uint32_t nbSteps);
Arkadi 26:e2049a15fb15 738 int32_t L6474_ConvertPosition(uint32_t abs_position_reg);
Arkadi 26:e2049a15fb15 739 void L6474_ErrorHandler(uint16_t error);
Arkadi 26:e2049a15fb15 740 void L6474_SendCommand(uint8_t param);
Arkadi 26:e2049a15fb15 741 void L6474_SetRegisterToPredefinedValues(void);
Arkadi 26:e2049a15fb15 742 void L6474_SetRegisterToInitializationValues(L6474_Init_t *init);
Arkadi 26:e2049a15fb15 743 void L6474_WriteBytes(uint8_t *pByteToTransmit, uint8_t *pReceivedByte);
Arkadi 26:e2049a15fb15 744 void L6474_SetDeviceParamsToPredefinedValues(void);
Arkadi 26:e2049a15fb15 745 void L6474_StartMovement(void);
Arkadi 26:e2049a15fb15 746 void L6474_StepClockHandler(void);
Arkadi 26:e2049a15fb15 747 float L6474_Tval_Current_to_Par(float current_mA);
Arkadi 26:e2049a15fb15 748 float L6474_Par_to_Tval_Current(float Tval);
Arkadi 26:e2049a15fb15 749 float L6474_Tmin_Time_to_Par(float ton_min_us);
Arkadi 26:e2049a15fb15 750 float L6474_Par_to_Tmin_Time(float Tmin);
Arkadi 26:e2049a15fb15 751
Arkadi 26:e2049a15fb15 752
Arkadi 26:e2049a15fb15 753 /*** Component's I/O Methods ***/
Arkadi 26:e2049a15fb15 754
Arkadi 26:e2049a15fb15 755 /**
Arkadi 26:e2049a15fb15 756 * @brief Utility function to read data from L6474.
Arkadi 26:e2049a15fb15 757 * @param[out] pBuffer pointer to the buffer to read data into.
Arkadi 26:e2049a15fb15 758 * @param[in] NumBytesToRead number of bytes to read.
Arkadi 26:e2049a15fb15 759 * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
Arkadi 26:e2049a15fb15 760 */
Arkadi 26:e2049a15fb15 761 Status_t Read(uint8_t* pBuffer, uint16_t NumBytesToRead)
Arkadi 26:e2049a15fb15 762 {
Arkadi 26:e2049a15fb15 763 if (dev_spi.spi_read(pBuffer, ssel, NumBytesToRead) != 0)
Arkadi 26:e2049a15fb15 764 return COMPONENT_ERROR;
Arkadi 26:e2049a15fb15 765 return COMPONENT_OK;
Arkadi 26:e2049a15fb15 766 }
Arkadi 26:e2049a15fb15 767
Arkadi 26:e2049a15fb15 768 /**
Arkadi 26:e2049a15fb15 769 * @brief Utility function to write data to L6474.
Arkadi 26:e2049a15fb15 770 * @param[in] pBuffer pointer to the buffer of data to send.
Arkadi 26:e2049a15fb15 771 * @param[in] NumBytesToWrite number of bytes to write.
Arkadi 26:e2049a15fb15 772 * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
Arkadi 26:e2049a15fb15 773 */
Arkadi 26:e2049a15fb15 774 Status_t Write(uint8_t* pBuffer, uint16_t NumBytesToWrite)
Arkadi 26:e2049a15fb15 775 {
Arkadi 26:e2049a15fb15 776 if (dev_spi.spi_write(pBuffer, ssel, NumBytesToWrite) != 0)
Arkadi 26:e2049a15fb15 777 return COMPONENT_ERROR;
Arkadi 26:e2049a15fb15 778 return COMPONENT_OK;
Arkadi 26:e2049a15fb15 779 }
Arkadi 26:e2049a15fb15 780
Arkadi 26:e2049a15fb15 781 /**
Arkadi 26:e2049a15fb15 782 * @brief Utility function to read and write data from/to L6474 at the same time.
Arkadi 26:e2049a15fb15 783 * @param[out] pBufferToRead pointer to the buffer to read data into.
Arkadi 26:e2049a15fb15 784 * @param[in] pBufferToWrite pointer to the buffer of data to send.
Arkadi 26:e2049a15fb15 785 * @param[in] NumBytes number of bytes to read and write.
Arkadi 26:e2049a15fb15 786 * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
Arkadi 26:e2049a15fb15 787 */
Arkadi 26:e2049a15fb15 788 Status_t ReadWrite(uint8_t* pBufferToRead, uint8_t* pBufferToWrite, uint16_t NumBytes)
Arkadi 26:e2049a15fb15 789 {
Arkadi 26:e2049a15fb15 790 if (dev_spi.spi_read_write(pBufferToRead, pBufferToWrite, ssel, NumBytes) != 0)
Arkadi 26:e2049a15fb15 791 return COMPONENT_ERROR;
Arkadi 26:e2049a15fb15 792 return COMPONENT_OK;
Arkadi 26:e2049a15fb15 793 }
Arkadi 26:e2049a15fb15 794
Arkadi 26:e2049a15fb15 795 /* ACTION 8 --------------------------------------------------------------*
Arkadi 26:e2049a15fb15 796 * Implement here other I/O methods beyond those already implemented *
Arkadi 26:e2049a15fb15 797 * above, which are declared extern within the component's header file. *
Arkadi 26:e2049a15fb15 798 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 799 /**
Arkadi 26:e2049a15fb15 800 * @brief Making the CPU wait.
Arkadi 26:e2049a15fb15 801 * @param None.
Arkadi 26:e2049a15fb15 802 * @retval None.
Arkadi 26:e2049a15fb15 803 */
Arkadi 26:e2049a15fb15 804 void L6474_Delay(uint32_t delay)
Arkadi 26:e2049a15fb15 805 {
Arkadi 26:e2049a15fb15 806 wait_ms(delay);
Arkadi 26:e2049a15fb15 807 }
Arkadi 26:e2049a15fb15 808
Arkadi 26:e2049a15fb15 809 /**
Arkadi 26:e2049a15fb15 810 * @brief Enabling interrupts.
Arkadi 26:e2049a15fb15 811 * @param None.
Arkadi 26:e2049a15fb15 812 * @retval None.
Arkadi 26:e2049a15fb15 813 */
Arkadi 26:e2049a15fb15 814 void L6474_EnableIrq(void)
Arkadi 26:e2049a15fb15 815 {
Arkadi 26:e2049a15fb15 816 __enable_irq();
Arkadi 26:e2049a15fb15 817 }
Arkadi 26:e2049a15fb15 818
Arkadi 26:e2049a15fb15 819 /**
Arkadi 26:e2049a15fb15 820 * @brief Disabling interrupts.
Arkadi 26:e2049a15fb15 821 * @param None.
Arkadi 26:e2049a15fb15 822 * @retval None.
Arkadi 26:e2049a15fb15 823 */
Arkadi 26:e2049a15fb15 824 void L6474_DisableIrq(void)
Arkadi 26:e2049a15fb15 825 {
Arkadi 26:e2049a15fb15 826 __disable_irq();
Arkadi 26:e2049a15fb15 827 }
Arkadi 26:e2049a15fb15 828
Arkadi 26:e2049a15fb15 829 /**
Arkadi 26:e2049a15fb15 830 * @brief Initialising the PWM.
Arkadi 26:e2049a15fb15 831 * @param None.
Arkadi 26:e2049a15fb15 832 * @retval None.
Arkadi 26:e2049a15fb15 833 */
Arkadi 26:e2049a15fb15 834 void L6474_PwmInit(void) {}
Arkadi 26:e2049a15fb15 835
Arkadi 26:e2049a15fb15 836 /**
Arkadi 26:e2049a15fb15 837 * @brief Setting the frequency of PWM.
Arkadi 26:e2049a15fb15 838 * The frequency controls directly the speed of the device.
Arkadi 26:e2049a15fb15 839 * @param frequency the frequency of PWM.
Arkadi 26:e2049a15fb15 840 * @retval None.
Arkadi 26:e2049a15fb15 841 */
Arkadi 26:e2049a15fb15 842 void L6474_PwmSetFreq(uint16_t frequency)
Arkadi 26:e2049a15fb15 843 {
Arkadi 26:e2049a15fb15 844 /* Computing the period of PWM. */
Arkadi 26:e2049a15fb15 845 //double period = 1.0f / frequency;
Arkadi 26:e2049a15fb15 846 //
Arkadi 26:e2049a15fb15 847 ///* Setting the period and the duty-cycle of PWM. */
Arkadi 26:e2049a15fb15 848 //pwm.period(period);
Arkadi 26:e2049a15fb15 849 //pwm.write(0.5f);
Arkadi 26:e2049a15fb15 850
Arkadi 26:e2049a15fb15 851 ///* Setting a callback with the same period of PWM's, to update the state machine. */
Arkadi 26:e2049a15fb15 852 //ticker.attach(this, &L6474::L6474_StepClockHandler, period);
Arkadi 26:e2049a15fb15 853 }
Arkadi 26:e2049a15fb15 854
Arkadi 26:e2049a15fb15 855 /**
Arkadi 26:e2049a15fb15 856 * @brief Stopping the PWM.
Arkadi 26:e2049a15fb15 857 * @param None.
Arkadi 26:e2049a15fb15 858 * @retval None.
Arkadi 26:e2049a15fb15 859 */
Arkadi 26:e2049a15fb15 860 void L6474_PwmStop(void)
Arkadi 26:e2049a15fb15 861 {
Arkadi 26:e2049a15fb15 862 //pwm.write(0.0f);
Arkadi 26:e2049a15fb15 863 //ticker.detach();
Arkadi 26:e2049a15fb15 864 }
Arkadi 26:e2049a15fb15 865
Arkadi 26:e2049a15fb15 866 /**
Arkadi 26:e2049a15fb15 867 * @brief Putting the device in standby mode.
Arkadi 26:e2049a15fb15 868 * @param None.
Arkadi 26:e2049a15fb15 869 * @retval None.
Arkadi 26:e2049a15fb15 870 */
Arkadi 26:e2049a15fb15 871 void L6474_ReleaseReset(void)
Arkadi 26:e2049a15fb15 872 {
Arkadi 26:e2049a15fb15 873 standby_reset = 1;
Arkadi 26:e2049a15fb15 874 }
Arkadi 26:e2049a15fb15 875
Arkadi 26:e2049a15fb15 876 /**
Arkadi 26:e2049a15fb15 877 * @brief Putting the device in reset mode.
Arkadi 26:e2049a15fb15 878 * @param None.
Arkadi 26:e2049a15fb15 879 * @retval None.
Arkadi 26:e2049a15fb15 880 */
Arkadi 26:e2049a15fb15 881 void L6474_Reset(void)
Arkadi 26:e2049a15fb15 882 {
Arkadi 26:e2049a15fb15 883 standby_reset = 0;
Arkadi 26:e2049a15fb15 884 }
Arkadi 26:e2049a15fb15 885
Arkadi 26:e2049a15fb15 886 /**
Arkadi 26:e2049a15fb15 887 * @brief Setting the direction of rotation.
Arkadi 26:e2049a15fb15 888 * @param gpioState direction of rotation: "1" for forward, "0" for backward.
Arkadi 26:e2049a15fb15 889 * @retval None.
Arkadi 26:e2049a15fb15 890 */
Arkadi 26:e2049a15fb15 891 void L6474_SetDirectionGpio(uint8_t gpioState)
Arkadi 26:e2049a15fb15 892 {
Arkadi 26:e2049a15fb15 893 direction = gpioState;
Arkadi 26:e2049a15fb15 894 }
Arkadi 26:e2049a15fb15 895
Arkadi 26:e2049a15fb15 896 /**
Arkadi 26:e2049a15fb15 897 * @brief Writing and reading bytes to/from the component through the SPI at the same time.
Arkadi 26:e2049a15fb15 898 * @param[in] pByteToTransmit pointer to the buffer of data to send.
Arkadi 26:e2049a15fb15 899 * @param[out] pReceivedByte pointer to the buffer to read data into.
Arkadi 26:e2049a15fb15 900 * @retval "0" in case of success, "1" otherwise.
Arkadi 26:e2049a15fb15 901 */
Arkadi 26:e2049a15fb15 902 uint8_t L6474_SpiWriteBytes(uint8_t *pByteToTransmit, uint8_t *pReceivedByte)
Arkadi 26:e2049a15fb15 903 {
Arkadi 26:e2049a15fb15 904 return (uint8_t) (ReadWrite(pReceivedByte, pByteToTransmit, number_of_devices) == COMPONENT_OK ? 0 : 1);
Arkadi 26:e2049a15fb15 905 }
Arkadi 26:e2049a15fb15 906
Arkadi 26:e2049a15fb15 907
Arkadi 26:e2049a15fb15 908 /*** Component's Instance Variables ***/
Arkadi 26:e2049a15fb15 909
Arkadi 26:e2049a15fb15 910 /* ACTION 9 --------------------------------------------------------------*
Arkadi 26:e2049a15fb15 911 * Declare here interrupt related variables, if needed. *
Arkadi 26:e2049a15fb15 912 * Note that interrupt handling is platform dependent, see *
Arkadi 26:e2049a15fb15 913 * "Interrupt Related Methods" above. *
Arkadi 26:e2049a15fb15 914 * *
Arkadi 26:e2049a15fb15 915 * Example: *
Arkadi 26:e2049a15fb15 916 * + mbed: *
Arkadi 26:e2049a15fb15 917 * InterruptIn feature_irq; *
Arkadi 26:e2049a15fb15 918 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 919 /* Flag Interrupt. */
Arkadi 26:e2049a15fb15 920 InterruptIn flag_irq;
Arkadi 26:e2049a15fb15 921
Arkadi 26:e2049a15fb15 922 /* ACTION 10 -------------------------------------------------------------*
Arkadi 26:e2049a15fb15 923 * Declare here other pin related variables, if needed. *
Arkadi 26:e2049a15fb15 924 * *
Arkadi 26:e2049a15fb15 925 * Example: *
Arkadi 26:e2049a15fb15 926 * + mbed: *
Arkadi 26:e2049a15fb15 927 * DigitalOut standby_reset; *
Arkadi 26:e2049a15fb15 928 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 929 /* Standby/reset pin. */
Arkadi 26:e2049a15fb15 930 DigitalOut standby_reset;
Arkadi 26:e2049a15fb15 931
Arkadi 26:e2049a15fb15 932 /* Direction of rotation pin. */
Arkadi 26:e2049a15fb15 933 DigitalOut direction;
Arkadi 26:e2049a15fb15 934
Arkadi 26:e2049a15fb15 935 /* Pulse Width Modulation pin. */
Arkadi 26:e2049a15fb15 936 PwmOut pwm;
Arkadi 26:e2049a15fb15 937
Arkadi 26:e2049a15fb15 938 /* Timer to trigger the PWM callback at each PWM pulse. */
Arkadi 26:e2049a15fb15 939 //Ticker ticker;
Arkadi 26:e2049a15fb15 940
Arkadi 26:e2049a15fb15 941 /* ACTION 11 -------------------------------------------------------------*
Arkadi 26:e2049a15fb15 942 * Declare here communication related variables, if needed. *
Arkadi 26:e2049a15fb15 943 * *
Arkadi 26:e2049a15fb15 944 * Example: *
Arkadi 26:e2049a15fb15 945 * + mbed: *
Arkadi 26:e2049a15fb15 946 * DigitalOut ssel; *
Arkadi 26:e2049a15fb15 947 * DevSPI &dev_spi; *
Arkadi 26:e2049a15fb15 948 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 949 /* Configuration. */
Arkadi 26:e2049a15fb15 950 DigitalOut ssel;
Arkadi 26:e2049a15fb15 951
Arkadi 26:e2049a15fb15 952 /* IO Device. */
Arkadi 26:e2049a15fb15 953 DevSPI &dev_spi;
Arkadi 26:e2049a15fb15 954
Arkadi 26:e2049a15fb15 955 /* ACTION 12 -------------------------------------------------------------*
Arkadi 26:e2049a15fb15 956 * Declare here identity related variables, if needed. *
Arkadi 26:e2049a15fb15 957 * Note that there should be only a unique identifier for each component, *
Arkadi 26:e2049a15fb15 958 * which should be the "who_am_i" parameter. *
Arkadi 26:e2049a15fb15 959 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 960 /* Identity */
Arkadi 26:e2049a15fb15 961 uint8_t who_am_i;
Arkadi 26:e2049a15fb15 962
Arkadi 26:e2049a15fb15 963 /* ACTION 13 -------------------------------------------------------------*
Arkadi 26:e2049a15fb15 964 * Declare here the component's static and non-static data, one variable *
Arkadi 26:e2049a15fb15 965 * per line. *
Arkadi 26:e2049a15fb15 966 * *
Arkadi 26:e2049a15fb15 967 * Example: *
Arkadi 26:e2049a15fb15 968 * float measure; *
Arkadi 26:e2049a15fb15 969 * int instance_id; *
Arkadi 26:e2049a15fb15 970 * static int number_of_instances; *
Arkadi 26:e2049a15fb15 971 *------------------------------------------------------------------------*/
Arkadi 26:e2049a15fb15 972 /* Data. */
Arkadi 26:e2049a15fb15 973 void (*error_handler_callback)(uint16_t error);
Arkadi 26:e2049a15fb15 974 deviceParams_t device_prm;
Arkadi 26:e2049a15fb15 975 uint8_t device_instance;
Arkadi 26:e2049a15fb15 976
Arkadi 26:e2049a15fb15 977 /* Static data. */
Arkadi 26:e2049a15fb15 978 static uint8_t number_of_devices;
Arkadi 26:e2049a15fb15 979 static uint8_t spi_tx_bursts[L6474_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
Arkadi 26:e2049a15fb15 980 static uint8_t spi_rx_bursts[L6474_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
Arkadi 26:e2049a15fb15 981
Arkadi 26:e2049a15fb15 982
Arkadi 26:e2049a15fb15 983 public:
Arkadi 26:e2049a15fb15 984
Arkadi 26:e2049a15fb15 985 /* Static data. */
Arkadi 26:e2049a15fb15 986 static bool spi_preemtion_by_isr;
Arkadi 26:e2049a15fb15 987 static bool isr_flag;
Arkadi 26:e2049a15fb15 988 };
Arkadi 26:e2049a15fb15 989
Arkadi 26:e2049a15fb15 990 #endif // __L6474_CLASS_H
Arkadi 26:e2049a15fb15 991
Arkadi 26:e2049a15fb15 992 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/