Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -rc9df9f42e294adae397a57bf83c2a67fa831b164 -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision c9df9f42e294adae397a57bf83c2a67fa831b164) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -49,10 +49,11 @@ #define MAX_BLOOD_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89% #define MIN_BLOOD_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10% +#define BP_CONTROL_INTERVAL_SEC 5 ///< Blood pump control interval (in seconds). /// Interval (ms/task time) at which the blood pump is controlled. -static const U32 BP_CONTROL_INTERVAL = ( 10000 / TASK_GENERAL_INTERVAL ); -#define BP_P_COEFFICIENT 0.00035 ///< P term for blood pump control -#define BP_I_COEFFICIENT 0.00035 ///< I term for blood pump control +static const U32 BP_CONTROL_INTERVAL = ( BP_CONTROL_INTERVAL_SEC * MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define BP_P_COEFFICIENT 0.0001 ///< P term for blood pump control +#define BP_I_COEFFICIENT 0.001 ///< I term for blood pump control #define BP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. #define BP_HOME_TIMEOUT_MS 10000 ///< Maximum time allowed for homing to complete (in ms). @@ -107,7 +108,7 @@ #define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * 10 ) /// Blood flow sensor signal strength low alarm persistence. -#define FLOW_SIG_STRGTH_ALARM_PERSIST ( 5 * MS_PER_SECOND ) +#define FLOW_SIG_STRGTH_ALARM_PERSIST ( BP_CONTROL_INTERVAL_SEC * MS_PER_SECOND ) #define MIN_FLOW_SIG_STRENGTH 0.9 ///< Minimum flow sensor signal strength (90%). /// Blood flow fast read timeout alarm persistence. Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r7a754fc23436a42e61e60f66adf1cd0cc8b32ad6 -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 7a754fc23436a42e61e60f66adf1cd0cc8b32ad6) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -42,17 +42,18 @@ // ********** private definitions ********** /// Interval (ms/task time) at which the dialIn flow data is published on the CAN bus. -#define DIAL_IN_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) +#define DIAL_IN_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) -#define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.0133 ///< Max duty cycle change when ramping up ~ 200 mL/min/s. -#define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.02 ///< Max duty cycle change when ramping down ~ 300 mL/min/s. -#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. -#define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. +#define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.0133 ///< Max duty cycle change when ramping up ~ 200 mL/min/s. +#define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.02 ///< Max duty cycle change when ramping down ~ 300 mL/min/s. +#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. +#define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. +#define DIP_CONTROL_INTERVAL_SEC 5 ///< Dialysate inlet pump control interval (in seconds). /// Interval (ms/task time) at which the dialIn pump is controlled. -static const U32 DIP_CONTROL_INTERVAL = ( 10000 / TASK_GENERAL_INTERVAL ); -#define DIP_P_COEFFICIENT 0.00035 ///< P term for dialIn pump control. -#define DIP_I_COEFFICIENT 0.00035 ///< I term for dialIn pump control. +static const U32 DIP_CONTROL_INTERVAL = ( DIP_CONTROL_INTERVAL_SEC * MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define DIP_P_COEFFICIENT 0.0001 ///< P term for dialIn pump control. +#define DIP_I_COEFFICIENT 0.001 ///< I term for dialIn pump control. #define DIP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. #define DIP_HOME_TIMEOUT_MS 10000 ///< Maximum time allowed for homing to complete (in ms). @@ -106,7 +107,7 @@ #define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)DIAL_IN_PUMP_ADC_ZERO ) /// Measured dialIn flow is filtered w/ moving average. -#define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * 10 ) +#define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * DIP_CONTROL_INTERVAL_SEC ) /// Dialysate flow sensor signal strength low alarm persistence. #define FLOW_SIG_STRGTH_ALARM_PERSIST ( 5 * MS_PER_SECOND ) @@ -884,6 +885,19 @@ } return result; +} + +/*********************************************************************//** + * @brief + * The getDialInPumpPWMDutyCyclePct function gets the current dialIn pump + * PWM duty cycle percentage. + * @details Inputs: dialInPumpPWMDutyCyclePctSet + * @details Outputs: none + * @return the current dialIn pump PWM duty cycle percentage (0..1). + *************************************************************************/ +F32 getDialInPumpPWMDutyCyclePct( void ) +{ + return dialInPumpPWMDutyCyclePctSet; } /*********************************************************************//** Index: firmware/App/Controllers/DialInFlow.h =================================================================== diff -u -r933a18d740285e70be9d00696ed0f5a5381bc8e4 -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 933a18d740285e70be9d00696ed0f5a5381bc8e4) +++ firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -69,6 +69,7 @@ F32 getMeasuredDialInPumpSpeed( void ); F32 getMeasuredDialInPumpMCSpeed( void ); F32 getMeasuredDialInPumpMCCurrent( void ); +F32 getDialInPumpPWMDutyCyclePct( void ); BOOL setDialInFlowCalibration( F32 gain, F32 offset ); void getDialInFlowCalibration( F32 *gain, F32 *offset ); Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r39dd0b7734331c784b8410f2bbd481e0f792892e -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 39dd0b7734331c784b8410f2bbd481e0f792892e) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -42,6 +42,8 @@ /// Delay (in task intervals) after POST completes. #define POST_COMPLETED_DELAY ( 2 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +/// Maximum wait time for UI to send its final POST result. +#define POST_UI_MAX_WAIT_TIME ( 2 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) // ********** private data ********** @@ -52,13 +54,17 @@ static BOOL uiPOSTPassed; ///< Final result for UI POST tests (TRUE = passed, FALSE = failed). static BOOL dgPOSTPassed; ///< Final result for DG POST tests (TRUE = passed, FALSE = failed). +static BOOL uiPOSTResultReceived; ///< Have we received a final POST result from the UI? +static BOOL dgPOSTResultReceived; ///< Have we received a final POST result from the DG? +static U32 waitForUIPostTimerCtr; ///< Timer counter to limit wait for UI final POST result. static U32 postCompleteDelayTimerCtr; ///< Timer counter for 2 second delay after POST completes and before transitioning to Standbymode. // ********** private function prototypes ********** static HD_POST_STATE_T handlePOSTStatus( SELF_TEST_STATUS_T testStatus ); static SELF_TEST_STATUS_T execFWCompatibilityTest( void ); +static SELF_TEST_STATUS_T execUITest( void ); /*********************************************************************//** * @brief @@ -75,6 +81,9 @@ tempPOSTPassed = TRUE; uiPOSTPassed = FALSE; dgPOSTPassed = FALSE; + uiPOSTResultReceived = FALSE; + dgPOSTResultReceived = FALSE; + waitForUIPostTimerCtr = 0; postCompleteDelayTimerCtr = 0; } @@ -115,7 +124,7 @@ switch ( postState ) { case POST_STATE_START: - postState = POST_STATE_FW_COMPATIBILITY; + postState = POST_STATE_FW_INTEGRITY; #ifdef SKIP_POST postState = POST_STATE_COMPLETED; #endif @@ -125,11 +134,6 @@ #endif break; - case POST_STATE_FW_COMPATIBILITY: - testStatus = execFWCompatibilityTest(); - postState = handlePOSTStatus( testStatus ); - break; - case POST_STATE_FW_INTEGRITY: postState = POST_STATE_WATCHDOG; break; @@ -193,11 +197,20 @@ postState = handlePOSTStatus( testStatus ); break; - // Should be last POST (and last POST test must be a test that completes in a single call) + case POST_STATE_UI_POST: + testStatus = execUITest(); + postState = handlePOSTStatus( testStatus ); + break; + + case POST_STATE_FW_COMPATIBILITY: + testStatus = execFWCompatibilityTest(); + postState = handlePOSTStatus( testStatus ); + break; + + // Should be last POST (and last POST test must be a test that completes in a single call) case POST_STATE_FPGA: testStatus = execFPGATest(); handlePOSTStatus( testStatus ); // Ignoring return value because last test - if ( TRUE == tempPOSTPassed ) { postState = POST_STATE_COMPLETED; @@ -208,8 +221,6 @@ } break; - // TODO - add POST test requiring all DG and UI POST tests to pass - case POST_STATE_COMPLETED: // Set overall HD POST status to "passed" postPassed = TRUE; @@ -261,6 +272,7 @@ void signalUIPOSTFinalResult( BOOL passed ) { uiPOSTPassed = passed; + uiPOSTResultReceived = TRUE; } /*********************************************************************//** @@ -275,6 +287,7 @@ void signalDGPOSTFinalResult( BOOL passed ) { dgPOSTPassed = passed; + dgPOSTResultReceived = TRUE; } /*********************************************************************//** @@ -353,9 +366,44 @@ { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; - // TODO - implement + // TODO - implement (need UI to include its version/compatibility info in its request for f/w versions so we can check compatibility) + //SW_COMPATIBILITY_REV return result; } +/*********************************************************************//** + * @brief + * The execUITest function executes the UI POST passed test. + * @details Inputs: uiPOSTResultReceived, uiPOSTPassed, waitForUIPostTimerCtr + * @details Outputs: waitForUIPostTimerCtr + * @return in progress, passed, or failed + *************************************************************************/ +static SELF_TEST_STATUS_T execUITest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; + + // UI should have sent POST results before we start this test + if ( TRUE == uiPOSTResultReceived ) + { + if ( TRUE == uiPOSTPassed ) + { + result = SELF_TEST_STATUS_PASSED; + } + else + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_UI_POST_FAILED, 0 ) + result = SELF_TEST_STATUS_FAILED; + } + } + // If UI had not already sent POST results before we started, allow finite period for UI to send. + else if ( ++waitForUIPostTimerCtr > POST_UI_MAX_WAIT_TIME ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_UI_POST_FAILED, 1 ) + result = SELF_TEST_STATUS_FAILED; + } + + return result; +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r1240b612f790f931825aba86ec37f37eccce9336 -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1240b612f790f931825aba86ec37f37eccce9336) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -3463,9 +3463,11 @@ void handleFWVersionRequest( MESSAGE_T *message ) { MESSAGE_T msg; - HD_VERSIONS_T payload; + HD_VERSIONS_T payload; // TODO - add compatibility data to response U08 *payloadPtr = msg.payload; + // TODO - grab UI version data when UI includes it in this message + // Populate payload payload.major = (U08)HD_VERSION_MAJOR; payload.minor = (U08)HD_VERSION_MINOR; Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r9f2e4e5933d2e418b75f91e3db5df69c71878d43 -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 9f2e4e5933d2e418b75f91e3db5df69c71878d43) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -89,7 +89,7 @@ // Control dialysate inlet pump execDialInFlowController(); - // Control dialysate outlet pump + // Control dialysate outlet pump (keep after call to BP and DPi controllers) execDialOutFlowController(); #endif Index: firmware/HD.dil =================================================================== diff -u -r172b320a1007769c7452fe3f1cc7ac85b016f89a -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/HD.dil (.../HD.dil) (revision 172b320a1007769c7452fe3f1cc7ac85b016f89a) +++ firmware/HD.dil (.../HD.dil) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -1,4 +1,4 @@ -# RM46L852PGE 06/29/21 11:26:20 +# RM46L852PGE 07/01/21 16:54:15 # ARCH=RM46L852PGE # @@ -1354,7 +1354,7 @@ DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL37_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL29_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL58_INT_LEVEL.VALUE=0 -DRIVER.ESM.VAR.ESM_LOW_TIME.VALUE=158.552 +DRIVER.ESM.VAR.ESM_LOW_TIME.VALUE=157.538 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL30_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL22_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL14_ENABLE.VALUE=0 @@ -1390,7 +1390,7 @@ DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL12_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL56_INT_LEVEL.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL48_INT_LEVEL.VALUE=0 -DRIVER.ESM.VAR.ESM_VCLK_FREQ.VALUE=103.335 +DRIVER.ESM.VAR.ESM_VCLK_FREQ.VALUE=104 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL30_INT_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL22_INT_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL14_INT_ENABLE.VALUE=0 @@ -3522,7 +3522,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_11_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_6_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_4_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_PROP_SEG.VALUE=3 +DRIVER.CAN.VAR.CAN_1_PROP_SEG.VALUE=5 DRIVER.CAN.VAR.CAN_3_MESSAGE_1_ID.VALUE=1 DRIVER.CAN.VAR.CAN_2_MESSAGE_64_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_56_INT_LEVEL.VALUE=0x00000000 @@ -3955,8 +3955,8 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_4_INT_LEVEL.VALUE=0x00000010 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=1400 +DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT_REFERENCE.VALUE=87 +DRIVER.CAN.VAR.CAN_1_PROPAGATION_DELAY.VALUE=2100 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 @@ -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=2 +DRIVER.CAN.VAR.CAN_1_PHASE_SEG.VALUE=1 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 @@ -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=2 +DRIVER.CAN.VAR.CAN_1_SJW.VALUE=1 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 @@ -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=75.000 +DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT.VALUE=87.500 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 @@ -7090,7 +7090,7 @@ DRIVER.DCC.VAR.DCC1_VALID0_SEED.VALUE=792 DRIVER.DCC.VAR.DCC1_BASE.VALUE=0xFFFFEC00 DRIVER.DCC.VAR.DCC2_COUNT1_SEED.VALUE=0 -DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE1_FREQ.VALUE=206.67 +DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE1_FREQ.VALUE=208.00 DRIVER.DCC.VAR.DCC1_CLOCK_DRIFT.VALUE=1.0 DRIVER.DCC.VAR.DCC1_ENABLE.VALUE=0xA DRIVER.DCC.VAR.DCC1_ENABLE_SINGLESHOT_MODE.VALUE=0x5 @@ -7104,7 +7104,7 @@ DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE0.VALUE=OSCIN DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE1.VALUE=PLL1 DRIVER.DCC.VAR.CLKT_TCK_FREQ.VALUE=12.0 -DRIVER.DCC.VAR.DCC1_COUNT1_SEED.VALUE=511508 +DRIVER.DCC.VAR.DCC1_COUNT1_SEED.VALUE=514800 DRIVER.PINMUX.VAR.DMA_EIDXS_28.VALUE=0 DRIVER.PINMUX.VAR.DMA_FIDXD_20.VALUE=0 DRIVER.PINMUX.VAR.DMA_FIDXD_12.VALUE=0 Index: firmware/include/can.h =================================================================== diff -u -r172b320a1007769c7452fe3f1cc7ac85b016f89a -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/include/can.h (.../can.h) (revision 172b320a1007769c7452fe3f1cc7ac85b016f89a) +++ firmware/include/can.h (.../can.h) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -635,9 +635,9 @@ | (uint32)((uint32)0x0000000AU << 10U) | 0x00020002U) #define CAN1_ES_CONFIGVALUE 0x00000007U #define CAN1_BTR_CONFIGVALUE ((uint32)((uint32)0U << 16U) \ - | (uint32)((uint32)(2U - 1U) << 12U) \ - | (uint32)((uint32)((3U + 2U) - 1U) << 8U) \ - | (uint32)((uint32)(2U - 1U) << 6U) | (uint32)51U) + | (uint32)((uint32)(1U - 1U) << 12U) \ + | (uint32)((uint32)((5U + 1U) - 1U) << 8U) \ + | (uint32)((uint32)(1U - 1U) << 6U) | (uint32)51U) #define CAN1_TEST_CONFIGVALUE 0x00000080U #define CAN1_ABOTR_CONFIGVALUE ((uint32)(1040000U)) #define CAN1_INTMUX0_CONFIGVALUE ((uint32)0x00000000U \ Index: firmware/source/can.c =================================================================== diff -u -r172b320a1007769c7452fe3f1cc7ac85b016f89a -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f --- firmware/source/can.c (.../can.c) (revision 172b320a1007769c7452fe3f1cc7ac85b016f89a) +++ firmware/source/can.c (.../can.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) @@ -439,9 +439,9 @@ * - Setup baud rate prescaler */ canREG1->BTR = (uint32)((uint32)0U << 16U) | - (uint32)((uint32)(2U - 1U) << 12U) | - (uint32)((uint32)((3U + 2U) - 1U) << 8U) | - (uint32)((uint32)(2U - 1U) << 6U) | + (uint32)((uint32)(1U - 1U) << 12U) | + (uint32)((uint32)((5U + 1U) - 1U) << 8U) | + (uint32)((uint32)(1U - 1U) << 6U) | (uint32)51U;