Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_IHM01A1 by
Diff: Components/l6474/l6474_class.cpp
- Revision:
- 5:d3c78f12a78d
- Parent:
- 4:83a1eb397a65
- Child:
- 6:a47569fc7534
--- a/Components/l6474/l6474_class.cpp Fri Nov 13 12:56:06 2015 +0000
+++ b/Components/l6474/l6474_class.cpp Wed Nov 18 18:41:55 2015 +0000
@@ -58,12 +58,12 @@
/* Private constants ---------------------------------------------------------*/
/// Error while initialising the SPI
-#define L6474_ERROR_0 (0x8000)
+#define L6474_ERROR_0 (0x8000)
/// Error: Bad SPI transaction
-#define L6474_ERROR_1 (0x8001)
+#define L6474_ERROR_1 (0x8001)
/// Maximum number of steps
-#define MAX_STEPS (0x7FFFFFFF)
+#define MAX_STEPS (0x7FFFFFFF)
/// Maximum frequency of the PWMs in Hz
#define L6474_MAX_PWM_FREQ (10000)
@@ -77,10 +77,14 @@
/* Number of devices. */
uint8_t L6474::numberOfDevices = 0;
+/* SPI Transmission for Daisy-Chain Configuration. */
+uint8_t L6474::spiTxBursts[L6474_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
+uint8_t L6474::spiRxBursts[L6474_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
+
/* Methods -------------------------------------------------------------------*/
-/******************************************************//**
+/**********************************************************
* @brief Attaches a user callback to the error Handler.
* The call back will be then called each time the library
* detects an error
@@ -93,7 +97,7 @@
errorHandlerCallback = (void (*)(uint16_t error)) callback;
}
-/******************************************************//**
+/**********************************************************
* @brief Attaches a user callback to the flag Interrupt
* The call back will be then called each time the status
* flag pin will be pulled down due to the occurrence of
@@ -108,7 +112,7 @@
flagInterruptCallback = (void (*)(void))callback;
}
-/******************************************************//**
+/**********************************************************
* @brief Starts the L6474 library
* @retval COMPONENT_OK in case of success
**********************************************************/
@@ -137,7 +141,7 @@
return COMPONENT_OK;
}
-/******************************************************//**
+/**********************************************************
* @brief Read id
* @param id pointer to the identifier to be read.
* @retval COMPONENT_OK in case of success
@@ -149,7 +153,7 @@
return COMPONENT_OK;
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the acceleration of the specified device
* @retval Acceleration in pps^2
**********************************************************/
@@ -158,7 +162,7 @@
return (devicePrm.acceleration);
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the current speed of the specified device
* @retval Speed in pps
**********************************************************/
@@ -167,7 +171,7 @@
return devicePrm.speed;
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the deceleration of the specified device
* @retval Deceleration in pps^2
**********************************************************/
@@ -176,7 +180,7 @@
return (devicePrm.deceleration);
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the device state
* @retval State (ACCELERATING, DECELERATING, STEADY or INACTIVE)
**********************************************************/
@@ -185,7 +189,7 @@
return devicePrm.motionState;
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the FW version of the library
* @param None
* @retval L6474_FW_VERSION
@@ -195,7 +199,7 @@
return (L6474_FW_VERSION);
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the mark position of the specified device
* @retval Mark register value converted in a 32b signed integer
**********************************************************/
@@ -204,7 +208,7 @@
return L6474_ConvertPosition(L6474_CmdGetParam(L6474_MARK));
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the max speed of the specified device
* @retval maxSpeed in pps
**********************************************************/
@@ -213,7 +217,7 @@
return (devicePrm.maxSpeed);
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the min speed of the specified device
* @retval minSpeed in pps
**********************************************************/
@@ -222,7 +226,7 @@
return (devicePrm.minSpeed);
}
-/******************************************************//**
+/**********************************************************
* @brief Returns the ABS_POSITION of the specified device
* @retval ABS_POSITION register value converted in a 32b signed integer
**********************************************************/
@@ -231,7 +235,7 @@
return L6474_ConvertPosition(L6474_CmdGetParam(L6474_ABS_POS));
}
-/******************************************************//**
+/**********************************************************
* @brief Requests the motor to move to the home position (ABS_POSITION = 0)
* @retval None
**********************************************************/
@@ -240,7 +244,7 @@
L6474_GoTo(0);
}
-/******************************************************//**
+/**********************************************************
* @brief Requests the motor to move to the mark position
* @retval None
**********************************************************/
@@ -252,14 +256,14 @@
L6474_GoTo(mark);
}
-/******************************************************//**
+/**********************************************************
* @brief Requests the motor to move to the specified position
* @param[in] targetPosition absolute position in steps
* @retval None
**********************************************************/
void L6474::L6474_GoTo(int32_t targetPosition)
{
- direction_t direction;
+ motorDir_t direction;
int32_t steps;
/* Eventually deactivate motor */
@@ -277,12 +281,12 @@
if (steps >= 0)
{
devicePrm.stepsToTake = steps;
- direction = CW;
+ direction = FORWARD;
}
else
{
devicePrm.stepsToTake = -steps;
- direction = CCW;
+ direction = BACKWARD;
}
if (steps != 0)
@@ -299,7 +303,7 @@
}
}
-/******************************************************//**
+/**********************************************************
* @brief Immediatly stops the motor and disable the power bridge
* @retval None
**********************************************************/
@@ -317,13 +321,13 @@
devicePrm.stepsToTake = MAX_STEPS;
}
-/******************************************************//**
+/**********************************************************
* @brief Moves the motor of the specified number of steps
* @param[in] direction FORWARD or BACKWARD
* @param[in] stepCount Number of steps to perform
* @retval None
**********************************************************/
-void L6474::L6474_Move(direction_t direction, uint32_t stepCount)
+void L6474::L6474_Move(motorDir_t direction, uint32_t stepCount)
{
/* Eventually deactivate motor */
if (devicePrm.motionState != INACTIVE)
@@ -350,7 +354,7 @@
}
#if 0
-/******************************************************//**
+/**********************************************************
* @brief Resets all L6474 devices
* @param None
* @retval None
@@ -371,13 +375,13 @@
}
#endif
-/******************************************************//**
+/**********************************************************
* @brief Runs the motor. It will accelerate from the min
* speed up to the max speed by using the device acceleration.
* @param[in] direction FORWARD or BACKWARD
* @retval None
**********************************************************/
-void L6474::L6474_Run(direction_t direction)
+void L6474::L6474_Run(motorDir_t direction)
{
/* Eventually deactivate motor */
if (devicePrm.motionState != INACTIVE)
@@ -394,7 +398,7 @@
L6474_StartMovement();
}
-/******************************************************//**
+/**********************************************************
* @brief Changes the acceleration of the specified device
* @param[in] newAcc New acceleration to apply in pps^2
* @retval true if the command is successfully executed, else false
@@ -414,7 +418,7 @@
return cmdExecuted;
}
-/******************************************************//**
+/**********************************************************
* @brief Changes the deceleration of the specified device
* @param[in] newDec New deceleration to apply in pps^2
* @retval true if the command is successfully executed, else false
@@ -434,7 +438,7 @@
return cmdExecuted;
}
-/******************************************************//**
+/**********************************************************
* @brief Set current position to be the Home position (ABS pos set to 0)
* @retval None
**********************************************************/
@@ -443,7 +447,7 @@
L6474_CmdSetParam(L6474_ABS_POS, 0);
}
-/******************************************************//**
+/**********************************************************
* @brief Sets current position to be the Mark position
* @retval None
**********************************************************/
@@ -453,7 +457,7 @@
L6474_CmdSetParam(L6474_MARK, mark);
}
-/******************************************************//**
+/**********************************************************
* @brief Changes the max speed of the specified device
* @param[in] newMaxSpeed New max speed to apply in pps
* @retval true if the command is successfully executed, else false
@@ -475,7 +479,7 @@
return cmdExecuted;
}
-/******************************************************//**
+/**********************************************************
* @brief Changes the min speed of the specified device
* @param[in] newMinSpeed New min speed to apply in pps
* @retval true if the command is successfully executed, else false
@@ -497,7 +501,7 @@
return cmdExecuted;
}
-/******************************************************//**
+/**********************************************************
* @brief Stops the motor by using the device deceleration
* @retval true if the command is successfully executed, else false
* @note The command is not performed is the device is in INACTIVE state.
@@ -513,7 +517,7 @@
return (cmdExecuted);
}
-/******************************************************//**
+/**********************************************************
* @brief Locks until the device state becomes Inactive
* @retval None
**********************************************************/
@@ -523,7 +527,7 @@
while (L6474_GetDeviceState() != INACTIVE);
}
-/******************************************************//**
+/**********************************************************
* @brief Issue the Disable command to the L6474 of the specified device
* @retval None
**********************************************************/
@@ -532,7 +536,7 @@
L6474_SendCommand(L6474_DISABLE);
}
-/******************************************************//**
+/**********************************************************
* @brief Issues the Enable command to the L6474 of the specified device
* @retval None
**********************************************************/
@@ -541,7 +545,7 @@
L6474_SendCommand(L6474_ENABLE);
}
-/******************************************************//**
+/**********************************************************
* @brief Issues the GetParam command to the L6474 of the specified device
* @param[in] param Register adress (L6474_ABS_POS, L6474_MARK,...)
* @retval Register value
@@ -551,6 +555,7 @@
uint32_t i;
uint32_t spiRxData;
uint8_t maxArgumentNbBytes = 0;
+ uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
bool itDisable = FALSE;
do
@@ -563,29 +568,32 @@
itDisable = FALSE;
}
- spiTxBursts[0] = L6474_NOP;
- spiTxBursts[1] = L6474_NOP;
- spiTxBursts[2] = L6474_NOP;
- spiTxBursts[3] = L6474_NOP;
- spiRxBursts[1] = 0;
- spiRxBursts[2] = 0;
- spiRxBursts[3] = 0;
+ for (i = 0; i < numberOfDevices; i++)
+ {
+ spiTxBursts[0][i] = L6474_NOP;
+ spiTxBursts[1][i] = L6474_NOP;
+ spiTxBursts[2][i] = L6474_NOP;
+ spiTxBursts[3][i] = L6474_NOP;
+ spiRxBursts[1][i] = 0;
+ spiRxBursts[2][i] = 0;
+ spiRxBursts[3][i] = 0;
+ }
switch (param)
{
case L6474_ABS_POS: ;
case L6474_MARK:
- spiTxBursts[0] = ((uint8_t)L6474_GET_PARAM )| (param);
+ spiTxBursts[0][spiIndex] = ((uint8_t)L6474_GET_PARAM )| (param);
maxArgumentNbBytes = 3;
break;
case L6474_EL_POS: ;
case L6474_CONFIG: ;
case L6474_STATUS:
- spiTxBursts[1] = ((uint8_t)L6474_GET_PARAM )| (param);
+ spiTxBursts[1][spiIndex] = ((uint8_t)L6474_GET_PARAM )| (param);
maxArgumentNbBytes = 2;
break;
default:
- spiTxBursts[2] = ((uint8_t)L6474_GET_PARAM )| (param);
+ spiTxBursts[2][spiIndex] = ((uint8_t)L6474_GET_PARAM )| (param);
maxArgumentNbBytes = 1;
}
@@ -599,12 +607,12 @@
i < L6474_CMD_ARG_MAX_NB_BYTES;
i++)
{
- L6474_WriteBytes(&spiTxBursts[i], &spiRxBursts[i]);
+ L6474_WriteBytes(&spiTxBursts[i][0], &spiRxBursts[i][0]);
}
- spiRxData = ((uint32_t)spiRxBursts[1] << 16) |
- (spiRxBursts[2] << 8) |
- (spiRxBursts[3]);
+ spiRxData = ((uint32_t)spiRxBursts[1][spiIndex] << 16) |
+ (spiRxBursts[2][spiIndex] << 8) |
+ (spiRxBursts[3][spiIndex]);
/* re-enable L6474_EnableIrq after SPI transfers*/
L6474_EnableIrq();
@@ -612,7 +620,7 @@
return (spiRxData);
}
-/******************************************************//**
+/**********************************************************
* @brief Issues the GetStatus command to the L6474 of the specified device
* @retval Status Register value
* @note Once the GetStatus command is performed, the flags of the status register
@@ -623,6 +631,7 @@
{
uint32_t i;
uint16_t status;
+ uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
bool itDisable = FALSE;
do
@@ -635,12 +644,15 @@
itDisable = FALSE;
}
- spiTxBursts[0] = L6474_NOP;
- spiTxBursts[1] = L6474_NOP;
- spiTxBursts[2] = L6474_NOP;
- spiRxBursts[1] = 0;
- spiRxBursts[2] = 0;
- spiTxBursts[0] = L6474_GET_STATUS;
+ for (i = 0; i < numberOfDevices; i++)
+ {
+ spiTxBursts[0][i] = L6474_NOP;
+ spiTxBursts[1][i] = L6474_NOP;
+ spiTxBursts[2][i] = L6474_NOP;
+ spiRxBursts[1][i] = 0;
+ spiRxBursts[2][i] = 0;
+ }
+ spiTxBursts[0][spiIndex] = L6474_GET_STATUS;
/* Disable interruption before checking */
/* pre-emption by ISR and SPI transfers*/
@@ -650,9 +662,9 @@
for (i = 0; i < L6474_CMD_ARG_NB_BYTES_GET_STATUS + L6474_RSP_NB_BYTES_GET_STATUS; i++)
{
- L6474_WriteBytes(&spiTxBursts[i], &spiRxBursts[i]);
+ L6474_WriteBytes(&spiTxBursts[i][0], &spiRxBursts[i][0]);
}
- status = (spiRxBursts[1] << 8) | (spiRxBursts[2]);
+ status = (spiRxBursts[1][spiIndex] << 8) | (spiRxBursts[2][spiIndex]);
/* re-enable L6474_EnableIrq after SPI transfers*/
L6474_EnableIrq();
@@ -660,7 +672,7 @@
return (status);
}
-/******************************************************//**
+/**********************************************************
* @brief Issues the Nop command to the L6474 of the specified device
* @retval None
**********************************************************/
@@ -669,7 +681,7 @@
L6474_SendCommand(L6474_NOP);
}
-/******************************************************//**
+/**********************************************************
* @brief Issues the SetParam command to the L6474 of the specified device
* @param[in] param Register adress (L6474_ABS_POS, L6474_MARK,...)
* @param[in] value Value to set in the register
@@ -679,6 +691,7 @@
{
uint32_t i;
uint8_t maxArgumentNbBytes = 0;
+ uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
bool itDisable = FALSE;
do
{
@@ -690,32 +703,35 @@
itDisable = FALSE;
}
- spiTxBursts[0] = L6474_NOP;
- spiTxBursts[1] = L6474_NOP;
- spiTxBursts[2] = L6474_NOP;
- spiTxBursts[3] = L6474_NOP;
+ for (i = 0; i < numberOfDevices; i++)
+ {
+ spiTxBursts[0][i] = L6474_NOP;
+ spiTxBursts[1][i] = L6474_NOP;
+ spiTxBursts[2][i] = L6474_NOP;
+ spiTxBursts[3][i] = L6474_NOP;
+ }
switch (param)
{
case L6474_ABS_POS: ;
case L6474_MARK:
- spiTxBursts[0] = param;
- spiTxBursts[1] = (uint8_t)(value >> 16);
- spiTxBursts[2] = (uint8_t)(value >> 8);
+ spiTxBursts[0][spiIndex] = param;
+ spiTxBursts[1][spiIndex] = (uint8_t)(value >> 16);
+ spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
maxArgumentNbBytes = 3;
break;
case L6474_EL_POS: ;
case L6474_CONFIG:
- spiTxBursts[1] = param;
- spiTxBursts[2] = (uint8_t)(value >> 8);
+ spiTxBursts[1][spiIndex] = param;
+ spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
maxArgumentNbBytes = 2;
break;
default:
- spiTxBursts[2] = param;
+ spiTxBursts[2][spiIndex] = param;
maxArgumentNbBytes = 1;
break;
}
- spiTxBursts[3] = (uint8_t)(value);
+ spiTxBursts[3][spiIndex] = (uint8_t)(value);
/* Disable interruption before checking */
/* pre-emption by ISR and SPI transfers*/
@@ -728,13 +744,13 @@
i < L6474_CMD_ARG_MAX_NB_BYTES;
i++)
{
- L6474_WriteBytes(&spiTxBursts[i],&spiRxBursts[i]);
+ L6474_WriteBytes(&spiTxBursts[i][0],&spiRxBursts[i][0]);
}
/* re-enable L6474_EnableIrq after SPI transfers*/
L6474_EnableIrq();
}
-/******************************************************//**
+/**********************************************************
* @brief Reads the Status Register value
* @retval Status register valued
* @note The status register flags are not cleared
@@ -745,7 +761,7 @@
return (L6474_CmdGetParam(L6474_STATUS));
}
-/******************************************************//**
+/**********************************************************
* @brief Set the stepping mode
* @param[in] stepMod from full step to 1/16 microstep as specified in enum motorStepMode_t
* @retval None
@@ -791,32 +807,33 @@
L6474_SetHome();
}
-/******************************************************//**
- * @brief Get the direction
- * @retval direction clockwise or counter-clockwise
+/**********************************************************
+ * @brief Get the direction
+ * @param None
+ * @retval direction FORWARD or BACKWARD
**********************************************************/
-StepperMotor::direction_t L6474::L6474_GetDirection(void)
+motorDir_t L6474::L6474_GetDirection(void)
{
- return (devicePrm.direction == FORWARD ? CW : CCW);
+ return devicePrm.direction;
}
-/******************************************************//**
+/**********************************************************
* @brief Specifies the direction
* @param[in] dir FORWARD or BACKWARD
* @note The direction change is only applied if the device
* is in INACTIVE state
* @retval None
**********************************************************/
-void L6474::L6474_SetDirection(direction_t direction)
+void L6474::L6474_SetDirection(motorDir_t direction)
{
if (devicePrm.motionState == INACTIVE)
{
- devicePrm.direction = (direction == CW ? FORWARD : BACKWARD);
- L6474_SetDirectionGpio(direction == CW ? 1 : 0);
+ devicePrm.direction = direction;
+ L6474_SetDirectionGpio(direction);
}
}
-/******************************************************//**
+/**********************************************************
* @brief Updates the current speed of the device
* @param[in] newSpeed in pps
* @retval None
@@ -837,7 +854,7 @@
L6474_PwmSetFreq(newSpeed);
}
-/******************************************************//**
+/**********************************************************
* @brief Computes the speed profile according to the number of steps to move
* @param[in] nbSteps number of steps to perform
* @retval None
@@ -901,7 +918,7 @@
}
}
-/******************************************************//**
+/**********************************************************
* @brief Converts the ABS_POSITION register value to a 32b signed integer
* @param[in] abs_position_reg value of the ABS_POSITION register
* @retval operation_result 32b signed integer corresponding to the absolute position
@@ -923,10 +940,11 @@
{
operation_result = (int32_t) abs_position_reg;
}
+
return operation_result;
}
-/******************************************************//**
+/**********************************************************
* @brief Error handler which calls the user callback (if defined)
* @param[in] error Number of the error
* @retval None
@@ -946,7 +964,7 @@
}
}
-/******************************************************//**
+/**********************************************************
* @brief Handlers of the flag interrupt which calls the user callback (if defined)
* @param None
* @retval None
@@ -965,14 +983,16 @@
}
}
-/******************************************************//**
+/**********************************************************
* @brief Sends a command without arguments to the L6474 via the SPI
* @param[in] param Command to send
* @retval None
**********************************************************/
void L6474::L6474_SendCommand(uint8_t param)
{
- bool itDisable = FALSE;
+ uint32_t i;
+ bool itDisable = FALSE;
+ uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
do
{
@@ -984,8 +1004,11 @@
itDisable = FALSE;
}
- spiTxBursts[3] = L6474_NOP;
- spiTxBursts[3] = param;
+ for (i = 0; i < numberOfDevices; i++)
+ {
+ spiTxBursts[3][i] = L6474_NOP;
+ }
+ spiTxBursts[3][spiIndex] = param;
/* Disable interruption before checking */
/* pre-emption by ISR and SPI transfers*/
@@ -993,13 +1016,13 @@
itDisable = TRUE;
} while (spiPreemtionByIsr); // check pre-emption by ISR
- L6474_WriteBytes(&spiTxBursts[3], &spiRxBursts[3]);
+ L6474_WriteBytes(&spiTxBursts[3][0], &spiRxBursts[3][0]);
/* re-enable L6474_EnableIrq after SPI transfers*/
L6474_EnableIrq();
}
-/******************************************************//**
+/**********************************************************
* @brief Sets the registers of the L6474 to their predefined values
* from l6474_target_config.h
* @retval None
@@ -1118,7 +1141,7 @@
}
}
-/******************************************************//**
+/**********************************************************
* @brief Sets the parameters of the device to predefined values
* from l6474_target_config.h
* @param None
@@ -1164,7 +1187,7 @@
L6474_SetRegisterToPredefinedValues();
}
-/******************************************************//**
+/**********************************************************
* @brief Initialises the bridge parameters to start the movement
* and enable the power bridge
* @retval None
@@ -1186,7 +1209,7 @@
L6474_ApplySpeed(devicePrm.minSpeed);
}
-/******************************************************//**
+/**********************************************************
* @brief Handles the device state machine at each ste
* @retval None
* @note Must only be called by the timer ISR
@@ -1324,7 +1347,7 @@
isrFlag = FALSE;
}
-/******************************************************//**
+/**********************************************************
* @brief Converts mA in compatible values for TVAL register
* @param[in] Tval
* @retval TVAL values
@@ -1334,7 +1357,7 @@
return ((uint8_t)(((Tval - 31.25)/31.25)+0.5));
}
-/******************************************************//**
+/**********************************************************
* @brief Convert time in us in compatible values
* for TON_MIN register
* @param[in] Tmin
@@ -1345,7 +1368,7 @@
return ((uint8_t)(((Tmin - 0.5)*2)+0.5));
}
-/******************************************************//**
+/**********************************************************
* @brief Write and receive a byte via SPI
* @param[in] pByteToTransmit pointer to the byte to transmit
* @param[in] pReceivedByte pointer to the received byte
