Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r5dea4d2934a06e63b87c74732d5d5d7756bdc62a -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 5dea4d2934a06e63b87c74732d5d5d7756bdc62a) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -76,7 +76,7 @@ #define BP_RATE_FROM_RPM( rpm ) ( rpm / 5 ) ///< Macro to estimate a flow rate (mL/min) from a given speed (RPM). #define BP_RPM_FROM_RATE( rate ) ( rate * 5 ) ///< Macro to estimate a pump speed (RPM) from a given flow rate (mL/min). -#define BP_RAMP_STEP_SPEED_RPM 5 ///< Blood pump ramp step size (in RPM). +#define BP_RAMP_STEP_SPEED_RPM 10 ///< Blood pump ramp step size (in RPM). #define BP_FLOW_ALPHA_Y_INTERCEPT 1.11F ///< Y intercept used for alpha flow coefficient calculation. #define BP_FLOW_WEAR_A_TERM 0.00000000896F ///< A term used for wear portion of alpha flow coefficient. @@ -118,6 +118,9 @@ static U16 bloodPumpRampToSpeedRPM; ///< Estimated target speed that we want to ramp to. static U16 bloodPumpSetSpeedRPM; ///< Current set speed for the blood pump. +/// Macro for determining the signed set speed for the blood pump based on currently set direction and unsigned set speed. +#define BP_SIGNED_SET_SPEED ( MOTOR_DIR_REVERSE == bloodPumpDirectionSet ? (S32)bloodPumpSetSpeedRPM * -1 : (S32)bloodPumpSetSpeedRPM ) + static OVERRIDE_U32_T bloodFlowDataPublishInterval; ///< Interval (in task intervals) at which to publish blood flow data to CAN bus. static S32 targetBloodFlowRate; ///< Requested blood flow rate. static OVERRIDE_F32_T measuredBloodFlowRate; ///< Measured (calculated now) blood flow rate. @@ -166,6 +169,8 @@ *************************************************************************/ void initBloodFlow( void ) { + U32 i; + // Initialize peristaltic pump driver initPeristalticPumpDriver(); @@ -207,7 +212,10 @@ bloodPumpRotorCounter.override = OVERRIDE_RESET; // Initialize pump speed filter - memset( &rpmReadings[ 0 ], 0, sizeof( rpmReadings ) ); + for ( i = 0; i < SIZE_OF_ROLLING_AVG; i++ ) + { + rpmReadings[ i ] = 0.0F; + } rpmReadingsIdx = 0; rpmReadingsTotal = 0.0; rpmReadingsCount = 0; @@ -492,8 +500,8 @@ * @brief * The execBloodFlowMonitor function executes the blood flow monitor. * @details \b Inputs: none - * @details \b Outputs: measuredBloodFlowRate, adcBloodPumpMCSpeedRPM, - * adcBloodPumpMCCurrentmA + * @details \b Outputs: BP sensor readings updated, filteredBloodPumpSpeed, + * bloodPumpSpeedRPM, bloodPumpDirection, measuredBloodFlowRate * @return none *************************************************************************/ void execBloodFlowMonitor( void ) @@ -508,7 +516,7 @@ // adcBloodPumpMCSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpRPM)) * BP_SPEED_ADC_TO_RPM_FACTOR; // adcBloodPumpMCCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_TO_MA_FACTOR; - filterBloodPumpRPMReadings( (F32)getPeristalticPumpMeasSpeed() ); + filterBloodPumpRPMReadings( getPeristalticPumpMeasSpeed() ); bloodPumpSpeedRPM.data = filteredBloodPumpSpeed; bloodPumpDirection = ( getMeasuredBloodPumpSpeed() < 0.0F ? MOTOR_DIR_REVERSE : MOTOR_DIR_FORWARD ); //measuredBloodFlowRate.data = calcBloodFlow(); // TODO-restore when flow estimation function is implemented @@ -584,8 +592,7 @@ { // Start ramp up to target flow rate bloodPumpSetSpeedRPM = BP_RAMP_STEP_SPEED_RPM; - setBPDirection( bloodPumpDirectionSet ); - setBPSetSpeed( bloodPumpSetSpeedRPM ); + setPeristalticPumpSetSpeed( BP_SIGNED_SET_SPEED ); isBloodPumpOn = TRUE; result = BLOOD_PUMP_RAMPING_UP_STATE; } @@ -615,15 +622,15 @@ { // Start ramp down to stop bloodPumpSetSpeedRPM -= BP_RAMP_STEP_SPEED_RPM; - setBPSetSpeed( bloodPumpSetSpeedRPM ); + setPeristalticPumpSetSpeed( BP_SIGNED_SET_SPEED ); result = BLOOD_PUMP_RAMPING_DN_STATE; } // Have we reached end of ramp up? else if ( bloodPumpSetSpeedRPM >= bloodPumpRampToSpeedRPM ) { resetBloodPumpRPMMovingAverage(); bloodPumpSetSpeedRPM = bloodPumpRampToSpeedRPM; - setBPSetSpeed( bloodPumpSetSpeedRPM ); + setPeristalticPumpSetSpeed( BP_SIGNED_SET_SPEED ); // resetPIController( PI_CONTROLLER_ID_BLOOD_FLOW, bloodPumpSetSpeedRPM ); bpControlTimerCounter = 0; result = BLOOD_PUMP_CONTROL_TO_TARGET_STATE; @@ -633,7 +640,7 @@ { bloodPumpSetSpeedRPM += BP_RAMP_STEP_SPEED_RPM; bloodPumpSetSpeedRPM = MIN( bloodPumpSetSpeedRPM, bloodPumpRampToSpeedRPM ); - setBPSetSpeed( bloodPumpSetSpeedRPM ); + setPeristalticPumpSetSpeed( BP_SIGNED_SET_SPEED ); } return result; @@ -661,9 +668,8 @@ else if ( bloodPumpSetSpeedRPM <= bloodPumpRampToSpeedRPM ) { resetBloodPumpRPMMovingAverage(); - bloodPumpSetSpeedRPM = 0; // resetPIController( PI_CONTROLLER_ID_BLOOD_FLOW, bloodPumpSetSpeedRPM ); - setBPSetSpeed( bloodPumpSetSpeedRPM ); + setPeristalticPumpSetSpeed( BP_SIGNED_SET_SPEED ); bpControlTimerCounter = 0; result = BLOOD_PUMP_CONTROL_TO_TARGET_STATE; } @@ -672,7 +678,7 @@ { bloodPumpSetSpeedRPM -= BP_RAMP_STEP_SPEED_RPM; bloodPumpSetSpeedRPM = MAX( bloodPumpSetSpeedRPM, bloodPumpRampToSpeedRPM ); - setBPSetSpeed( bloodPumpSetSpeedRPM ); + setPeristalticPumpSetSpeed( BP_SIGNED_SET_SPEED ); } return result; @@ -702,7 +708,7 @@ // newRPM = runPIController( PI_CONTROLLER_ID_BLOOD_FLOW, tgtFlow, actFlow ); // newRPM = ( newRPM < 0.0F ? 0.0F : newRPM ); bloodPumpSetSpeedRPM = (U32)((S32)(newRPM)); - setBPSetSpeed( bloodPumpSetSpeedRPM ); + setPeristalticPumpSetSpeed( BP_SIGNED_SET_SPEED ); } bpControlTimerCounter = 0; } @@ -805,15 +811,15 @@ payload.measFlow = getMeasuredBloodFlowRate(); payload.measRotorSpd = getMeasuredBloodPumpRotorSpeed(); payload.measPumpSpd = getMeasuredBloodPumpSpeed(); -// payload.measCurr = getMeasuredBloodPumpMCCurrent(); + payload.measCurr = 0.0F; // TODO getMeasuredBloodPumpMCCurrent(); payload.setRPM = bloodPumpSetSpeedRPM; payload.rotorCount = getBloodPumpRotorCount(); - if ( ( MODE_PRET == opMode ) || ( MODE_TREA == opMode ) || ( MODE_POST == opMode ) ) - { // prescribed flow only available in treatment modes +// if ( ( MODE_PRET == opMode ) || ( MODE_TREA == opMode ) || ( MODE_POST == opMode ) ) +// { // prescribed flow only available in treatment modes // payload.presFlow = getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); // TODO - restore when Tx Param Mode implemented // } // else -// { + { payload.presFlow = 0; } payload.rotorHall = ( hallSensor > 0 ? 0 : 1 ); // 1=home, 0=not home Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r8cbddbe34a4ffed5a4d9fac07a065799c5862611 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 8cbddbe34a4ffed5a4d9fac07a065799c5862611) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -14,47 +14,47 @@ * @date (original) 07-Aug-2024 * ***************************************************************************/ - + #include "adc.h" -#include "InternalADC.h" - +#include "InternalADC.h" + /** * @addtogroup InternalADC * @{ */ -// ********** private definitions ********** - -#define MAX_ADC_CHANNELS 24 ///< ADC supports up to 24 channels. -#define SIZE_OF_ROLLING_AVG 8 ///< Samples in rolling average calculations. -#define ROLLING_AVG_SHIFT_DIVIDER 3 ///< Rolling average shift divider. +// ********** private definitions ********** -/// Mapping from enumerated used ADC channel to processor channel ID. -const INT_ADC_CHANNEL_T ADC_CHANNEL_NUM_TO_CHANNEL_ID[ MAX_ADC_CHANNELS ] = -{ - INT_ADC_NOT_USED, // 0 +#define MAX_ADC_CHANNELS 24 ///< ADC supports up to 24 channels. +#define SIZE_OF_ROLLING_AVG 8 ///< Samples in rolling average calculations. +#define ROLLING_AVG_SHIFT_DIVIDER 3 ///< Rolling average shift divider. + +/// Mapping from enumerated used ADC channel to processor channel ID. +const INT_ADC_CHANNEL_T ADC_CHANNEL_NUM_TO_CHANNEL_ID[ MAX_ADC_CHANNELS ] = +{ + INT_ADC_NOT_USED, // 0 INT_ADC_PS_THERMISTOR, // 1 INT_ADC_PBA_ADC_REF, // 2 INT_ADC_24V_ACTUATORS_REG, // 3 INT_ADC_1_2V_PROCESSOR, // 4 INT_ADC_5V_SENSORS, // 5 - INT_ADC_NOT_USED, // 6 - INT_ADC_NOT_USED, // 7 + INT_ADC_NOT_USED, // 6 + INT_ADC_NOT_USED, // 7 INT_ADC_PRIMARY_ALARM_CURRENT_HG, // 8 - INT_ADC_NOT_USED, // 9 + INT_ADC_NOT_USED, // 9 INT_ADC_BOARD_THERMISTOR, // 10 INT_ADC_1_25_FPGA_ADC_REF, // 11 INT_ADC_3_3V, // 12 INT_ADC_5V_LOGIC, // 13 INT_ADC_PRIMARY_ALARM_CURRENT_LG, // 14 - INT_ADC_NOT_USED, // 15 - INT_ADC_BLOOD_PUMP_SPEED, // 16 - INT_ADC_BLOOD_PUMP_MOTOR_CURRENT, // 17 - INT_ADC_BACKUP_V, // 18 - INT_ADC_NOT_USED, // 19 - INT_ADC_NOT_USED, // 20 - INT_ADC_NOT_USED, // 21 + INT_ADC_NOT_USED, // 15 + INT_ADC_BLOOD_PUMP_SPEED, // 16 + INT_ADC_BLOOD_PUMP_MOTOR_CURRENT, // 17 + INT_ADC_BACKUP_V, // 18 + INT_ADC_NOT_USED, // 19 + INT_ADC_NOT_USED, // 20 + INT_ADC_NOT_USED, // 21 INT_ADC_24V_ACTUATORS, // 22 INT_ADC_NOT_USED // 23 }; @@ -77,130 +77,129 @@ 0.073240, // mA - INT_ADC_PRIMARY_ALARM_CURRENT_LG 0.007106, // V - INT_ADC_24V_ACTUATORS 0.007106, // V - INT_ADC_BACKUP_V - 0.000000, // V - INT_ADC_DUMMY -}; - -// ********** private data ********** - -static adcData_t adcRawReadings[ NUM_OF_INT_ADC_CHANNELS ]; ///< Buffer holds latest adc channel readings. -static U32 adcRawReadingsCount = 0; ///< Readings count for raw readings buffer. - -static U16 adcReadings[ NUM_OF_INT_ADC_CHANNELS ][ SIZE_OF_ROLLING_AVG ]; ///< Holds samples for each channel for a rolling average. -static U32 adcReadingsIdx[ NUM_OF_INT_ADC_CHANNELS ]; ///< Index for next reading in each rolling average array. -static U32 adcReadingsTotals[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling total for each channel - used to calc average. -static U32 adcReadingsAvgs[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling average for each channel. - -// ********** private function prototypes ********** - -/*********************************************************************//** - * @brief - * The initInternalADC function initializes the InternalADC unit. - * @details \b Inputs: none - * @details \b Outputs: InternalADC unit is initialized. - * @return none - *************************************************************************/ -void initInternalADC( void ) -{ - U32 c,r; - - // Zero all adc values and stats - adcRawReadingsCount = 0; - for ( c = 0; c < NUM_OF_INT_ADC_CHANNELS; c++ ) - { - adcRawReadings[ c ].id = 0; - adcRawReadings[ c ].value = 0; - adcReadingsIdx[ c ] = 0; - adcReadingsTotals[ c ] = 0; - adcReadingsAvgs[ c ] = 0; - for ( r = 0; r < SIZE_OF_ROLLING_AVG; r++ ) - { - adcReadings[ c ][ r ] = 0; - } - } - - // Enable interrupt when all channels converted - adcEnableNotification( adcREG1, adcGROUP1 ); -} - -/*********************************************************************//** - * @brief - * The adcNotification function handles an ADC conversion complete interrupt. - * All channel readings in the FIFO are retrieved. - * @details \b Inputs: ADC FIFO - * @details \b Outputs: adcRawReadingsCount, adcRawReadings[] - * @param adc pointer to the ADC1 controller - * @param group ADC channel group ID - * @return none - *************************************************************************/ -void adcNotification( adcBASE_t *adc, uint32 group ) -{ - if ( adcGROUP1 == group ) - { - adcRawReadingsCount = adcGetData( adcREG1, adcGROUP1, adcRawReadings ); - } -} - -/*********************************************************************//** - * @brief - * The execInternalADC function processes the last set of raw ADC channel +}; + +// ********** private data ********** + +static adcData_t adcRawReadings[ NUM_OF_INT_ADC_CHANNELS ]; ///< Buffer holds latest adc channel readings. +static U32 adcRawReadingsCount = 0; ///< Readings count for raw readings buffer. + +static U16 adcReadings[ NUM_OF_INT_ADC_CHANNELS ][ SIZE_OF_ROLLING_AVG ]; ///< Holds samples for each channel for a rolling average. +static U32 adcReadingsIdx[ NUM_OF_INT_ADC_CHANNELS ]; ///< Index for next reading in each rolling average array. +static U32 adcReadingsTotals[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling total for each channel - used to calc average. +static U32 adcReadingsAvgs[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling average for each channel. + +// ********** private function prototypes ********** + +/*********************************************************************//** + * @brief + * The initInternalADC function initializes the InternalADC unit. + * @details \b Inputs: none + * @details \b Outputs: InternalADC unit is initialized. + * @return none + *************************************************************************/ +void initInternalADC( void ) +{ + U32 c,r; + + // Zero all adc values and stats + adcRawReadingsCount = 0; + for ( c = 0; c < NUM_OF_INT_ADC_CHANNELS; c++ ) + { + adcRawReadings[ c ].id = 0; + adcRawReadings[ c ].value = 0; + adcReadingsIdx[ c ] = 0; + adcReadingsTotals[ c ] = 0; + adcReadingsAvgs[ c ] = 0; + for ( r = 0; r < SIZE_OF_ROLLING_AVG; r++ ) + { + adcReadings[ c ][ r ] = 0; + } + } + + // Enable interrupt when all channels converted + adcEnableNotification( adcREG1, adcGROUP1 ); +} + +/*********************************************************************//** + * @brief + * The adcNotification function handles an ADC conversion complete interrupt. + * All channel readings in the FIFO are retrieved. + * @details \b Inputs: ADC FIFO + * @details \b Outputs: adcRawReadingsCount, adcRawReadings[] + * @param adc pointer to the ADC1 controller + * @param group ADC channel group ID + * @return none + *************************************************************************/ +void adcNotification( adcBASE_t *adc, uint32 group ) +{ + if ( adcGROUP1 == group ) + { + adcRawReadingsCount = adcGetData( adcREG1, adcGROUP1, adcRawReadings ); + } +} + +/*********************************************************************//** + * @brief + * The execInternalADC function processes the last set of raw ADC channel * readings and kicks off the next conversion of ADC channels. * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if raw readings count exceeds - * ADC channel count - * @details \b Inputs: adcRawReadingsCount, adcRawReadings[] - * @details \b Outputs: adcReadings[][], adcReadingsIdx[], adcReadingsTotals[], adcReadingsAvgs[] - * @return none - *************************************************************************/ -void execInternalADC( void ) -{ - U32 i; - - if ( adcRawReadingsCount < NUM_OF_INT_ADC_CHANNELS ) - { - // Process readings from last conversion - for ( i = 0; i < adcRawReadingsCount; i++ ) - { - U32 ch = ADC_CHANNEL_NUM_TO_CHANNEL_ID[ adcRawReadings[ i ].id ]; - - adcReadingsTotals[ ch ] -= adcReadings[ ch ][ adcReadingsIdx[ ch ] ]; - adcReadings[ ch ][ adcReadingsIdx[ ch ] ] = adcRawReadings[i].value; - adcReadingsTotals[ ch ] += adcRawReadings[ i ].value; - adcReadingsAvgs[ ch ] = adcReadingsTotals[ ch ] >> ROLLING_AVG_SHIFT_DIVIDER; - adcReadingsIdx[ ch ] = INC_WRAP( adcReadingsIdx[ ch ], 0, SIZE_OF_ROLLING_AVG - 1 ); - } - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, adcRawReadingsCount ) - } - - // Start an adc channel group conversion - adcStartConversion( adcREG1, adcGROUP1 ); -} - -/*********************************************************************//** - * @brief - * The getIntADCReading function gets the latest average reading for a given + * ADC channel count + * @details \b Inputs: adcRawReadingsCount, adcRawReadings[] + * @details \b Outputs: adcReadings[][], adcReadingsIdx[], adcReadingsTotals[], adcReadingsAvgs[] + * @return none + *************************************************************************/ +void execInternalADC( void ) +{ + U32 i; + + if ( adcRawReadingsCount < NUM_OF_INT_ADC_CHANNELS ) + { + // Process readings from last conversion + for ( i = 0; i < adcRawReadingsCount; i++ ) + { + U32 ch = ADC_CHANNEL_NUM_TO_CHANNEL_ID[ adcRawReadings[ i ].id ]; + + adcReadingsTotals[ ch ] -= adcReadings[ ch ][ adcReadingsIdx[ ch ] ]; + adcReadings[ ch ][ adcReadingsIdx[ ch ] ] = adcRawReadings[i].value; + adcReadingsTotals[ ch ] += adcRawReadings[ i ].value; + adcReadingsAvgs[ ch ] = adcReadingsTotals[ ch ] >> ROLLING_AVG_SHIFT_DIVIDER; + adcReadingsIdx[ ch ] = INC_WRAP( adcReadingsIdx[ ch ], 0, SIZE_OF_ROLLING_AVG - 1 ); + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, adcRawReadingsCount ) + } + + // Start an adc channel group conversion + adcStartConversion( adcREG1, adcGROUP1 ); +} + +/*********************************************************************//** + * @brief + * The getIntADCReading function gets the latest average reading for a given * channel. - * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if given channel invalid. - * @details \b Inputs: adcReadingsAvgs[] - * @details \b Outputs: none - * @param channel adc channel to retrieve a reading for - * @return The rolling averaged reading for the given channel - *************************************************************************/ -U16 getIntADCReading( INT_ADC_CHANNEL_T channel ) -{ - U16 result = 0; - - if ( channel < NUM_OF_INT_ADC_CHANNELS ) - { - result = adcReadingsAvgs[ channel ]; - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED1, channel ) - } - - return result; + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if given channel invalid. + * @details \b Inputs: adcReadingsAvgs[] + * @details \b Outputs: none + * @param channel adc channel to retrieve a reading for + * @return The rolling averaged reading for the given channel + *************************************************************************/ +U16 getIntADCReading( INT_ADC_CHANNEL_T channel ) +{ + U16 result = 0; + + if ( channel < NUM_OF_INT_ADC_CHANNELS ) + { + result = adcReadingsAvgs[ channel ]; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED1, channel ) + } + + return result; } /*********************************************************************//** @@ -228,5 +227,5 @@ return result; } - + /**@}*/ Index: firmware/App/Drivers/InternalADC.h =================================================================== diff -u -r8cbddbe34a4ffed5a4d9fac07a065799c5862611 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 8cbddbe34a4ffed5a4d9fac07a065799c5862611) +++ firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -14,12 +14,12 @@ * @date (original) 07-Aug-2024 * ***************************************************************************/ - -#ifndef __INT_ADC_H__ -#define __INT_ADC_H__ - -#include "TDCommon.h" - + +#ifndef __INT_ADC_H__ +#define __INT_ADC_H__ + +#include "TDCommon.h" + /** * @defgroup InternalADC InternalADC * @brief The internal ADC unit provides functions for reading the sampled @@ -29,16 +29,16 @@ * @{ */ -// ********** public definitions ********** - -#define INT_ADC_BITS_PER_CHANNEL 12 ///< Internal ADC channels are 12-bit. -#define INT_ADC_FULL_SCALE_BITS 4096 ///< Internal ADC has 4096 full scale counts per channel. -#define INT_ADC_ZERO 1998 ///< For signed 2's compliment data, zero is here. -#define INT_ADC_REF_V 3.0F ///< Internal ADC reference voltage is 3.0V. +// ********** public definitions ********** -/// Enumeration of internal ADC channels that are used. -typedef enum Int_ADC_Channels -{ +#define INT_ADC_BITS_PER_CHANNEL 12 ///< Internal ADC channels are 12-bit. +#define INT_ADC_FULL_SCALE_BITS 4096 ///< Internal ADC has 4096 full scale counts per channel. +#define INT_ADC_ZERO 1998 ///< For signed 2's compliment data, zero is here. +#define INT_ADC_REF_V 3.0F ///< Internal ADC reference voltage is 3.0V. + +/// Enumeration of internal ADC channels that are used. +typedef enum Int_ADC_Channels +{ INT_ADC_NOT_USED = 0, ///< Not used INT_ADC_BLOOD_PUMP_SPEED, ///< Internal ADC channel for blood pump speed INT_ADC_BLOOD_PUMP_MOTOR_CURRENT, ///< Internal ADC channel for blood pump current @@ -55,18 +55,18 @@ INT_ADC_PRIMARY_ALARM_CURRENT_LG, ///< Internal ADC channel for primary alarm audio current low gain INT_ADC_24V_ACTUATORS, ///< Internal ADC channel for 24V to actuators INT_ADC_BACKUP_V, ///< Internal ADC channel for VBackup - INT_ADC_DUMMY, ///< Internal ADC channel - not used, needed to get even number of channels - NUM_OF_INT_ADC_CHANNELS ///< Number of used internal ADC channels. -} INT_ADC_CHANNEL_T; - -// ********** public function prototypes ********** - -void initInternalADC( void ); +// INT_ADC_DUMMY, ///< Internal ADC channel - not used, needed to get even number of channels + NUM_OF_INT_ADC_CHANNELS ///< Number of used internal ADC channels. +} INT_ADC_CHANNEL_T; + +// ********** public function prototypes ********** + +void initInternalADC( void ); void execInternalADC( void ); - + U16 getIntADCReading( INT_ADC_CHANNEL_T channel ); -F32 getIntADCVoltageConverted( INT_ADC_CHANNEL_T channel ); - +F32 getIntADCVoltageConverted( INT_ADC_CHANNEL_T channel ); + /**@}*/ -#endif +#endif Index: firmware/App/Drivers/PeristalticPump.c =================================================================== diff -u -r87d705fcf977af12b7b034735fa5867f2daea2b9 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Drivers/PeristalticPump.c (.../PeristalticPump.c) (revision 87d705fcf977af12b7b034735fa5867f2daea2b9) +++ firmware/App/Drivers/PeristalticPump.c (.../PeristalticPump.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -27,13 +27,22 @@ // ********** private definitions ********** -#define MAX_PUMP_SPEED_RPM 5000U ///< Maximum speed (in RPM) that a peristaltic pump can be set to. +#define MAX_PUMP_SPEED_RPM 3080U ///< Maximum speed (in RPM) that a peristaltic pump can be set to. +#define BP_PUMP_CMD_GAIN 0.9F ///< Gain for blood pump commanded RPM that must be applied before sending to FPGA. +#define BP_PUMP_CMD_OFFSET 80.0F ///< Offset for blood pump commanded RPM that must be applied before sending to FPGA. +#define BP_PUMP_CMD_CAL(r) ((r) * BP_PUMP_CMD_GAIN + BP_PUMP_CMD_OFFSET ) ///< Macro to calibrate a commanded blood pump RPM before sending to FPGA. +#define BP_PERIOD_SEC 0.00001F ///< Blood pump feedback period in seconds. +#define BP_HZ_TO_RPM_SCALAR 10.0F ///< Blood pump Hz to RPM scalar. +#define BP_PERIOD_TO_HZ(p) ( 1.0F / (F32)((S32)(p) * BP_PERIOD_SEC) ) ///< Blood pump period to Hz conversion macro. +#define BP_HZ_TO_RPM(h) ((h) * BP_HZ_TO_RPM_SCALAR) ///< Blood pump Hz to RPM conversion macro. +#define BP_ZERO_SPEED_PERIOD 0xFFFF ///< Blood pump period reported when pump is stopped. + // ********** private data ********** -static S32 pumpSetSpeedRPM; ///< Current set speed for the pump (in RPM). Negative indicates reverse direction. -static OVERRIDE_S32_T pumpMeasSpeedRPM; ///< Latest measured pump speed (in RPM). -static BOOL pumpHomeRequested; ///< Flag indicates a pump home operation has been requested. +static S32 pumpSetSpeedRPM; ///< Current set speed for the pump (in RPM). Negative indicates reverse direction. +static OVERRIDE_F32_T pumpMeasSpeedRPM; ///< Latest measured pump speed (in RPM). +static BOOL pumpHomeRequested; ///< Flag indicates a pump home operation has been requested. // ********** private function prototypes ********** @@ -49,9 +58,9 @@ { pumpHomeRequested = FALSE; pumpSetSpeedRPM = 0; - pumpMeasSpeedRPM.data = 0; - pumpMeasSpeedRPM.ovData = 0; - pumpMeasSpeedRPM.ovInitData = 0; + pumpMeasSpeedRPM.data = 0.0F; + pumpMeasSpeedRPM.ovData = 0.0F; + pumpMeasSpeedRPM.ovInitData = 0.0F; pumpMeasSpeedRPM.override = OVERRIDE_RESET; setBPDirection( MOTOR_DIR_FORWARD ); @@ -72,14 +81,25 @@ *************************************************************************/ void readPeristalticPumps( void ) { + U16 period = getBPPeriod(); + F32 Hz = BP_PERIOD_TO_HZ(period); + F32 rpm = BP_HZ_TO_RPM(Hz); + // update measured pump speed - if ( pumpSetSpeedRPM < 0 ) + if ( period != BP_ZERO_SPEED_PERIOD ) { - pumpMeasSpeedRPM.data = (S32)( (S16)getBPSpeed() * -1 ); + if ( pumpSetSpeedRPM < 0 ) // TODO - can we get a real measured direction to base measured speed sign on? + { + pumpMeasSpeedRPM.data = rpm * -1.0F; + } + else + { + pumpMeasSpeedRPM.data = rpm; + } } else { - pumpMeasSpeedRPM.data = (S32)( (S16)getBPSpeed() ); + pumpMeasSpeedRPM.data = 0.0F; } // clear home command if previously requested @@ -120,7 +140,8 @@ if ( abs( rpm ) < MAX_PUMP_SPEED_RPM ) { - U16 setRpm = (U16)( abs( rpm ) ); + F32 calRpm = BP_PUMP_CMD_CAL( (F32)rpm ); + U16 setRpm = (U16)( abs( (S32)calRpm ) ); MOTOR_DIR_T dir = MOTOR_DIR_FORWARD; if ( rpm < 0 ) @@ -163,9 +184,9 @@ * @details \b Outputs: none * @return Latest measured pump speed in RPM. *************************************************************************/ -S32 getPeristalticPumpMeasSpeed( void ) +F32 getPeristalticPumpMeasSpeed( void ) { - S32 result = pumpMeasSpeedRPM.data; + F32 result = pumpMeasSpeedRPM.data; if ( OVERRIDE_KEY == pumpMeasSpeedRPM.override ) { @@ -175,41 +196,5 @@ return result; } - -/************************************************************************* - * TEST SUPPORT FUNCTIONS - *************************************************************************/ - - -/*********************************************************************//** - * @brief - * The testSetPeristalticPumpSetSpeed function sets the pump to a given speed - * (RPM). A negative speed indicates reverse (CCW) direction. - * @details \b Inputs: none - * @details \b Outputs: pumpSetSpeedRPM - * @param message set message from Dialin which includes the speed (RPM) to set - * the peristaltic pump to. - * @return TRUE if set request is successful, FALSE if not - *************************************************************************/ -BOOL testSetPeristalticPumpSetSpeed( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - // Verify tester has logged in with TD and override type is valid - if ( TRUE == isTestingActivated() ) - { - // Verify payload length is valid - if ( sizeof( S32 ) == message->hdr.payloadLen ) - { - S32 speed; - - memcpy( &speed, message->payload, sizeof(S32) ); - result = setPeristalticPumpSetSpeed( (S16)speed ); - } - } - - return result; -} - /**@}*/ Index: firmware/App/Drivers/PeristalticPump.h =================================================================== diff -u -rd9b5f588d81e15ed3849222bed3362e15dbf4b0a -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Drivers/PeristalticPump.h (.../PeristalticPump.h) (revision d9b5f588d81e15ed3849222bed3362e15dbf4b0a) +++ firmware/App/Drivers/PeristalticPump.h (.../PeristalticPump.h) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -41,7 +41,7 @@ BOOL setPeristalticPumpSetSpeed( S32 rpm ); S32 getPeristalticPumpSetSpeed( void ); -S32 getPeristalticPumpMeasSpeed( void ); +F32 getPeristalticPumpMeasSpeed( void ); void cmdPeristalticPumpHome( void ); Index: firmware/App/Drivers/PressureSensor.c =================================================================== diff -u -rd9b5f588d81e15ed3849222bed3362e15dbf4b0a -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Drivers/PressureSensor.c (.../PressureSensor.c) (revision d9b5f588d81e15ed3849222bed3362e15dbf4b0a) +++ firmware/App/Drivers/PressureSensor.c (.../PressureSensor.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -18,22 +18,22 @@ #include "FpgaTD.h" #include "Messaging.h" #include "PersistentAlarm.h" -#include "PressureCommon.h" +#include "PressureCommon.h" #include "PressureSensor.h" -#include "Utilities.h" - +#include "Utilities.h" + /** * @addtogroup PressureSensor * @{ */ -// ********** private definitions ********** - -#define BAR_TO_MMHG ( 750.062F ) ///< Conversion factor for converting bar to mmHg. +// ********** private definitions ********** #define PRES_SENSORS_ZERO_OFFSET ( 1638.0F ) ///< Zero offset for pressure sensor readings. #define PRES_SENSORS_DIVISOR ( 14745.0F - PRES_SENSORS_ZERO_OFFSET ) ///< Divisor for pressure sensor conversion from counts to bars. -#define PRES_SENSORS_RANGE_IN_BARS ( 1.6F - 0.0F ) ///< Range (in bars) of the pressure sensors (0..1.6). +#define PRESSURE_MIN_PSI ( -30.0F ) ///< Minimum of scale for pressure sensor reading (in PSI). +#define PRESSURE_MAX_PSI ( 30.0F ) ///< Maximum of scale for pressure sensor reading (in PSI). +#define PSI_TO_MMHG ( 51.7149F ) ///< Conversion factor for converting PSI to mmHg. #define PRES_SENSORS_COUNT_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Pressure sensors read and error count timeout in milliseconds. @@ -46,8 +46,8 @@ #define PRESSURE_STALE_DATA 2 ///< Pressure status bits indicate data is stale (no new data since last fpga read). #define PRESSURE_DIAG_CONDITION 3 ///< Pressure status bits diagnostic condition (alarm). -// ********** private data ********** - +// ********** private data ********** + static OVERRIDE_F32_T currentPressureReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< Current pressure sensor pressure readings (overrideable). static OVERRIDE_F32_T currentPresTempReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< Current pressure sensor temperature readings (overrideable). static OVERRIDE_U32_T lastPressureReadCounter[ NUM_OF_PRESSURE_SENSORS ]; ///< Last pressure sensor read count (Overrideable). @@ -56,9 +56,8 @@ // ********** private function prototypes ********** -static void checkPressureSensors( void ); -static F32 convertPressureRdg2mmHg( S16 counts ); -static F32 getPresureReadingFromFPGARegReading( U16 fpgaReg ); +static void checkPressureSensors( void ); +static F32 convertPressureRdg2mmHg( U16 counts ); static U32 getPressureStatusFromFPGARegReading( U16 fpgaReg ); /*********************************************************************//** @@ -153,34 +152,21 @@ * @param counts the raw pressure reading in counts from the FPGA * @return the pressure in mmHg *************************************************************************/ -static F32 convertPressureRdg2mmHg( S16 counts ) +static F32 convertPressureRdg2mmHg( U16 counts ) { - F32 rdg = getPresureReadingFromFPGARegReading( counts ); - F32 bar = ( ( rdg - PRES_SENSORS_ZERO_OFFSET ) * ( PRES_SENSORS_RANGE_IN_BARS ) / ( PRES_SENSORS_DIVISOR ) ); - F32 mmHg = bar * BAR_TO_MMHG; + S16 rdg = (S16)( counts & FPGA_PRESSURE_READING_BITS_MASK ); + F32 presPSI; + F32 mmHg; + // If the arterial pressure status is normal, convert the counts to pressure in mmHg + presPSI = ( ( (F32)rdg - PRES_SENSORS_ZERO_OFFSET ) *( PRESSURE_MAX_PSI - PRESSURE_MIN_PSI ) / PRES_SENSORS_DIVISOR ) + PRESSURE_MIN_PSI; + mmHg = presPSI * PSI_TO_MMHG; + return mmHg; } /*********************************************************************//** * @brief - * The getPresureReadingFromFPGARegReading function extracts the signed - * pressure reading (in counts) from the FPGA register reading. - * @details \b Inputs: none - * @details \b Outputs: none - * @param fpgaReg the value read from the FPGA register - * @return the pressure portion of the FPGA register value, sign extended - *************************************************************************/ -static F32 getPresureReadingFromFPGARegReading( U16 fpgaReg ) -{ - U16 rdg = fpgaReg & FPGA_PRESSURE_READING_BITS_MASK; // mask off status bits - S16 ext = signExtend16( rdg, FPGA_PRESSURE_READING_BIT_COUNT - 1 ); // sign extend reading in case it's negative - - return (F32)ext; -} - -/*********************************************************************//** - * @brief * The getPressureStatusFromFPGARegReading function extracts the status * from the FPGA register reading. * @details \b Inputs: none @@ -368,5 +354,5 @@ return result; } - + /**@}*/ Index: firmware/App/Monitors/Pressures.c =================================================================== diff -u -r234d4fec2bf5b31dacaa2825eed0d4717c295d44 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision 234d4fec2bf5b31dacaa2825eed0d4717c295d44) +++ firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -466,6 +466,9 @@ *************************************************************************/ void execPressure( void ) { + // Update pressure readings + readPressureSensors(); + // State machine switch ( pressureState ) { @@ -498,7 +501,7 @@ { PRESSURE_STATE_T result = PRESSURE_WAIT_FOR_POST_STATE; - if ( PRESSURE_TEST_STATE_COMPLETE == pressurePostState ) +// if ( PRESSURE_TEST_STATE_COMPLETE == pressurePostState ) // TODO - restore later { result = PRESSURE_CONTINUOUS_READ_STATE; } Index: firmware/App/Services/FpgaTD.c =================================================================== diff -u -r87d705fcf977af12b7b034735fa5867f2daea2b9 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision 87d705fcf977af12b7b034735fa5867f2daea2b9) +++ firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -46,7 +46,7 @@ #define MIN_POWER_ON_TIME_FOR_COMM_FAILS ( 1 * MS_PER_SECOND ) ///< Allow FPGA comm errors for first second after power-up #define FPGA_BP_ENABLE_BIT_MASK 0x01 ///< Bit mask for enabling the blood pump. -#define FPGA_BP_DIRECTION_FWD_BIT_MASK 0x02 ///< Bit mask for setting the blood pump direction. +#define FPGA_BP_DIRECTION_REV_BIT_MASK 0x02 ///< Bit mask for setting the blood pump direction. #define FPGA_BP_HOME_BIT_MASK 0x04 ///< Bit mask for requesting a blood pump home operation. #define FPGA_VBT_OPEN_BIT_MASK 0x01 ///< Bit mask for setting VBT valve position to open. @@ -87,86 +87,78 @@ U08 errorCountProcessor; ///< Reg 258. Error count for processor communications. U08 errorCountPC; ///< Reg 259. Error count for TBD. U08 sPumpDACRdStatus; ///< Reg 260. Syringe pump DAC read status. - U08 reserved1; ///< Reg 261. Reserved and available for future use. + U08 BPHallStatus; ///< Reg 261. BP hall sensor status. U16 sPumpDACSet; ///< Reg 262. Syringe pump DAC setting. U16 sPumpDACEEProm; ///< Reg 264. Syringe pump DAC EEProm data. U16 PBoPressure; ///< Reg 266. PBo raw pressure data. S16 PBoTemperature; ///< Reg 268. PBo raw temperature data. U08 PBoReadCount; ///< Reg 270. PBo read count. U08 PBoErrorCount; ///< Reg 271. PBo error count. - U32 reserved3; ///< Reg 272. Reserved and available for future use. - U16 PBAPressure; ///< Reg 276. PBA raw pressure data. - S16 PBATemperature; ///< Reg 278. PBA raw temperature data. - U08 PBAReadCount; ///< Reg 280. PBA read count. - U08 PBAErrorCount; ///< Reg 281. PBA error count. - S16 VBACmdPosition; ///< Reg 282. VBA commanded position (200 steps/rev). - S16 VBAEncPosition; ///< Reg 284. VBA encoder position (1024 counts/rev). - U08 VBAStatus; ///< Reg 286. VBA status. - U08 reserved4; ///< Reg 287. Reserved and available for future use. - U08 BEMStatus; ///< Reg 288. BEM status. - U08 BEMEncStatus; ///< Reg 289. BEM encoder status. - S32 BEMEncPosition; ///< Reg 290. BEM encoder position. - S16 BPSpeed; ///< Reg 294. BP measured speed (RPM). - S16 BPTorque; ///< Reg 296. BP measured torque. - S16 BPSpeedFromHall; ///< Reg 298. BP measured speed from hall sensor(s). - S16 VBVCmdPosition; ///< Reg 300. VBV commanded position (200 steps/rev). - S16 VBVEncPosition; ///< Reg 302. VBV encoder position (1024 counts/rev). - U08 VBVStatus; ///< Reg 304. VBV status. - U08 BPStatus; ///< Reg 305. BP status. - U16 GPIOReg; ///< Reg 306. GPIO register. - U08 HEPStatus; ///< Reg 308. HEP status register. - U08 HEPAdcReadCount; ///< Reg 309. HEP ADC read counter. - U08 HEPAdcDacStatus; ///< Reg 310. HEP ADC/DAC status register. - U08 HEPEncStatus; ///< Reg 311. HEP encoder status register. - S32 HEPEncPosition; ///< Reg 312. HEP encoder position. - U16 HEPAdcCh0; ///< Reg 316. HEP ADC channel 0 reading. - U16 HEPAdcCh1; ///< Reg 318. HEP ADC channel 1 reading. - U16 HEPAdcCh2; ///< Reg 320. HEP ADC channel 2 reading. - U16 HEPAdcCh3; ///< Reg 322. HEP ADC channel 3 reading. - U16 fpgaAdcTemperature; ///< Reg 324. FPGA ADC temperature. - U16 fpga1msTimerCounter; ///< Reg 326. FPGA 1 millisecond timer counter. - U16 alarmBuzzerCurrentAdc; ///< Reg 328. Alarm buzzer current ADC reading. - U16 fpgaVccInternalAdc; ///< Reg 330. FPGA Vcc internal voltage ADC reading. - U16 fpgaCompatibilityRev; ///< Reg 332. Compatibility revision. - U08 VBTStatus; ///< Reg 334. VBT status register. - U08 VBTStatusPWM; ///< Reg 335. VBT PWM status register. - S16 ACPower1Current; ///< Reg 336. AC power current - 1. - S16 ACPower1Voltage; ///< Reg 338. AC power voltage - 1. - S16 ACPower2Current; ///< Reg 340. AC power current - 2. - S16 ACPower2Voltage; ///< Reg 342. AC power voltage - 2. - S16 ACPower3Current; ///< Reg 344. AC power current - 3. - S16 ACPower3Voltage; ///< Reg 346. AC power voltage - 3. + U16 PBAPressure; ///< Reg 272. PBA raw pressure data. + S16 PBATemperature; ///< Reg 274. PBA raw temperature data. + U08 PBAReadCount; ///< Reg 276. PBA read count. + U08 PBAErrorCount; ///< Reg 277. PBA error count. + S16 VBACmdPosition; ///< Reg 278. VBA commanded position (200 steps/rev). + S16 VBAEncPosition; ///< Reg 280. VBA encoder position (1024 counts/rev). + U08 VBAStatus; ///< Reg 282. VBA status. + U08 reserved4; ///< Reg 283. Reserved and available for future use. + U08 BEMStatus; ///< Reg 284. BEM status. + U08 BEMEncStatus; ///< Reg 285. BEM encoder status. + S32 BEMEncPosition; ///< Reg 286. BEM encoder position. + S16 BPPeriod; ///< Reg 290. BP measured period (10 uSec). + S16 BPTorque; ///< Reg 292. BP measured torque. + S16 BPSpeedFromHall; ///< Reg 294. BP measured speed from hall sensor(s). + S16 VBVCmdPosition; ///< Reg 296. VBV commanded position (200 steps/rev). + S16 VBVEncPosition; ///< Reg 298. VBV encoder position (1024 counts/rev). + U08 VBVStatus; ///< Reg 300. VBV status. + U08 BPStatus; ///< Reg 301. BP status. + U16 GPIOReg; ///< Reg 302. GPIO register. + U08 HEPStatus; ///< Reg 304. HEP status register. + U08 HEPAdcReadCount; ///< Reg 305. HEP ADC read counter. + U08 HEPAdcDacStatus; ///< Reg 306. HEP ADC/DAC status register. + U08 HEPEncStatus; ///< Reg 307. HEP encoder status register. + S32 HEPEncPosition; ///< Reg 308. HEP encoder position. + U16 HEPAdcCh0; ///< Reg 312. HEP ADC channel 0 reading. + U16 HEPAdcCh1; ///< Reg 314. HEP ADC channel 1 reading. + U16 HEPAdcCh2; ///< Reg 316. HEP ADC channel 2 reading. + U16 HEPAdcCh3; ///< Reg 318. HEP ADC channel 3 reading. + U16 fpgaAdcTemperature; ///< Reg 320. FPGA ADC temperature. + U16 fpga1msTimerCounter; ///< Reg 322. FPGA 1 millisecond timer counter. + U16 alarmBuzzerCurrentAdc; ///< Reg 324. Alarm buzzer current ADC reading. + U16 fpgaVccInternalAdc; ///< Reg 326. FPGA Vcc internal voltage ADC reading. + U16 fpgaCompatibilityRev; ///< Reg 328. Compatibility revision. + U08 VBTStatus; ///< Reg 330. VBT status register. + U08 VBTStatusPWM; ///< Reg 331. VBT PWM status register. + S16 ACPower1Current; ///< Reg 332. AC power current - 1. + S16 ACPower1Voltage; ///< Reg 334. AC power voltage - 1. + S16 ACPower2Current; ///< Reg 336. AC power current - 2. + S16 ACPower2Voltage; ///< Reg 338. AC power voltage - 2. + S16 ACPower3Current; ///< Reg 340. AC power current - 3. + S16 ACPower3Voltage; ///< Reg 342. AC power voltage - 3. + S32 ACHeaterTemp; ///< Reg 344. AC heater temperature. + U16 BPRotorHallSpeed; ///< Reg 348. BP rotor speed from hall sensor. } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. typedef struct { U16 fpgaGenWrRd; ///< Reg 04. FPGA general write/read-back register (mirrored to a general read register in read page at addr 256). U08 VBTControl; ///< Reg 06. VBT valve control register. - U08 reserved1; ///< Reg 07. Reserved. - U08 VBTPWMEnable; ///< Reg 08. VBT valve PWM enable register. - U08 reserved2; ///< Reg 09. Reserved. - U16 VBTPWMLowPeriod; ///< Reg 10. VBT PWM low signal period register. - U16 VBTPWMPeriod; ///< Reg 12. VBT PWM period register. - U16 VBTPWMPUllInTime; ///< Reg 14. VBT PWM pull in time register. - U16 ACHeaterPWM; ///< Reg 16. AC heater PWM duty cycle set register. - U08 ATAPControl; ///< Reg 18. Air pump control register. - U08 BEMControl; ///< Reg 19. Blood ejector stepper motor control register. - U16 BEMSetSpeed; ///< Reg 20. Blood ejector stepper motor step register. - U16 BPSetSpeed; ///< Reg 22. Blood pump speed set register (RPM). - U08 BPControl; ///< Reg 24. Blood pump control register. - U08 VBVControl; ///< Reg 25. VBV control register. - U16 VBVPosition; ///< Reg 26. VBV position set register (200 steps/rev). - U16 VBAPosition; ///< Reg 28. VBA position set register (200 steps/rev). - U16 VBAControl; ///< Reg 30. VBA control register. - U08 reserved3; ///< Reg 31. Reserved. - U16 reserved4; ///< Reg 32. Reserved. - U08 alarmControl; ///< Reg 34. Alarm audio control register. - U08 reserved5; ///< Reg 35. Reserved. - U32 reserved6; ///< Reg 36. Reserved. - U16 reserved7; ///< Reg 40. Reserved. - U16 reserved8; ///< Reg 42. Reserved. - U08 sensorTest; ///< Reg 44. Sensor self-test control register. + U08 VBTPWMEnable; ///< Reg 07. VBT valve PWM enable register. + U16 VBTPWMLowPeriod; ///< Reg 08. VBT PWM low signal period register. + U16 VBTPWMPeriod; ///< Reg 10. VBT PWM period register. + U16 VBTPWMPUllInTime; ///< Reg 12. VBT PWM pull in time register. + U08 ATAPControl; ///< Reg 14. Air pump control register. + U08 BEMControl; ///< Reg 15. Blood ejector stepper motor control register. + U16 BEMSetSpeed; ///< Reg 16. Blood ejector stepper motor step register. + U16 BPSetSpeed; ///< Reg 18. Blood pump speed set register (RPM). + U08 BPControl; ///< Reg 20. Blood pump control register. + U08 VBVControl; ///< Reg 21. VBV control register. + U16 VBVPosition; ///< Reg 22. VBV position set register (200 steps/rev). + U16 VBAPosition; ///< Reg 24. VBA position set register (200 steps/rev). + U08 VBAControl; ///< Reg 26. VBA control register. + U08 valveEncoderControl; ///< Reg 27. VBA/VBV encoder control register. + U08 alarmControl; ///< Reg 28. Alarm audio control register. } FPGA_ACTUATORS_T; #pragma pack(pop) @@ -447,11 +439,11 @@ { if ( MOTOR_DIR_REVERSE == dir ) { - fpgaActuatorSetPoints.BPControl &= ~((U08)FPGA_BP_DIRECTION_FWD_BIT_MASK); + fpgaActuatorSetPoints.BPControl |= FPGA_BP_DIRECTION_REV_BIT_MASK; } else { - fpgaActuatorSetPoints.BPControl |= FPGA_BP_DIRECTION_FWD_BIT_MASK; + fpgaActuatorSetPoints.BPControl &= ~((U08)FPGA_BP_DIRECTION_REV_BIT_MASK); } } @@ -499,19 +491,34 @@ /*********************************************************************//** * @brief - * The getBPSpeed function gets the latest blood pump speed (in RPM) + * The getBPPeriod function gets the latest blood pump period (in 10uSec) * from the FPGA. * @details \b Inputs: fpgaSensorReadings * @details \b Outputs: none - * @return Latest blood pump speed. + * @return Latest blood pump period. *************************************************************************/ -U16 getBPSpeed( void ) +U16 getBPPeriod( void ) { - return fpgaSensorReadings.BPSpeed; + return fpgaSensorReadings.BPPeriod; } /*********************************************************************//** * @brief + * The getBPStatus function gets the latest blood pump hall sensor status. + * Bit 0: 0=Forward pump direction detected, 1=Reverse pump direction detected + * Bit 1: 0=Correct pump direction detected, 1=Incorrect pump direction detected + * Bit 2..7: Running incorrect pump direction counter (wraps). + * @details \b Inputs: fpgaSensorReadings.BPHallStatus + * @details \b Outputs: none + * @return Latest blood pump hall sensor status bits. + *************************************************************************/ +U08 getBPStatus( void ) +{ + return fpgaSensorReadings.BPHallStatus; +} + +/*********************************************************************//** + * @brief * The getBloodPumpHallSensorCount function gets the latest blood pump * hall sensor count. Count is a 16 bit free running counter. If counter is * counting up, indicates motor is running in forward direction. If counter is @@ -732,7 +739,7 @@ *************************************************************************/ void setFPGAVenousBubbleSelfTest( void ) { - fpgaActuatorSetPoints.sensorTest |= FPGA_ADV_BUBBLE_SELF_TEST_CMD; +// fpgaActuatorSetPoints.sensorTest |= FPGA_ADV_BUBBLE_SELF_TEST_CMD; } /*********************************************************************//** @@ -745,12 +752,12 @@ *************************************************************************/ void clearFPGAVenousBubbleSelfTest( void ) { - fpgaActuatorSetPoints.sensorTest &= ~FPGA_ADV_BUBBLE_SELF_TEST_CMD; +// fpgaActuatorSetPoints.sensorTest &= ~FPGA_ADV_BUBBLE_SELF_TEST_CMD; } /*********************************************************************//** * @brief - * The setVBAControl function sets the control bits for the venous pinch valve. + * The setVBVControl function sets the control bits for the venous pinch valve. * Microstep setting: bits 0..2: * 0=full step (100% torque) * 1=1/2 step (100% torque) @@ -778,7 +785,7 @@ *************************************************************************/ void setVBVControl( U08 controlBits ) { - + fpgaActuatorSetPoints.VBVControl = controlBits; } /*********************************************************************//** Index: firmware/App/Services/FpgaTD.h =================================================================== diff -u -r87d705fcf977af12b7b034735fa5867f2daea2b9 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 87d705fcf977af12b7b034735fa5867f2daea2b9) +++ firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -59,7 +59,7 @@ void homeBP( void ); void resetBPHomeRequest( void ); void setBPSetSpeed( U16 rpm ); -U16 getBPSpeed( void ); +U16 getBPPeriod( void ); U16 getBloodPumpHallSensorCount( void ); U08 getBloodPumpHallSensorStatus( void ); @@ -104,6 +104,6 @@ BOOL getFPGAFrontDoorClosedStatus( void ); -/**@}*/ - -#endif +/**@}*/ + +#endif Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r35c9e9bcd5678f0a2db8e51768d002ee10a5e624 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 35c9e9bcd5678f0a2db8e51768d002ee10a5e624) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -124,8 +124,7 @@ MSG_ID_TD_BLOOD_PUMP_MEASURED_FLOW_RATE_OVERRIDE_REQUEST, MSG_ID_TD_BLOOD_PUMP_MEASURED_MOTOR_SPEED_OVERRIDE_REQUEST, MSG_ID_TD_BLOOD_PUMP_MEASURED_ROTOR_SPEED_OVERRIDE_REQUEST, - MSG_ID_TD_BLOOD_PUMP_ROTOR_COUNT_OVERRIDE_REQUEST, - MSG_ID_TD_PERISTALTIC_PUMP_SET_SPEED_REQUEST + MSG_ID_TD_BLOOD_PUMP_ROTOR_COUNT_OVERRIDE_REQUEST }; /// Message handling function table @@ -172,8 +171,7 @@ &testMeasuredBloodFlowRateOverride, &testMeasuredBloodPumpSpeedOverride, &testMeasuredBloodPumpRotorSpeedOverride, - &testBloodPumpRotorCountOverride, - &testSetPeristalticPumpSetSpeed + &testBloodPumpRotorCountOverride }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLERS) / sizeof(MsgFuncPtr)) @@ -628,8 +626,6 @@ testerLoggedIn = FALSE; } - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, testerLoggedIn ); - return testerLoggedIn; } Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -rd9b5f588d81e15ed3849222bed3362e15dbf4b0a -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision d9b5f588d81e15ed3849222bed3362e15dbf4b0a) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -22,63 +22,60 @@ #include "InternalADC.h" #include "SystemCommTD.h" #include "TaskPriority.h" -#include "WatchdogMgmt.h" - +#include "WatchdogMgmt.h" + /** * @addtogroup TaskPriority * @{ */ -/*********************************************************************//** - * @brief - * The taskPriority function handles the scheduled Priority Task interrupt. - * Calls the executive functions for FPGA, pumps, valves, and buttons. - * @details \b Inputs: none +/*********************************************************************//** + * @brief + * The taskPriority function handles the scheduled Priority Task interrupt. + * Calls the executive functions for FPGA, pumps, valves, and buttons. + * @details \b Inputs: none * @details \b Outputs: Executive functions running in priority task are called. - * @return none - *************************************************************************/ -void taskPriority( void ) + * @return none + *************************************************************************/ +void taskPriority( void ) { #ifdef TASK_TIMING_OUTPUT_ENABLED // Set GPIO high to indicate priority task has begun executing setCPLDLampRed( PIN_SIGNAL_HIGH ); #endif - // Prevent most processing until UI has started communicating - if ( TRUE == uiCommunicated() ) + // Prevent most processing until UI has started communicating + if ( TRUE == uiCommunicated() ) { - // 1st pass for FPGA + // 1st pass for FPGA execFPGA( TRUE ); - + // Verify processor clock speed against FPGA clock // execFPGAClockSpeedTest(); - - // Monitor and process buttons - execButtons(); - - // Monitor internal ADC channels + + // Monitor and process buttons + execButtons(); + + // Monitor internal ADC channels execInternalADC(); // Monitor air trap level sensors execAirTrapMonitor(); - // Monitor blood pump and flow -// execBloodFlowMonitor(); - // Monitor air bubble detectors execBubbles(); - // 2nd pass for FPGA + // 2nd pass for FPGA execFPGA( FALSE ); - } - - // Check in with watchdog manager - checkInWithWatchdogMgmt( TASK_PRIORITY ); + } + // Check in with watchdog manager + checkInWithWatchdogMgmt( TASK_PRIORITY ); + #ifdef TASK_TIMING_OUTPUT_ENABLED // Set GPIO low to indicate priority task has finished executing setCPLDLampRed( PIN_SIGNAL_LOW ); #endif -} +} -/**@}*/ +/**@}*/ Index: firmware/TD.dil =================================================================== diff -u -r73d8423edc56daed591bc0b3f7baee5540aea423 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/TD.dil (.../TD.dil) (revision 73d8423edc56daed591bc0b3f7baee5540aea423) +++ firmware/TD.dil (.../TD.dil) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -1,4 +1,4 @@ -# RM46L852PGE 07/31/24 14:56:13 +# RM46L852PGE 12/02/24 16:30:42 # ARCH=RM46L852PGE # @@ -3311,7 +3311,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_37_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_29_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_6_INT_ENA.VALUE=0x00000400 -DRIVER.CAN.VAR.CAN_1_RAM_PARITY_ENA.VALUE=0x00000005 +DRIVER.CAN.VAR.CAN_1_RAM_PARITY_ENA.VALUE=0x0000000A DRIVER.CAN.VAR.CAN_1_MESSAGE_59_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_64_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_56_DLC.VALUE=8 @@ -3397,7 +3397,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_30_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_22_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_20_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_14_ENA.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_14_ENA.VALUE=0x80000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_12_INT_ENA.VALUE=0x00000400 DRIVER.CAN.VAR.CAN_3_MESSAGE_7_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_51_INT_LEVEL.VALUE=0x00000000 @@ -3416,8 +3416,8 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_21_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_14_EOB.VALUE=0x00000080 DRIVER.CAN.VAR.CAN_1_MESSAGE_14_DIR.VALUE=0x20000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_13_INT_ENA_REF.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_13_INT_ENA_REF.VALUE=0x00000001 +DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON.VALUE=0x00000200 DRIVER.CAN.VAR.CAN_2_MESSAGE_63_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_55_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_47_INT_ENA.VALUE=0x00000000 @@ -3430,7 +3430,7 @@ DRIVER.CAN.VAR.CAN_1_PORT_TX_PULDIS.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_30_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_22_BOOL_ENA.VALUE=0 -DRIVER.CAN.VAR.CAN_1_MESSAGE_14_BOOL_ENA.VALUE=0 +DRIVER.CAN.VAR.CAN_1_MESSAGE_14_BOOL_ENA.VALUE=1 DRIVER.CAN.VAR.CAN_3_MESSAGE_7_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_21_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_13_INT_LEVEL.VALUE=0x00002000 @@ -3787,7 +3787,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_45_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_37_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_29_MASK.VALUE=0x000007FF -DRIVER.CAN.VAR.CAN_1_TQ.VALUE=250.000 +DRIVER.CAN.VAR.CAN_1_TQ.VALUE=500.000 DRIVER.CAN.VAR.CAN_3_MESSAGE_63_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_55_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_47_RTR.VALUE=0x00000000 @@ -3956,7 +3956,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_11_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_3_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT_REFERENCE.VALUE=75 -DRIVER.CAN.VAR.CAN_1_PROPAGATION_DELAY.VALUE=700 +DRIVER.CAN.VAR.CAN_1_PROPAGATION_DELAY.VALUE=1050 DRIVER.CAN.VAR.CAN_1_MESSAGE_51_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_51_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_50_INT_ENA_REF.VALUE=0x00000000 @@ -3982,7 +3982,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_5_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_1_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_11_ID.VALUE=0x102 -DRIVER.CAN.VAR.CAN_1_NOMINAL_BIT_TIME.VALUE=16 +DRIVER.CAN.VAR.CAN_1_NOMINAL_BIT_TIME.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_61_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_53_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_45_INT_ENA_REF.VALUE=0x00000000 @@ -4031,7 +4031,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_46_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_38_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_21_BOOL_ENA.VALUE=0 -DRIVER.CAN.VAR.CAN_1_MESSAGE_13_BOOL_ENA.VALUE=0 +DRIVER.CAN.VAR.CAN_1_MESSAGE_13_BOOL_ENA.VALUE=1 DRIVER.CAN.VAR.CAN_3_MESSAGE_57_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_49_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_59_INT_LEVEL.VALUE=0x00000000 @@ -4086,7 +4086,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_28_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_28_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_8_INT_ENA_REF.VALUE=0x00000001 -DRIVER.CAN.VAR.CAN_1_SHIFT.VALUE=0 +DRIVER.CAN.VAR.CAN_1_SHIFT.VALUE=18 DRIVER.CAN.VAR.CAN_2_MESSAGE_64_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_56_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_50_MASK.VALUE=0x000007FF @@ -4104,7 +4104,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_14_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_9_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_BRPE.VALUE=0 -DRIVER.CAN.VAR.CAN_1_MASK.VALUE=0x1FFFFFFF +DRIVER.CAN.VAR.CAN_1_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_3_MESSAGE_61_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_53_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_45_INT_LEVEL.VALUE=0x00000000 @@ -4148,8 +4148,8 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_45_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_37_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_29_DLC.VALUE=8 -DRIVER.CAN.VAR.CAN_1_BRPE_FREQ.VALUE=4.000 -DRIVER.CAN.VAR.CAN_1_BRP_FREQ.VALUE=4.000 +DRIVER.CAN.VAR.CAN_1_BRPE_FREQ.VALUE=2.000 +DRIVER.CAN.VAR.CAN_1_BRP_FREQ.VALUE=2.000 DRIVER.CAN.VAR.CAN_3_MESSAGE_20_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_20_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_12_EOB.VALUE=0x00000000 @@ -4420,7 +4420,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_19_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_2_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_2_DIR.VALUE=0x20000000 -DRIVER.CAN.VAR.CAN_1_BRP.VALUE=25 +DRIVER.CAN.VAR.CAN_1_BRP.VALUE=51 DRIVER.CAN.VAR.CAN_3_MESSAGE_7_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_3_PROP_SEG.VALUE=3 DRIVER.CAN.VAR.CAN_2_MESSAGE_21_INT_ENA.VALUE=0x00000000 @@ -4441,7 +4441,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_26_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_18_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_2_ID.VALUE=0x2 -DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON_TR.VALUE=0 +DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON_TR.VALUE=1040000 DRIVER.CAN.VAR.CAN_3_MESSAGE_31_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_23_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_15_DLC.VALUE=8 @@ -4580,7 +4580,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_24_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_16_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_8_DLC.VALUE=8 -DRIVER.CAN.VAR.CAN_1_NOMINAL_AUTO_BUS_ON_TIME.VALUE=0.000 +DRIVER.CAN.VAR.CAN_1_NOMINAL_AUTO_BUS_ON_TIME.VALUE=10000000.000 DRIVER.CAN.VAR.CAN_2_SHIFT.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_64_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_64_DIR.VALUE=0x20000000 @@ -4706,7 +4706,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_6_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_57_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_49_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_PHASE_SEG.VALUE=6 +DRIVER.CAN.VAR.CAN_1_PHASE_SEG.VALUE=2 DRIVER.CAN.VAR.CAN_3_MESSAGE_30_ID.VALUE=30 DRIVER.CAN.VAR.CAN_3_MESSAGE_22_ID.VALUE=22 DRIVER.CAN.VAR.CAN_3_MESSAGE_14_ID.VALUE=14 @@ -4899,7 +4899,7 @@ DRIVER.CAN.VAR.CAN_2_AUTO_BUS_ON.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_30_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_22_INT_ENA_REF.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_14_INT_ENA_REF.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_14_INT_ENA_REF.VALUE=0x00000001 DRIVER.CAN.VAR.CAN_3_MESSAGE_50_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_42_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_40_INT_ENA.VALUE=0x00000000 @@ -4931,7 +4931,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_9_ID.VALUE=0x100 DRIVER.CAN.VAR.CAN_1_MESSAGE_5_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_59_DLC.VALUE=8 -DRIVER.CAN.VAR.CAN_1_SJW.VALUE=4 +DRIVER.CAN.VAR.CAN_1_SJW.VALUE=2 DRIVER.CAN.VAR.CAN_3_MESSAGE_50_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_50_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_42_EOB.VALUE=0x00000000 @@ -4963,7 +4963,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_37_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_29_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_9_MASK.VALUE=0x000007FF -DRIVER.CAN.VAR.CAN_1_IDENTIFIER_MODE.VALUE=0x40000000 +DRIVER.CAN.VAR.CAN_1_IDENTIFIER_MODE.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_41_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_33_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_25_INT_LEVEL.VALUE=0x00000000 @@ -4975,7 +4975,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_55_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_2_MESSAGE_47_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_2_MESSAGE_39_DLC.VALUE=8 -DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON_TIME.VALUE=0 +DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON_TIME.VALUE=10000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_6_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_6_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_30_INT_ENA_REF.VALUE=0x00000000 @@ -5019,7 +5019,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_39_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_30_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_22_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_14_INT_ENA.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_14_INT_ENA.VALUE=0x00000800 DRIVER.CAN.VAR.CAN_3_PORT_RX_PSL.VALUE=1 DRIVER.CAN.VAR.CAN_2_MESSAGE_50_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_42_RTR.VALUE=0x00000000 @@ -5214,7 +5214,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_8_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_10_EOB.VALUE=0x00000080 DRIVER.CAN.VAR.CAN_1_MESSAGE_10_DIR.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT.VALUE=62.500 +DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT.VALUE=75.000 DRIVER.CAN.VAR.CAN_2_MESSAGE_51_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_43_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_35_BOOL_ENA.VALUE=0 @@ -5331,7 +5331,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_7_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_2_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_21_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_13_INT_ENA.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_13_INT_ENA.VALUE=0x00000400 DRIVER.CAN.VAR.CAN_3_PORT_TX_DOUT.VALUE=1 DRIVER.CAN.VAR.CAN_3_MESSAGE_64_ID.VALUE=64 DRIVER.CAN.VAR.CAN_3_MESSAGE_56_ID.VALUE=56 @@ -5528,7 +5528,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_2_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_58_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_21_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_13_ENA.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_13_ENA.VALUE=0x80000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_6_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_2_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_21_ID.VALUE=21 @@ -5553,7 +5553,7 @@ DRIVER.ADC.VAR.ADC2_GROUP2_RAM_PARITY_ENA.VALUE=0 DRIVER.ADC.VAR.ADC1_GROUP1_PIN3_ENABLE.VALUE=0x00000008 DRIVER.ADC.VAR.ADC1_GROUP0_CHANNEL_TOTAL_TIME.VALUE=0.000000 -DRIVER.ADC.VAR.ADC1_GROUP1_FIFO_SIZE.VALUE=20 +DRIVER.ADC.VAR.ADC1_GROUP1_FIFO_SIZE.VALUE=16 DRIVER.ADC.VAR.ADC1_GROUP2_DISCHARGE_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_SAMPLE_PRESCALER.VALUE=0 DRIVER.ADC.VAR.ADC1_GROUP1_LENGTH.VALUE=20 @@ -5588,8 +5588,8 @@ DRIVER.ADC.VAR.ADC2_GROUP2_PIN5_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN8_ENABLE.VALUE=0x00000100 DRIVER.ADC.VAR.ADC1_GROUP1_ID_ENABLE.VALUE=0x00000020 -DRIVER.ADC.VAR.ADC1_GROUP1_EXTENDED_SAMPLE_TIME.VALUE=503.22 -DRIVER.ADC.VAR.ADC1_GROUP0_CONVERSION_TIME.VALUE=3.271 +DRIVER.ADC.VAR.ADC1_GROUP1_EXTENDED_SAMPLE_TIME.VALUE=500.00 +DRIVER.ADC.VAR.ADC1_GROUP0_CONVERSION_TIME.VALUE=3.250 DRIVER.ADC.VAR.ADC2_GROUP0_RESOLUTION.VALUE=12_BIT DRIVER.ADC.VAR.ADC1_GROUP1_PIN1_ENABLE.VALUE=0x00000002 DRIVER.ADC.VAR.ADC1_GROUP1_RESOLUTION.VALUE=12_BIT @@ -5638,11 +5638,11 @@ DRIVER.ADC.VAR.ADC2_GROUP0_SAMPLE_PRESCALER.VALUE=2 DRIVER.ADC.VAR.ADC1_GROUP0_DISCHARGE_PRESCALER.VALUE=0 DRIVER.ADC.VAR.ADC2_GROUP2_PIN3_ENABLE.VALUE=0x00000000 -DRIVER.ADC.VAR.ADC1_GROUP1_PIN6_ENABLE.VALUE=0x00000040 +DRIVER.ADC.VAR.ADC1_GROUP1_PIN6_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_RAMBASE.VALUE=0xFF3A0000 DRIVER.ADC.VAR.ADC2_GROUP0_BND.VALUE=8 DRIVER.ADC.VAR.ADC1_PORT_BIT0_DOUT.VALUE=0 -DRIVER.ADC.VAR.ADC1_GROUP1_SCAN_TIME.VALUE=919.340 +DRIVER.ADC.VAR.ADC1_GROUP1_SCAN_TIME.VALUE=721.154 DRIVER.ADC.VAR.ADC1_GROUP0_RESOLUTION.VALUE=12_BIT DRIVER.ADC.VAR.ADC2_GROUP2_FIFO_SIZE.VALUE=16 DRIVER.ADC.VAR.ADC2_GROUP1_PIN7_ENABLE.VALUE=0x00000000 @@ -5703,7 +5703,7 @@ DRIVER.ADC.VAR.ADC1_GROUP0_PIN15_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_BND.VALUE=10 DRIVER.ADC.VAR.ADC2_GROUP2_PIN13_ENABLE.VALUE=0x00000000 -DRIVER.ADC.VAR.ADC1_GROUP1_PIN19_ENABLE.VALUE=0x00080000 +DRIVER.ADC.VAR.ADC1_GROUP1_PIN19_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_PORT_BIT0_DOUT.VALUE=0 DRIVER.ADC.VAR.ADC2_CYCLE_TIME.VALUE=100.00 DRIVER.ADC.VAR.ADC1_GROUP1_HW_TRIGGER_SOURCE.VALUE=EVENT @@ -5726,7 +5726,7 @@ DRIVER.ADC.VAR.ADC1_PORT_BIT0_PDR.VALUE=0 DRIVER.ADC.VAR.ADC1_GROUP1_SAMPLE_TIME.VALUE=300.00 DRIVER.ADC.VAR.ADC1_GROUP1_PIN2_ENABLE.VALUE=0x00000004 -DRIVER.ADC.VAR.ADC1_GROUP1_CONVERSION_TIME.VALUE=3.271 +DRIVER.ADC.VAR.ADC1_GROUP1_CONVERSION_TIME.VALUE=3.250 DRIVER.ADC.VAR.ADC1_GROUP0_FIFO_SIZE.VALUE=0 DRIVER.ADC.VAR.ADC1_PORT_BIT0_PULL.VALUE=2 DRIVER.ADC.VAR.ADC1_GROUP0_LENGTH.VALUE=0 @@ -5739,8 +5739,8 @@ DRIVER.ADC.VAR.ADC1_GROUP0_PIN6_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP2_SCAN_TIME.VALUE=0.000 DRIVER.ADC.VAR.ADC2_GROUP1_HW_TRIGGER_SOURCE.VALUE=EVENT -DRIVER.ADC.VAR.ADC1_GROUP1_CHANNEL_TOTAL_TIME.VALUE=76.403740 -DRIVER.ADC.VAR.ADC1_GROUP0_EXTENDED_SAMPLE_TIME.VALUE=503.22 +DRIVER.ADC.VAR.ADC1_GROUP1_CHANNEL_TOTAL_TIME.VALUE=60.721154 +DRIVER.ADC.VAR.ADC1_GROUP0_EXTENDED_SAMPLE_TIME.VALUE=500.00 DRIVER.ADC.VAR.ADC1_GROUP0_HW_TRIGGER_SOURCE_ALT.VALUE=EVENT DRIVER.ADC.VAR.ADC2_GROUP1_PIN14_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_PORT_BIT0_PSL.VALUE=1 @@ -5765,14 +5765,14 @@ DRIVER.ADC.VAR.ADC1_CYCLE_TIME.VALUE=250 DRIVER.ADC.VAR.ADC2_GROUP0_DISCHARGE_PRESCALER.VALUE=0 DRIVER.ADC.VAR.ADC2_GROUP2_PIN4_ENABLE.VALUE=0x00000000 -DRIVER.ADC.VAR.ADC1_GROUP1_PIN7_ENABLE.VALUE=0x00000080 +DRIVER.ADC.VAR.ADC1_GROUP1_PIN7_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_DISCHARGE_TIME.VALUE=0.00 DRIVER.ADC.VAR.ADC1_GROUP0_HW_TRIGGER_SOURCE.VALUE=EVENT DRIVER.ADC.VAR.ADC1_GROUP1_PIN0_ENABLE.VALUE=0x00000001 DRIVER.ADC.VAR.ADC1_GROUP0_ID_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP2_DISCHARGE_TIME.VALUE=0.00 DRIVER.ADC.VAR.ADC1_GROUP2_SCAN_TIME.VALUE=0.000 -DRIVER.ADC.VAR.ADC1_GROUP1_PINS.VALUE=20 +DRIVER.ADC.VAR.ADC1_GROUP1_PINS.VALUE=16 DRIVER.ADC.VAR.ADC1_GROUP1_TRIGGER_EDGE_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_ALT_TRIG_COMP.VALUE=1 DRIVER.ADC.VAR.ADC1_GROUP0_CONTINUOUS_ENABLE.VALUE=0x00000000 @@ -5791,7 +5791,7 @@ DRIVER.ADC.VAR.ADC1_GROUP2_PIN1_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN11_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP0_SCAN_TIME.VALUE=0.000 -DRIVER.ADC.VAR.ADC1_GROUP1_PIN23_ENABLE.VALUE=0x00800000 +DRIVER.ADC.VAR.ADC1_GROUP1_PIN23_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN15_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP0_HW_TRIGGER_SOURCE.VALUE=EVENT DRIVER.ADC.VAR.ADC2_GROUP0_PIN5_ENABLE.VALUE=0x00000000 Index: firmware/include/can.h =================================================================== diff -u -r73d8423edc56daed591bc0b3f7baee5540aea423 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/include/can.h (.../can.h) (revision 73d8423edc56daed591bc0b3f7baee5540aea423) +++ firmware/include/can.h (.../can.h) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -630,16 +630,16 @@ /* Configuration registers initial value for CAN1*/ -#define CAN1_CTL_CONFIGVALUE ((uint32)0x00000000U \ +#define CAN1_CTL_CONFIGVALUE ((uint32)0x00000200U \ | (uint32)0x00000000U \ - | (uint32)((uint32)0x00000005U << 10U) | 0x00020002U) + | (uint32)((uint32)0x0000000AU << 10U) | 0x00020002U) #define CAN1_ES_CONFIGVALUE 0x00000007U #define CAN1_BTR_CONFIGVALUE ((uint32)((uint32)0U << 16U) \ - | (uint32)((uint32)(6U - 1U) << 12U) \ - | (uint32)((uint32)((3U + 6U) - 1U) << 8U) \ - | (uint32)((uint32)(4U - 1U) << 6U) | (uint32)25U) + | (uint32)((uint32)(2U - 1U) << 12U) \ + | (uint32)((uint32)((3U + 2U) - 1U) << 8U) \ + | (uint32)((uint32)(2U - 1U) << 6U) | (uint32)51U) #define CAN1_TEST_CONFIGVALUE 0x00000080U -#define CAN1_ABOTR_CONFIGVALUE ((uint32)(0U)) +#define CAN1_ABOTR_CONFIGVALUE ((uint32)(1040000U)) #define CAN1_INTMUX0_CONFIGVALUE ((uint32)0x00000000U \ | (uint32)0x00000002U \ | (uint32)0x00000004U \ Index: firmware/source/adc.c =================================================================== diff -u -r73d8423edc56daed591bc0b3f7baee5540aea423 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/source/adc.c (.../adc.c) (revision 73d8423edc56daed591bc0b3f7baee5540aea423) +++ firmware/source/adc.c (.../adc.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -238,8 +238,8 @@ 0x00000008U | 0x00000010U | 0x00000020U | - 0x00000040U | - 0x00000080U | + 0x00000000U | + 0x00000000U | 0x00000100U | 0x00000000U | 0x00000400U | @@ -251,11 +251,11 @@ 0x00010000U | 0x00020000U | 0x00040000U | - 0x00080000U | 0x00000000U | 0x00000000U | + 0x00000000U | 0x00400000U | - 0x00800000U, + 0x00000000U, 0x00000000U | 0x00000000U | 0x00000000U | @@ -334,7 +334,7 @@ static const uint32 s_adcFiFoSize[2U][3U] = { {0U, - 20U, + 16U, 32U}, {16U, 16U, Index: firmware/source/can.c =================================================================== diff -u -r73d8423edc56daed591bc0b3f7baee5540aea423 -r56100135135bb715d316b5fd002a4a4951b9334a --- firmware/source/can.c (.../can.c) (revision 73d8423edc56daed591bc0b3f7baee5540aea423) +++ firmware/source/can.c (.../can.c) (revision 56100135135bb715d316b5fd002a4a4951b9334a) @@ -104,9 +104,9 @@ * - Disable status interrupts * - Enter initialization mode */ - canREG1->CTL = (uint32)0x00000000U + canREG1->CTL = (uint32)0x00000200U | (uint32)0x00000000U - | (uint32)((uint32)0x00000005U << 10U) + | (uint32)((uint32)0x0000000AU << 10U) | (uint32)0x00020043U; /** - Clear all pending error flags and reset current status */ @@ -180,7 +180,7 @@ | (uint32)0x00000000U; /** - Setup auto bus on timer period */ - canREG1->ABOTR = (uint32)0U; + canREG1->ABOTR = (uint32)1040000U; /** - Initialize message 1 * - Wait until IF1 is ready for use @@ -196,8 +196,8 @@ } /* Wait */ - canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x1U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x1U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000800U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF1CMD = (uint8) 0xF8U; canREG1->IF1NO = 1U; @@ -215,8 +215,8 @@ { } /* Wait */ - canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x2U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x2U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF2CMD = (uint8) 0xF8U; canREG1->IF2NO = 2U; @@ -234,8 +234,8 @@ { } /* Wait */ - canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x4U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x4U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF1CMD = (uint8) 0xF8U; canREG1->IF1NO = 3U; @@ -253,8 +253,8 @@ { } /* Wait */ - canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x8U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x8U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF2CMD = (uint8) 0xF8U; canREG1->IF2NO = 4U; @@ -272,8 +272,8 @@ { } /* Wait */ - canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x10U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x10U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000800U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF1CMD = (uint8) 0xF8U; canREG1->IF1NO = 5U; @@ -291,8 +291,8 @@ { } /* Wait */ - canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x11U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x11U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF2CMD = (uint8) 0xF8U; canREG1->IF2NO = 6U; @@ -310,8 +310,8 @@ { } /* Wait */ - canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x40U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x40U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000800U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF1CMD = (uint8) 0xF8U; canREG1->IF1NO = 7U; @@ -329,8 +329,8 @@ { } /* Wait */ - canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x41U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x41U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF2CMD = (uint8) 0xF8U; canREG1->IF2NO = 8U; @@ -348,8 +348,8 @@ { } /* Wait */ - canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x100U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x100U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000800U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF1CMD = (uint8) 0xF8U; canREG1->IF1NO = 9U; @@ -367,8 +367,8 @@ { } /* Wait */ - canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x101U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x101U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF2CMD = (uint8) 0xF8U; canREG1->IF2NO = 10U; @@ -386,8 +386,8 @@ { } /* Wait */ - canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x102U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x102U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF1CMD = (uint8) 0xF8U; canREG1->IF1NO = 11U; @@ -405,12 +405,50 @@ { } /* Wait */ - canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x1FFFFFFFU) << (uint32)0U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x103U & (uint32)0x1FFFFFFFU) << (uint32)0U); + canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x103U & (uint32)0x000007FFU) << (uint32)18U); canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF2CMD = (uint8) 0xF8U; canREG1->IF2NO = 12U; + /** - Initialize message 13 + * - Wait until IF1 is ready for use + * - Set message mask + * - Set message control word + * - Set message arbitration + * - Set IF1 control byte + * - Set IF1 message number + */ + /*SAFETYMCUSW 28 D MR:NA "Potentially infinite loop found - Hardware Status check for execution sequence" */ + while ((canREG1->IF1STAT & 0x80U) ==0x80U) + { + } /* Wait */ + + canREG1->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x400U & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF1MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; + canREG1->IF1CMD = (uint8) 0xF8U; + canREG1->IF1NO = 13U; + + /** - Initialize message 14 + * - Wait until IF2 is ready for use + * - Set message mask + * - Set message control word + * - Set message arbitration + * - Set IF2 control byte + * - Set IF2 message number + */ + /*SAFETYMCUSW 28 D MR:NA "Potentially infinite loop found - Hardware Status check for execution sequence" */ + while ((canREG1->IF2STAT & 0x80U) ==0x80U) + { + } /* Wait */ + + canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x401U & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000800U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; + canREG1->IF2CMD = (uint8) 0xF8U; + canREG1->IF2NO = 14U; + /** - Setup IF1 for data transmission * - Wait until IF1 is ready for use * - Set IF1 control byte @@ -439,10 +477,10 @@ * - Setup baud rate prescaler */ canREG1->BTR = (uint32)((uint32)0U << 16U) | - (uint32)((uint32)(6U - 1U) << 12U) | - (uint32)((uint32)((3U + 6U) - 1U) << 8U) | - (uint32)((uint32)(4U - 1U) << 6U) | - (uint32)25U; + (uint32)((uint32)(2U - 1U) << 12U) | + (uint32)((uint32)((3U + 2U) - 1U) << 8U) | + (uint32)((uint32)(2U - 1U) << 6U) | + (uint32)51U; /** - CAN1 Port output values */