From 3020f5caf0b09fcaf85b3b3fa84fdf688ba22cc0 Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Thu, 9 Nov 2017 19:51:32 +0100 Subject: K20: can and spi fixes Signed-off-by: Dominik Sliwa --- .settings/language.settings.xml | 4 +- .settings/org.eclipse.cdt.core.prefs | 163 +++++++++ .settings/org.eclipse.cdt.ui.prefs | 3 + board/board.h | 8 +- board/clock_config.c | 140 +++++++- board/pin_mux.c | 4 +- drivers/fsl_dspi.c | 9 + drivers/fsl_flexcan.c | 13 +- drivers/fsl_flexcan.h | 2 + source/FreeRTOSConfig.h | 2 +- source/adc_task.c | 6 +- source/can_task.c | 639 ++++++++++++++++++++++++++++------- source/can_task.h | 9 +- source/com_task.c | 88 +++-- source/com_task.h | 23 +- source/gpio_ext.c | 14 +- source/gpio_ext.h | 4 +- source/main.c | 19 +- 18 files changed, 961 insertions(+), 189 deletions(-) create mode 100644 .settings/org.eclipse.cdt.core.prefs create mode 100644 .settings/org.eclipse.cdt.ui.prefs diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 98107b2..d48dd4b 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..6c84590 --- /dev/null +++ b/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,163 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.cdt.core.formatter.alignment_for_assignment=16 +org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 +org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.cdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18 +org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0 +org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 +org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 +org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 +org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.cdt.core.formatter.alignment_for_member_access=0 +org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16 +org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1 +org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true +org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true +org.eclipse.cdt.core.formatter.compact_else_if=true +org.eclipse.cdt.core.formatter.continuation_indentation=2 +org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false +org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0 +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=true +org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false +org.eclipse.cdt.core.formatter.indent_empty_lines=false +org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.cdt.core.formatter.indentation.size=4 +org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.join_wrapped_lines=true +org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.cdt.core.formatter.lineSplit=80 +org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.cdt.core.formatter.tabulation.char=tab +org.eclipse.cdt.core.formatter.tabulation.size=8 +org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false diff --git a/.settings/org.eclipse.cdt.ui.prefs b/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 0000000..e4bfcf8 --- /dev/null +++ b/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +formatter_profile=_Linux Kernel +formatter_settings_version=1 diff --git a/board/board.h b/board/board.h index 00d185d..49e8767 100644 --- a/board/board.h +++ b/board/board.h @@ -42,11 +42,11 @@ #define BOARD_USE_UART #define BOARD_DEBUG_UART_TYPE DEBUG_CONSOLE_DEVICE_TYPE_UART -#define BOARD_DEBUG_UART_BASEADDR (uint32_t) UART3 +#define BOARD_DEBUG_UART_BASEADDR (uint32_t) UART1 #define BOARD_DEBUG_UART_CLKSRC kCLOCK_BusClk -#define BOARD_DEBUG_UART_CLK_FREQ CLOCK_GetBusClkFreq() -#define BOARD_UART_IRQ UART3_RX_TX_IRQn -#define BOARD_UART_IRQ_HANDLER UART3_RX_TX_IRQHandler +#define BOARD_DEBUG_UART_CLK_FREQ CLOCK_GetPlatClkFreq() +#define BOARD_UART_IRQ UART1_RX_TX_IRQn +#define BOARD_UART_IRQ_HANDLER UART1_RX_TX_IRQHandler #define BOARD_USES_ADC diff --git a/board/clock_config.c b/board/clock_config.c index 16626ba..16bfe39 100644 --- a/board/clock_config.c +++ b/board/clock_config.c @@ -48,6 +48,136 @@ * Code ******************************************************************************/ +#define MCG_IRCLK_DISABLE 0U /*!< MCGIRCLK disabled */ +#define MCG_PLL_DISABLE 0U /*!< MCGPLLCLK disabled */ +#define OSC_CAP0P 0U /*!< Oscillator 0pF capacitor load */ +#define OSC_ER_CLK_DISABLE 0U /*!< Disable external reference clock */ +#define SIM_OSC32KSEL_OSC32KCLK_CLK 0U /*!< OSC32KSEL select: OSC32KCLK clock */ +#define SIM_PLLFLLSEL_MCGFLLCLK_CLK 0U /*!< PLLFLL select: MCGFLLCLK clock */ +#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 100000000U /*!< Core clock frequency: 100000000Hz */ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + * Code + ******************************************************************************/ +/*FUNCTION********************************************************************** + * + * Function Name : CLOCK_CONFIG_SetFllExtRefDiv + * Description : Configure FLL external reference divider (FRDIV). + * Param frdiv : The value to set FRDIV. + * + *END**************************************************************************/ +static void CLOCK_CONFIG_SetFllExtRefDiv(uint8_t frdiv) +{ + MCG->C1 = ((MCG->C1 & ~MCG_C1_FRDIV_MASK) | MCG_C1_FRDIV(frdiv)); +} + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockRUN(); +} + +/******************************************************************************* + ********************** Configuration BOARD_BootClockRUN *********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockRUN +called_from_default_init: true +outputs: +- {id: Bus_clock.outFreq, value: 50 MHz} +- {id: Core_clock.outFreq, value: 100 MHz, locked: true, accuracy: '0.001'} +- {id: Flash_clock.outFreq, value: 25 MHz} +- {id: FlexBus_clock.outFreq, value: 50 MHz} +- {id: LPO_clock.outFreq, value: 1 kHz} +- {id: MCGFFCLK.outFreq, value: 250 kHz} +- {id: System_clock.outFreq, value: 100 MHz} +settings: +- {id: MCGMode, value: PEE} +- {id: MCG.FRDIV.scale, value: '32'} +- {id: MCG.IREFS.sel, value: MCG.FRDIV} +- {id: MCG.PLLS.sel, value: MCG.PLL} +- {id: MCG.PRDIV.scale, value: '2'} +- {id: MCG.VDIV.scale, value: '25'} +- {id: MCG_C2_OSC_MODE_CFG, value: ModeOscLowPower} +- {id: MCG_C2_RANGE0_CFG, value: Very_high} +- {id: MCG_C2_RANGE0_FRDIV_CFG, value: Very_high} +- {id: SIM.OUTDIV2.scale, value: '2'} +- {id: SIM.OUTDIV3.scale, value: '2'} +- {id: SIM.OUTDIV4.scale, value: '4'} +sources: +- {id: OSC.OSC.outFreq, value: 8 MHz, enabled: true} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockRUN configuration + ******************************************************************************/ +const mcg_config_t mcgConfig_BOARD_BootClockRUN = + { + .mcgMode = kMCG_ModePEE, /* PEE - PLL Engaged External */ + .irclkEnableMode = MCG_IRCLK_DISABLE, /* MCGIRCLK disabled */ + .ircs = kMCG_IrcSlow, /* Slow internal reference clock selected */ + .fcrdiv = 0x1U, /* Fast IRC divider: divided by 2 */ + .frdiv = 0x0U, /* FLL reference clock divider: divided by 32 */ + .drs = kMCG_DrsLow, /* Low frequency range */ + .dmx32 = kMCG_Dmx32Default, /* DCO has a default range of 25% */ + .oscsel = kMCG_OscselOsc, /* Selects System Oscillator (OSCCLK) */ + .pll0Config = + { + .enableMode = MCG_PLL_DISABLE, /* MCGPLLCLK disabled */ + .prdiv = 0x1U, /* PLL Reference divider: divided by 2 */ + .vdiv = 0x1U, /* VCO divider: multiplied by 25 */ + }, + }; +const sim_clock_config_t simConfig_BOARD_BootClockRUN = + { + .pllFllSel = SIM_PLLFLLSEL_MCGFLLCLK_CLK, /* PLLFLL select: MCGFLLCLK clock */ + .er32kSrc = SIM_OSC32KSEL_OSC32KCLK_CLK, /* OSC32KSEL select: OSC32KCLK clock */ + .clkdiv1 = 0x1130000U, /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV2: /2, OUTDIV3: /2, OUTDIV4: /4 */ + }; +const osc_config_t oscConfig_BOARD_BootClockRUN = + { + .freq = 8000000U, /* Oscillator frequency: 8000000Hz */ + .capLoad = (OSC_CAP0P), /* Oscillator capacity load: 0pF */ + .workMode = kOSC_ModeOscLowPower, /* Oscillator low power */ + .oscerConfig = + { + .enableMode = OSC_ER_CLK_DISABLE, /* Disable external reference clock */ + } + }; + + +/******************************************************************************* + * Code for BOARD_BootClockRUN configuration + ******************************************************************************/ +void BOARD_BootClockRUN(void) +{ + /* Set the system clock dividers in SIM to safe value. */ + CLOCK_SetSimSafeDivs(); + /* Initializes OSC0 according to board configuration. */ + CLOCK_InitOsc0(&oscConfig_BOARD_BootClockRUN); + CLOCK_SetXtal0Freq(oscConfig_BOARD_BootClockRUN.freq); + /* Configure FLL external reference divider (FRDIV). */ + CLOCK_CONFIG_SetFllExtRefDiv(mcgConfig_BOARD_BootClockRUN.frdiv); + /* Set MCG to PEE mode. */ + CLOCK_BootToPeeMode(mcgConfig_BOARD_BootClockRUN.oscsel, + kMCG_PllClkSelPll0, + &mcgConfig_BOARD_BootClockRUN.pll0Config); + /* Set the clock configuration in SIM module. */ + CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN); + /* Set SystemCoreClock variable. */ + SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK; +} + +#if 0 void BOARD_InitOsc0(void) { const osc_config_t oscConfig = {.freq = BOARD_XTAL0_CLK_HZ, @@ -71,8 +201,8 @@ void BOARD_InitOsc0(void) void BOARD_BootClockRUN(void) { /* - * Core clock: 96MHz - * Bus clock: 48MHz + * Core clock: 100MHz + * Bus clock: 50MHz */ mcg_pll_config_t pll0Config = { .enableMode = 0U, .prdiv = 0x3U, .vdiv = 0x18U, @@ -86,13 +216,13 @@ void BOARD_BootClockRUN(void) CLOCK_SetSimSafeDivs(); BOARD_InitOsc0(); - CLOCK_CalcPllDiv(BOARD_XTAL0_CLK_HZ, 96000000U, &pll0Config.prdiv, &pll0Config.vdiv); + CLOCK_CalcPllDiv(BOARD_XTAL0_CLK_HZ, 100000000U, &pll0Config.prdiv, &pll0Config.vdiv); CLOCK_BootToPeeMode(kMCG_OscselOsc, kMCG_PllClkSelPll0, &pll0Config); CLOCK_SetInternalRefClkConfig(kMCG_IrclkEnable, kMCG_IrcSlow, 0); CLOCK_SetSimConfig(&simConfig); - SystemCoreClock = 96000000U; + SystemCoreClock = 100000000U; } - +#endif diff --git a/board/pin_mux.c b/board/pin_mux.c index 3a538f5..f989a8f 100644 --- a/board/pin_mux.c +++ b/board/pin_mux.c @@ -77,8 +77,8 @@ void BOARD_InitPins(void) #ifdef SDK_DEBUGCONSOLE /* Debug UART3 pinmux config */ - PORT_SetPinMux(PORTB, 11u, kPORT_MuxAlt3); /* UART3 TX */ - PORT_SetPinMux(PORTB, 10u, kPORT_MuxAlt3); /* UART3 RX */ + PORT_SetPinMux(PORTE, 0u, kPORT_MuxAlt3); /* UART1 TX */ + PORT_SetPinMux(PORTE, 1u, kPORT_MuxAlt3); /* UART1 RX */ #endif #ifdef BOARD_USES_ADC diff --git a/drivers/fsl_dspi.c b/drivers/fsl_dspi.c index e2b90ba..dcd93aa 100644 --- a/drivers/fsl_dspi.c +++ b/drivers/fsl_dspi.c @@ -29,6 +29,7 @@ */ #include "fsl_dspi.h" +#include "com_task.h" /******************************************************************************* * Definitions @@ -1465,10 +1466,18 @@ void DSPI_SlaveTransferHandleIRQ(SPI_Type *base, dspi_slave_handle_t *handle) { if (handle->rxData) { + if ((handle->totalByteCount - handle->remainingReceiveByteCount) == 1){ + if ( *(handle->rxData - 1) == APALIS_TK1_K20_BULK_WRITE_INST) { + handle->remainingReceiveByteCount += dataReceived; + handle->totalByteCount += dataReceived; + handle->remainingSendByteCount += dataReceived; + } + } /* Receive buffer is not null, store data into it */ *handle->rxData = dataReceived; ++handle->rxData; } + /* Descrease remaining receive byte count */ --handle->remainingReceiveByteCount; diff --git a/drivers/fsl_flexcan.c b/drivers/fsl_flexcan.c index f58f3f5..8fd3399 100644 --- a/drivers/fsl_flexcan.c +++ b/drivers/fsl_flexcan.c @@ -392,7 +392,7 @@ static void FLEXCAN_Reset(CAN_Type *base) } } -static void FLEXCAN_SetBaudRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Bps) +void FLEXCAN_SetBaudRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Bps) { flexcan_timing_config_t timingConfig; uint32_t priDiv = baudRate_Bps * FLEXCAN_TIME_QUANTA_NUM; @@ -555,6 +555,17 @@ void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *conf FLEXCAN_ExitFreezeMode(base); } +void FLEXCAN_SetBitRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Bps) +{ + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + FLEXCAN_SetBaudRate(base, sourceClock_Hz, baudRate_Bps); + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} + void FLEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask) { /* Enter Freeze Mode. */ diff --git a/drivers/fsl_flexcan.h b/drivers/fsl_flexcan.h index 118badf..e6baa93 100644 --- a/drivers/fsl_flexcan.h +++ b/drivers/fsl_flexcan.h @@ -502,6 +502,8 @@ void FLEXCAN_GetDefaultConfig(flexcan_config_t *config); */ void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *config); +void FLEXCAN_SetBitRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Bps); + /*! * @brief Sets the FlexCAN receive message buffer global mask. * diff --git a/source/FreeRTOSConfig.h b/source/FreeRTOSConfig.h index 0912244..91e561f 100644 --- a/source/FreeRTOSConfig.h +++ b/source/FreeRTOSConfig.h @@ -133,7 +133,7 @@ #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2) /* Define to trap errors during development. */ -#define configASSERT(x) if((x) == 0) {taskDISABLE_INTERRUPTS(); for (;;);} +//#define configASSERT(x) if((x) == 0) {taskDISABLE_INTERRUPTS(); for (;;);} /* Optional functions - most linkers will remove unused functions anyway. */ #define INCLUDE_vTaskPrioritySet 1 diff --git a/source/adc_task.c b/source/adc_task.c index 456b9b2..8adb356 100644 --- a/source/adc_task.c +++ b/source/adc_task.c @@ -41,6 +41,7 @@ static int adc_task_init(void) adc_config.clockDivider = kADC16_ClockDivider8; ADC16_Init(ADC0, &adc_config); ADC16_SetHardwareAverage(ADC0, kADC16_HardwareAverageDisabled); + PRINTF("ADC init done \r\n"); return 0; #else return -ENODEV; @@ -53,11 +54,12 @@ static int tsc_task_init(void) #ifdef BOARD_USES_ADC ADC16_GetDefaultConfig(&adc_config); adc_config.resolution = kADC16_ResolutionSE12Bit; - adc_config.longSampleMode = kADC16_LongSampleDisabled; + adc_config.longSampleMode = kADC16_LongSampleCycle10; adc_config.clockDivider = kADC16_ClockDivider8; ADC16_Init(ADC1, &adc_config); ADC16_SetChannelMuxMode(ADC1, kADC16_ChannelMuxB); - ADC16_SetHardwareAverage(ADC1, kADC16_HardwareAverageCount32); + ADC16_SetHardwareAverage(ADC1, kADC16_HardwareAverageCount16); + PRINTF("TSC init done \r\n"); return 0; #else return -ENODEV; diff --git a/source/can_task.c b/source/can_task.c index fbb84aa..e335d93 100644 --- a/source/can_task.c +++ b/source/can_task.c @@ -3,17 +3,61 @@ #include "com_task.h" #include "fsl_flexcan.h" -#define RX_MESSAGE_BUFFER_NUM0 (9) -#define TX_MESSAGE_BUFFER_NUM0 (8) -#define RX_MESSAGE_BUFFER_NUM1 (7) -#define TX_MESSAGE_BUFFER_NUM1 (6) +/* special address description flags for the CAN_ID */ +#define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */ +#define CAN_RTR_FLAG 0x40000000U /* remote transmission request */ +#define CAN_ERR_FLAG 0x20000000U /* error message frame */ + +#define RX_MESSAGE_BUFFER_NUM0 (0) +#define TX_MESSAGE_BUFFER_NUM0 (1) + +#define CAN_FRAME_MAX_LEN 8 +#define CAN_HEADER_MAX_LEN 5 +#define CAN_TRANSFER_BUF_LEN (CAN_HEADER_MAX_LEN + CAN_FRAME_MAX_LEN) + +#define CAN_CTRLMODE_NORMAL 0x00 /* normal mode */ +#define CAN_CTRLMODE_LOOPBACK 0x01 /* Loopback mode */ +#define CAN_CTRLMODE_LISTENONLY 0x02 /* Listen-only mode */ +#define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */ +#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */ +#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ + +#define CANCTRL_MODMASK 0x03 +#define CANCTRL_INTMASK 0x38 +#define CANCTRL_INTEN BIT(2) +#define CANINTF_RX BIT(3) +#define CANINTF_TX BIT(4) +#define CANINTF_ERR BIT(5) + +#define EFLG_EWARN 0x01 +#define EFLG_RXWAR 0x02 +#define EFLG_TXWAR 0x04 +#define EFLG_RXEP 0x08 +#define EFLG_TXEP 0x10 +#define EFLG_TXBO 0x20 +#define EFLG_RXOVR 0x40 static flexcan_handle_t flexcanHandle[2]; -static uint32_t txIdentifier[2]; -static uint32_t rxIdentifier[2]; static volatile bool txComplete[2] = {false, false}; static volatile bool rxComplete[2] = {false, false}; +struct can_task { + uint8_t id; + flexcan_frame_t rx_frame; +}; + +struct can_registers { + uint8_t can_status_reg; + uint8_t can_err_reg; + uint8_t can_mode; + uint8_t recived_frames_cnt; +}; + +static flexcan_frame_t tx_frame[2]; +static flexcan_frame_t rx_buffer[2][APALIS_TK1_CAN_RX_BUF_SIZE]; + +static struct can_registers can_regs[2]; + static void flexcan_callback0(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData) { callback_message_t * cb = (callback_message_t*) userData; @@ -24,6 +68,7 @@ static void flexcan_callback0(CAN_Type *base, flexcan_handle_t *handle, status_t case kStatus_FLEXCAN_RxIdle: if (RX_MESSAGE_BUFFER_NUM0 == result) { + cb->async_status = pdTRUE; xSemaphoreGiveFromISR(cb->sem, &reschedule); } break; @@ -31,6 +76,11 @@ static void flexcan_callback0(CAN_Type *base, flexcan_handle_t *handle, status_t case kStatus_FLEXCAN_TxIdle: if (TX_MESSAGE_BUFFER_NUM0 == result) { + /* write status and gen irq */ + can_regs[0].can_status_reg |= CANINTF_TX; + generate_irq(APALIS_TK1_K20_CAN0_IRQ); + cb->async_status = pdFALSE; + xSemaphoreGiveFromISR(cb->sem, &reschedule); } break; @@ -48,15 +98,21 @@ static void flexcan_callback1(CAN_Type *base, flexcan_handle_t *handle, status_t switch (status) { case kStatus_FLEXCAN_RxIdle: - if (RX_MESSAGE_BUFFER_NUM1 == result) + if (RX_MESSAGE_BUFFER_NUM0 == result) { + cb->async_status = pdTRUE; xSemaphoreGiveFromISR(cb->sem, &reschedule); } break; case kStatus_FLEXCAN_TxIdle: - if (TX_MESSAGE_BUFFER_NUM1 == result) + if (TX_MESSAGE_BUFFER_NUM0 == result) { + /* write status and gen irq */ + can_regs[1].can_status_reg |= CANINTF_TX; + generate_irq(APALIS_TK1_K20_CAN1_IRQ); + cb->async_status = pdFALSE; + xSemaphoreGiveFromISR(cb->sem, &reschedule); } break; @@ -66,28 +122,16 @@ static void flexcan_callback1(CAN_Type *base, flexcan_handle_t *handle, status_t portYIELD_FROM_ISR(reschedule); } -static void CAN_Init() +static void CAN0_Init() { flexcan_config_t flexcanConfig; flexcan_rx_mb_config_t mbConfig; - txIdentifier[0] = 0x321; - rxIdentifier[0] = 0x123; - txIdentifier[1] = 0x123; - rxIdentifier[1] = 0x321; - - /* Get FlexCAN module default Configuration. */ - /* - * flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc; - * flexcanConfig.baudRate = 125000U; - * flexcanConfig.maxMbNum = 16; - * flexcanConfig.enableLoopBack = false; - * flexcanConfig.enableSelfWakeup = false; - * flexcanConfig.enableIndividMask = false; - * flexcanConfig.enableDoze = false; - */ FLEXCAN_GetDefaultConfig(&flexcanConfig); + flexcanConfig.baudRate = 1000000U; /* set default to 1Mbit/s*/ + flexcanConfig.maxMbNum = 2; /* Use only 2 mailboxes, 1 RX 1TX */ + /* Init FlexCAN module. */ flexcanConfig.clkSrc = kFLEXCAN_ClkSrcPeri; FLEXCAN_Init(CAN0, &flexcanConfig, CLOCK_GetFreq(kCLOCK_BusClk)); @@ -95,30 +139,30 @@ static void CAN_Init() /* Create FlexCAN handle structure and set call back function. */ FLEXCAN_TransferCreateHandle(CAN0, &flexcanHandle[0], flexcan_callback0, flexcanHandle[0].userData); - /* Set Rx Masking mechanism. */ - FLEXCAN_SetRxMbGlobalMask(CAN0, FLEXCAN_RX_MB_STD_MASK(rxIdentifier[0], 0, 0)); + /* Set Rx Mask to don't care on all bits. */ + FLEXCAN_SetRxMbGlobalMask(CAN0, FLEXCAN_RX_MB_EXT_MASK(0x00, 0, 0)); /* Setup Rx Message Buffer. */ - mbConfig.format = kFLEXCAN_FrameFormatStandard; + mbConfig.format = kFLEXCAN_FrameFormatExtend; mbConfig.type = kFLEXCAN_FrameTypeData; - mbConfig.id = FLEXCAN_ID_STD(rxIdentifier[0]); + mbConfig.id = FLEXCAN_ID_EXT(0x1FFFFFFF); FLEXCAN_SetRxMbConfig(CAN0, RX_MESSAGE_BUFFER_NUM0, &mbConfig, true); /* Setup Tx Message Buffer. */ FLEXCAN_SetTxMbConfig(CAN0, TX_MESSAGE_BUFFER_NUM0, true); + PRINTF("CAN0 init done \r\n"); +} + +static void CAN1_Init() +{ + flexcan_config_t flexcanConfig; + flexcan_rx_mb_config_t mbConfig; - /* Get FlexCAN module default Configuration. */ - /* - * flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc; - * flexcanConfig.baudRate = 125000U; - * flexcanConfig.maxMbNum = 16; - * flexcanConfig.enableLoopBack = false; - * flexcanConfig.enableSelfWakeup = false; - * flexcanConfig.enableIndividMask = false; - * flexcanConfig.enableDoze = false; - */ FLEXCAN_GetDefaultConfig(&flexcanConfig); + flexcanConfig.baudRate = 1000000U; /* set default to 1Mbit/s */ + flexcanConfig.maxMbNum = 2; /* Use only 2 mailboxes, 1 RX 1TX */ + /* Init FlexCAN module. */ flexcanConfig.clkSrc = kFLEXCAN_ClkSrcPeri; FLEXCAN_Init(CAN1, &flexcanConfig, CLOCK_GetFreq(kCLOCK_BusClk)); @@ -126,116 +170,475 @@ static void CAN_Init() /* Create FlexCAN handle structure and set call back function. */ FLEXCAN_TransferCreateHandle(CAN1, &flexcanHandle[1], flexcan_callback1, flexcanHandle[1].userData); - /* Set Rx Masking mechanism. */ - FLEXCAN_SetRxMbGlobalMask(CAN1, FLEXCAN_RX_MB_STD_MASK(rxIdentifier[1], 0, 0)); + /* Set Rx Mask to don't care on all bits. */ + FLEXCAN_SetRxMbGlobalMask(CAN1, FLEXCAN_RX_MB_EXT_MASK(0x00, 0, 0)); /* Setup Rx Message Buffer. */ - mbConfig.format = kFLEXCAN_FrameFormatStandard; + mbConfig.format = kFLEXCAN_FrameFormatExtend; mbConfig.type = kFLEXCAN_FrameTypeData; - mbConfig.id = FLEXCAN_ID_STD(rxIdentifier[1]); - FLEXCAN_SetRxMbConfig(CAN1, RX_MESSAGE_BUFFER_NUM1, &mbConfig, true); + mbConfig.id = FLEXCAN_ID_EXT(0x1FFFFFFF); + FLEXCAN_SetRxMbConfig(CAN1, RX_MESSAGE_BUFFER_NUM0, &mbConfig, true); - mbConfig.format = kFLEXCAN_FrameFormatExtend; - mbConfig.type = kFLEXCAN_FrameTypeRemote; - mbConfig.id = FLEXCAN_ID_STD(txIdentifier[1]); - FLEXCAN_SetRxMbConfig(CAN1, RX_MESSAGE_BUFFER_NUM1, &mbConfig, true); + /* Setup Tx Message Buffer. */ + FLEXCAN_SetTxMbConfig(CAN1, TX_MESSAGE_BUFFER_NUM0, true); + PRINTF("CAN1 init done \r\n"); +} +void can0_task(void *pvParameters) { + flexcan_frame_t rxFrame; + flexcan_mb_transfer_t rxXfer; + flexcan_rx_mb_config_t mbConfig; + callback_message_t cb_msg; + status_t ret; - /* Setup Tx Message Buffer. */ - FLEXCAN_SetTxMbConfig(CAN1, TX_MESSAGE_BUFFER_NUM1, true); - PRINTF("CAN init done \r\n"); -} - - -void can_task(void *pvParameters) { - flexcan_frame_t txFrame, rxFrame; - flexcan_mb_transfer_t txXfer, rxXfer; - callback_message_t cb_msg[2]; - - cb_msg[0].sem = xSemaphoreCreateBinary(); - cb_msg[1].sem = xSemaphoreCreateBinary(); - flexcanHandle[0].userData = (void *) &cb_msg[0]; - flexcanHandle[1].userData = (void *) &cb_msg[1]; - CAN_Init(); - - vTaskSuspend(NULL); - rxXfer.frame = &rxFrame; - rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM1; - FLEXCAN_TransferReceiveNonBlocking(CAN1, &flexcanHandle[1], &rxXfer); - - txFrame.format = kFLEXCAN_FrameFormatStandard; - txFrame.type = kFLEXCAN_FrameTypeData; - txFrame.id = FLEXCAN_ID_STD(0x321); - txFrame.length = 8; - txFrame.dataWord0 = CAN_WORD0_DATA_BYTE_0(0x11) | CAN_WORD0_DATA_BYTE_1(0x22) | CAN_WORD0_DATA_BYTE_2(0x33) | - CAN_WORD0_DATA_BYTE_3(0x44); - txFrame.dataWord1 = CAN_WORD1_DATA_BYTE_4(0x55) | CAN_WORD1_DATA_BYTE_5(0x66) | CAN_WORD1_DATA_BYTE_6(0x77) | - CAN_WORD1_DATA_BYTE_7(0x88); - txXfer.frame = &txFrame; - txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM0; - PRINTF("\r\nCAN0->CAN1 "); + cb_msg.sem = xSemaphoreCreateBinary(); + flexcanHandle[0].userData = (void *) &cb_msg; + CAN0_Init(); + mbConfig.format = kFLEXCAN_FrameFormatExtend; + mbConfig.type = kFLEXCAN_FrameTypeData; + mbConfig.id = FLEXCAN_ID_EXT(0x1FFFFFFF); - FLEXCAN_TransferSendNonBlocking(CAN0, &flexcanHandle[0], &txXfer); - if (xSemaphoreTake(cb_msg[1].sem, 1000u) == pdFALSE) + while(1) { - PRINTF("FAIL!\r\n"); - FLEXCAN_TransferAbortSend(CAN0, &flexcanHandle[0], txXfer.mbIdx); - FLEXCAN_TransferAbortReceive(CAN1, &flexcanHandle[1], rxXfer.mbIdx); + rxXfer.frame = &rxFrame; + rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM0; + + FLEXCAN_SetRxMbConfig(CAN0, RX_MESSAGE_BUFFER_NUM0, &mbConfig, true); + ret = FLEXCAN_TransferReceiveNonBlocking(CAN0, &flexcanHandle[0], &rxXfer); + if (ret == kStatus_Success){ + if (xSemaphoreTake(cb_msg.sem, portMAX_DELAY) == pdTRUE) + { + if (cb_msg.async_status == pdTRUE) + { + if (can_regs[0].recived_frames_cnt < APALIS_TK1_CAN_RX_BUF_SIZE){ + + memcpy(&rx_buffer[0][can_regs[0].recived_frames_cnt], + rxXfer.frame, sizeof(flexcan_frame_t)); + can_regs[0].recived_frames_cnt++; + can_regs[0].can_status_reg |= CANINTF_RX; + generate_irq(APALIS_TK1_K20_CAN0_IRQ); + } + if (can_regs[0].recived_frames_cnt >= APALIS_TK1_CAN_RX_BUF_SIZE) + vTaskSuspend(NULL); + } + } + }else { + FLEXCAN_TransferAbortReceive(CAN0, &flexcanHandle[0], RX_MESSAGE_BUFFER_NUM0); + FLEXCAN_TransferAbortSend(CAN0, &flexcanHandle[0], TX_MESSAGE_BUFFER_NUM0); + } } - else + vSemaphoreDelete(cb_msg.sem); + +} + +void can1_task(void *pvParameters) { + flexcan_frame_t rxFrame; + flexcan_mb_transfer_t rxXfer; + flexcan_rx_mb_config_t mbConfig; + callback_message_t cb_msg; + status_t ret; + + cb_msg.sem = xSemaphoreCreateBinary(); + flexcanHandle[1].userData = (void *) &cb_msg; + CAN1_Init(); + + while(1) { - PRINTF("SUCCESS!\r\n"); + rxXfer.frame = &rxFrame; + rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM0; + + FLEXCAN_SetRxMbConfig(CAN1, RX_MESSAGE_BUFFER_NUM0, &mbConfig, true); + ret = FLEXCAN_TransferReceiveNonBlocking(CAN1, &flexcanHandle[1], &rxXfer); + if (ret == kStatus_Success){ + if (xSemaphoreTake(cb_msg.sem, portMAX_DELAY) == pdTRUE) + { + if (cb_msg.async_status == pdTRUE) + { + if (can_regs[1].recived_frames_cnt < APALIS_TK1_CAN_RX_BUF_SIZE){ + + memcpy(&rx_buffer[1][can_regs[1].recived_frames_cnt], + rxXfer.frame, sizeof(flexcan_frame_t)); + can_regs[1].recived_frames_cnt++; + can_regs[1].can_status_reg |= CANINTF_RX; + generate_irq(APALIS_TK1_K20_CAN1_IRQ); + } + if (can_regs[1].recived_frames_cnt >= APALIS_TK1_CAN_RX_BUF_SIZE) + vTaskSuspend(NULL); + } + } + }else { + FLEXCAN_TransferAbortReceive(CAN1, &flexcanHandle[1], RX_MESSAGE_BUFFER_NUM0); + FLEXCAN_TransferAbortSend(CAN1, &flexcanHandle[1], TX_MESSAGE_BUFFER_NUM0); + } + } + vSemaphoreDelete(cb_msg.sem); +} + +uint8_t get_canreg (int id) +{ + return can_regs[id].can_status_reg; +} + +uint8_t get_canerr (int id) +{ + uint8_t temp; + temp = can_regs[id].can_err_reg; + can_regs[id].can_err_reg = 0; + return temp; +} + +uint8_t get_canbadreg (int id) +{ + return 0; +} + +uint16_t get_canbittimig (int id) +{ + return 0; +} + +uint8_t get_can_rxcnt(int id) +{ + return can_regs[id].recived_frames_cnt; +} + +static void can_change_mode(int id, uint8_t new_mode) +{ + CAN_Type *base = id ? CAN1:CAN0; + + can_regs[id].can_mode = new_mode; + + switch (new_mode){ + case CAN_CTRLMODE_LOOPBACK: + base->CTRL1 = base->CTRL1 | CAN_CTRL1_LPB_MASK; + break; + case CAN_CTRLMODE_NORMAL: + base->CTRL1 = base->CTRL1 & ~CAN_CTRL1_LPB_MASK; } - rxXfer.frame = &rxFrame; - rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM0; - FLEXCAN_TransferReceiveNonBlocking(CAN0, &flexcanHandle[0], &rxXfer); +} - txFrame.format = kFLEXCAN_FrameFormatStandard; - txFrame.type = kFLEXCAN_FrameTypeData; - txFrame.id = FLEXCAN_ID_STD(0x123); - txFrame.length = 8; - txFrame.dataWord0 = CAN_WORD0_DATA_BYTE_0(0x11) | CAN_WORD0_DATA_BYTE_1(0x22) | CAN_WORD0_DATA_BYTE_2(0x33) | - CAN_WORD0_DATA_BYTE_3(0x44); - txFrame.dataWord1 = CAN_WORD1_DATA_BYTE_4(0x55) | CAN_WORD1_DATA_BYTE_5(0x66) | CAN_WORD1_DATA_BYTE_6(0x77) | - CAN_WORD1_DATA_BYTE_7(0x88); - txXfer.frame = &txFrame; - txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM1; +uint8_t set_canreg (int id, uint8_t value) +{ + can_regs[id].can_status_reg = value; + if ( can_regs[id].can_mode != (value & CANCTRL_MODMASK) ) + can_change_mode(id, (value & CANCTRL_MODMASK)); + return 1; +} + +uint8_t set_canerr (int id, uint8_t value) +{ + return 1; +} + +uint8_t set_canbadreg (int id, uint8_t value) +{ - PRINTF("CAN1->CAN0 "); + FLEXCAN_SetBitRate(id ? CAN1:CAN0, CLOCK_GetFreq(kCLOCK_BusClk), value * APALIS_TK1_CAN_CLK_UNIT); + return 1; +} +#if 0 +static flexcan_timing_config_t timingConfig; +#endif + +uint8_t set_canbittimig (int id, uint16_t value, int16_t mask) +{ +#if 0 + if(mask & 0xFF) { + timingConfig.phaseSeg1 = 0; + timingConfig.phaseSeg2 = 0; + timingConfig.rJumpwidth = 0; + } + if (mask & 0xFF00) { + timingConfig.propSeg = 0; + timingConfig.preDivider = 0; + + } +#endif + return 1; +} + +static int can0_inframe; + +uint8_t can0_transmit(){ + flexcan_mb_transfer_t txXfer; + + txXfer.frame = &tx_frame[0]; + txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM0; + can0_inframe = 0; + + FLEXCAN_TransferAbortReceive(CAN0, &flexcanHandle[0], RX_MESSAGE_BUFFER_NUM0); + FLEXCAN_TransferSendNonBlocking(CAN0, &flexcanHandle[0], &txXfer); + return 0; +} + +uint8_t can0_sendframe_single_rw(uint8_t address, uint8_t data) +{ + + if (address == 0){ + tx_frame[0].length = data; + can0_inframe = 1; + } + + if ((address > 0) && (address < 5) && can0_inframe){ + tx_frame[0].id = data << (8 * (address - 1)); + } + + if ((address > 4) && can0_inframe){ + switch (address){ + case 5: tx_frame[0].dataByte0 = data; + break; + case 6: tx_frame[0].dataByte1 = data; + break; + case 7: tx_frame[0].dataByte2 = data; + break; + case 8: tx_frame[0].dataByte3 = data; + break; + case 9: tx_frame[0].dataByte4 = data; + break; + case 10: tx_frame[0].dataByte5 = data; + break; + case 11: tx_frame[0].dataByte6 = data; + break; + case 12: tx_frame[0].dataByte7 = data; + break; + } + if ((address - 4) == tx_frame[0].length) + return can0_transmit(); + } + return 0; +} + +uint8_t can1_sendframe(uint8_t *data, uint8_t len) +{ + return 1; +} + +static int can1_inframe; + +uint8_t can1_transmit(){ + flexcan_mb_transfer_t txXfer; + + txXfer.frame = &tx_frame[1]; + txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM0; + can1_inframe = 0; + + FLEXCAN_TransferAbortReceive(CAN1, &flexcanHandle[1], RX_MESSAGE_BUFFER_NUM0); FLEXCAN_TransferSendNonBlocking(CAN1, &flexcanHandle[1], &txXfer); - if (xSemaphoreTake(cb_msg[0].sem, 1000u ) == pdFALSE) - { - PRINTF("FAIL!\r\n"); - FLEXCAN_TransferAbortSend(CAN1, &flexcanHandle[0], txXfer.mbIdx); - FLEXCAN_TransferAbortReceive(CAN0, &flexcanHandle[1], rxXfer.mbIdx); + return 0; +} + +uint8_t can1_sendframe_single_rw(uint8_t address, uint8_t data) +{ + + if (address == 0){ + tx_frame[1].length = data; + can1_inframe = 1; } - else - { - PRINTF("SUCCESS!\r\n"); + + if ((address > 0) && (address < 5) && can1_inframe){ + tx_frame[1].id = data << (8 * (address - 1)); } - vSemaphoreDelete(cb_msg[0].sem); - vSemaphoreDelete(cb_msg[1].sem); + if ((address > 4) && can1_inframe){ + switch (address){ + case 5: tx_frame[1].dataByte0 = data; + break; + case 6: tx_frame[1].dataByte1 = data; + break; + case 7: tx_frame[1].dataByte2 = data; + break; + case 8: tx_frame[1].dataByte3 = data; + break; + case 9: tx_frame[1].dataByte4 = data; + break; + case 10: tx_frame[1].dataByte5 = data; + break; + case 11: tx_frame[1].dataByte6 = data; + break; + case 12: tx_frame[1].dataByte7 = data; + break; + } + if ((address - 4) == tx_frame[1].length) + return can1_transmit(); + } + return 0; +} - vTaskResume(spi_task_handle); - vTaskDelete(NULL); +uint8_t can_sendframe(uint8_t id, uint8_t *data, uint8_t len) +{ + tx_frame[id].length = data[0]; + tx_frame[id].id = (data[4] << 24) + (data[3] << 16) + (data[2] << 8) + data[1]; + + tx_frame[id].format = (data[4] << 24 & CAN_EFF_FLAG) ? + kFLEXCAN_FrameFormatExtend:kFLEXCAN_FrameFormatStandard; + tx_frame[id].type = (data[4] << 24 & CAN_RTR_FLAG) ? + kFLEXCAN_FrameTypeRemote:kFLEXCAN_FrameTypeData; + + if (tx_frame[id].format == kFLEXCAN_FrameFormatExtend) + tx_frame[id].id = FLEXCAN_ID_EXT(tx_frame[id].id); + else + tx_frame[id].id = FLEXCAN_ID_STD(tx_frame[id].id); + + tx_frame[id].dataByte0 = data[5]; + tx_frame[id].dataByte1 = data[5 + 1]; + tx_frame[id].dataByte2 = data[5 + 2]; + tx_frame[id].dataByte3 = data[5 + 3]; + tx_frame[id].dataByte4 = data[5 + 4]; + tx_frame[id].dataByte5 = data[5 + 5]; + tx_frame[id].dataByte6 = data[5 + 6]; + tx_frame[id].dataByte7 = data[5 + 7]; + if (id == 0) + can0_transmit(); + else if (id == 1) + can1_transmit(); + return 0; } -int can0_registers(dspi_transfer_t *spi_transfer) +uint8_t can_readframe(uint8_t id, uint8_t *data) { - uint8_t *rx_buf = spi_transfer->rxData; - uint8_t *tx_buf = &spi_transfer->txData[1]; + data[0] = rx_buffer[id][0].length ; + if (rx_buffer[id][0].format == kFLEXCAN_FrameFormatExtend) { + data[1] = rx_buffer[id][0].id & 0xFF; + data[2] = (rx_buffer[id][0].id >> 8 ) & 0xFF; + data[3] = (rx_buffer[id][0].id >> 16 ) & 0xFF; + data[4] = (rx_buffer[id][0].id >> 24 ) & 0x1F; + data[4] |= CAN_EFF_FLAG >> 24; + } else { + data[1] = (rx_buffer[id][0].id >> 18) & 0xFF; + data[2] = ((rx_buffer[id][0].id >> 18) >> 8 ) & 0x7F; + data[3] = 0x00; + data[4] = 0x00; + } + data[4] |= rx_buffer[id][0].type ? (CAN_RTR_FLAG >> 24):0x00; + + data[5] = rx_buffer[id][0].dataByte0; + data[5 + 1] = rx_buffer[id][0].dataByte1; + data[5 + 2] = rx_buffer[id][0].dataByte2; + data[5 + 3] = rx_buffer[id][0].dataByte3; + data[5 + 4] = rx_buffer[id][0].dataByte4; + data[5 + 5] = rx_buffer[id][0].dataByte5; + data[5 + 6] = rx_buffer[id][0].dataByte6; + data[5 + 7] = rx_buffer[id][0].dataByte7; + + can_regs[id].recived_frames_cnt = 0; + can_regs[id].can_status_reg &= ~CANINTF_RX; + if (id == 1) + vTaskResume(can1_task_handle); + else + vTaskResume(can0_task_handle); - return -EIO; + return CAN_TRANSFER_BUF_LEN; } -int can1_registers(dspi_transfer_t *spi_transfer) +uint8_t can_readframe_single_rw(int id, uint8_t address) +{ + + if (address == 0){ + return rx_buffer[id][0].length; + } + + if ((address > 0) && (address < 5) && can1_inframe){ + return rx_buffer[id][0].id >> (8 * (address - 1)); + } + + if ((address > 4) && can1_inframe){ + switch (address){ + case 5: return rx_buffer[id][0].dataByte0; + case 6: return rx_buffer[id][0].dataByte1; + case 7: return rx_buffer[id][0].dataByte2; + case 8: return rx_buffer[id][0].dataByte3; + case 9: return rx_buffer[id][0].dataByte4; + case 10: return rx_buffer[id][0].dataByte5; + case 11: return rx_buffer[id][0].dataByte6; + case 12: + vTaskResume(id ? can1_task:can0_task); + can_regs[id].recived_frames_cnt = 0; + return rx_buffer[id][0].dataByte7; + } + if ((address - 4) == tx_frame[1].length) + return can1_transmit(); + } + return 0; +} + +int canx_registers(dspi_transfer_t *spi_transfer, int id) { uint8_t *rx_buf = spi_transfer->rxData; uint8_t *tx_buf = &spi_transfer->txData[1]; + if (rx_buf[0] == APALIS_TK1_K20_READ_INST) { + rx_buf[2] -= APALIS_TK1_K20_CAN_DEV_OFFSET(id); + switch (rx_buf[2]) { + case APALIS_TK1_K20_CANREG: + tx_buf[0] = get_canreg(id); + break; + case APALIS_TK1_K20_CANERR: + tx_buf[0] = get_canerr(id); + break; + case APALIS_TK1_K20_CAN_BAUD_REG: + tx_buf[0] = get_canbadreg(id); + break; + case APALIS_TK1_K20_CAN_BIT_1: + tx_buf[0] = get_canbittimig(id) && 0xFF; + break; + case APALIS_TK1_K20_CAN_BIT_2: + tx_buf[0] = (get_canbittimig(id) >> 8) && 0xFF; + break; + case APALIS_TK1_K20_CAN_IN_BUF_CNT: + tx_buf[0] = get_can_rxcnt(id); + break; + default: + if((rx_buf[1] >=APALIS_TK1_K20_CAN_IN_BUF) && + (rx_buf[1] <= APALIS_TK1_K20_CAN_IN_BUF_END)) { + tx_buf[0] = can_readframe_single_rw(id, rx_buf[2]); + } else + return -EIO; + } + return 1; + } else if (rx_buf[0] == APALIS_TK1_K20_WRITE_INST) { + rx_buf[1] -= APALIS_TK1_K20_CAN_DEV_OFFSET(id); + switch (rx_buf[1]) { + case APALIS_TK1_K20_CANREG: + return set_canreg(id, rx_buf[2]); + case APALIS_TK1_K20_CANERR: + return set_canerr(id, rx_buf[2]); + case APALIS_TK1_K20_CAN_BAUD_REG: + return set_canbadreg(id, rx_buf[2]); + case APALIS_TK1_K20_CAN_BIT_1: + return set_canbittimig(id, rx_buf[2], 0x00FF); + case APALIS_TK1_K20_CAN_BIT_2: + return set_canbittimig(id, (rx_buf[2] << 8), 0xFF00); + default: + if((rx_buf[1] >=APALIS_TK1_K20_CAN_OUT_BUF) && + (rx_buf[1] <= APALIS_TK1_K20_CAN_OUT_BUF_END) && + (id == 0)) { + return can0_sendframe_single_rw(rx_buf[1] - APALIS_TK1_K20_CAN_OUT_BUF, rx_buf[2]); + } else + return -EIO; + } + + } else if (rx_buf[0] == APALIS_TK1_K20_BULK_READ_INST) { + rx_buf[2] -= APALIS_TK1_K20_CAN_DEV_OFFSET(id); + switch (rx_buf[2]) { + case APALIS_TK1_K20_CAN_IN_BUF: + return can_readframe(id, tx_buf); + default: + return -EIO; + } + } else if (rx_buf[0] == APALIS_TK1_K20_BULK_WRITE_INST) { + rx_buf[2] -= APALIS_TK1_K20_CAN_DEV_OFFSET(id); + switch (rx_buf[2]) { + case APALIS_TK1_K20_CAN_OUT_BUF: + can_sendframe(id, &rx_buf[3], rx_buf[1]); + break; + case APALIS_TK1_K20_CAN_BIT_1: + default: + return -EIO; + } + } return -EIO; } + diff --git a/source/can_task.h b/source/can_task.h index ce6eb18..b2113bf 100644 --- a/source/can_task.h +++ b/source/can_task.h @@ -10,9 +10,10 @@ #include "task.h" #include "fsl_dspi.h" -TaskHandle_t can_task_handle; -void can_task(void *pvParameters); -int can0_registers(dspi_transfer_t *spi_transfer); -int can1_registers(dspi_transfer_t *spi_transfer); +TaskHandle_t can0_task_handle; +TaskHandle_t can1_task_handle; +void can0_task(void *pvParameters); +void can1_task(void *pvParameters); +int canx_registers(dspi_transfer_t *spi_transfer, int id); #endif /* SOURCE_CAN_TASK_H_ */ diff --git a/source/com_task.c b/source/com_task.c index 01796d8..9edc906 100644 --- a/source/com_task.c +++ b/source/com_task.c @@ -5,7 +5,7 @@ #include "adc_task.h" /* Put FW version at known address in binary. Make it 32-bit to have room for the future*/ -const uint32_t __attribute__((section(".FwVersion"))) fw_version = APALIS_TK1_K20_FW_VER; +const uint32_t __attribute__((section(".FwVersion"), used)) fw_version = APALIS_TK1_K20_FW_VER; static dspi_slave_handle_t spi_handle; static uint8_t slaveRxData[APALIS_TK1_K20_MAX_BULK + APALIS_TK1_K20_HEADER] = {0U}; @@ -67,13 +67,13 @@ void set_irq_reg(uint8_t value) } -inline int general_registers(dspi_transfer_t *spi_transfer) +inline int general_registers(dspi_transfer_t * spi_transfer) { uint8_t *rx_buf = spi_transfer->rxData; uint8_t *tx_buf = &spi_transfer->txData[1]; if (rx_buf[0] == APALIS_TK1_K20_READ_INST) { - switch (rx_buf[1]) { + switch (rx_buf[2]) { case APALIS_TK1_K20_STAREG: tx_buf[0] = get_status_reg(); return 1; @@ -96,18 +96,18 @@ inline int general_registers(dspi_transfer_t *spi_transfer) switch (rx_buf[1]) { case APALIS_TK1_K20_STAREG: set_status_reg(rx_buf[2]); - return 0; + return 1; case APALIS_TK1_K20_REVREG: return -ENOENT; case APALIS_TK1_K20_IRQREG: set_irq_reg(rx_buf[2]); - return 0; + return 1; case APALIS_TK1_K20_CTRREG: set_control_reg(rx_buf[2]); - return 0; + return 1; case APALIS_TK1_K20_MSQREG: set_mask_reg(rx_buf[2]); - return 0; + return 1; default: return -ENOENT; } @@ -134,19 +134,24 @@ static void SPI_callback(SPI_Type *base, dspi_slave_handle_t *handle, status_t s portYIELD_FROM_ISR(reschedule); } +static dspi_slave_config_t spi2_slaveConfig; + static void SPI_init() { - dspi_slave_config_t slaveConfig; + gpio_pin_config_t gpio_out_config = { + kGPIO_DigitalOutput, 0, + }; + GPIO_PinInit(GPIOD, 11u, &gpio_out_config); /* Slave config */ - slaveConfig.whichCtar = kDSPI_Ctar0; - slaveConfig.ctarConfig.bitsPerFrame = 8; - slaveConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh; - slaveConfig.ctarConfig.cpha = kDSPI_ClockPhaseSecondEdge; - slaveConfig.enableContinuousSCK = true; - slaveConfig.enableRxFifoOverWrite = false; - slaveConfig.enableModifiedTimingFormat = false; - slaveConfig.samplePoint = kDSPI_SckToSin0Clock; - - DSPI_SlaveInit(SPI2, &slaveConfig); + spi2_slaveConfig.whichCtar = kDSPI_Ctar0; + spi2_slaveConfig.ctarConfig.bitsPerFrame = 8; + spi2_slaveConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh; + spi2_slaveConfig.ctarConfig.cpha = kDSPI_ClockPhaseSecondEdge; + spi2_slaveConfig.enableContinuousSCK = false; + spi2_slaveConfig.enableRxFifoOverWrite = true; + spi2_slaveConfig.enableModifiedTimingFormat = false; + spi2_slaveConfig.samplePoint = kDSPI_SckToSin0Clock; + PRINTF("SPI init \r\n"); + DSPI_SlaveInit(SPI2, &spi2_slaveConfig); DSPI_SlaveTransferCreateHandle(SPI2, &spi_handle, SPI_callback, spi_handle.userData); /* Set dspi slave interrupt priority higher. */ @@ -159,7 +164,8 @@ static void SPI_init() { void spi_task(void *pvParameters) { callback_message_t cb_msg; dspi_transfer_t slaveXfer; - int ret; + int ret, retry_size = 0; + uint8_t req_register = 0xFF; cb_msg.sem = xSemaphoreCreateBinary(); spi_handle.userData = &cb_msg; @@ -167,38 +173,53 @@ void spi_task(void *pvParameters) { GPIO_SetPinsOutput(GPIOA, 1u << 29u); /* INT2 idle */ while(1){ - slaveXfer.txData = slaveTxData; + slaveXfer.txData = NULL;/* We're not expecting any MISO traffic */ slaveXfer.rxData = slaveRxData; slaveXfer.dataSize = 3; slaveXfer.configFlags = kDSPI_SlaveCtar0; /* Wait for instructions from SoC */ DSPI_SlaveTransferNonBlocking(SPI2, &spi_handle, &slaveXfer); xSemaphoreTake(cb_msg.sem, portMAX_DELAY); - if (slaveRxData[1] <= 0x05) { + GPIO_ClearPinsOutput(GPIOD, 1u << 11u); + slaveXfer.txData = slaveTxData; + slaveXfer.rxData = slaveRxData; + + if (slaveRxData[0] == APALIS_TK1_K20_WRITE_INST) + req_register = slaveRxData[1]; + else + req_register = slaveRxData[2]; + + if (req_register <= 0x05) { ret = general_registers(&slaveXfer); - } else if ((slaveRxData[1] >= APALIS_TK1_K20_CANREG + APALIS_TK1_K20_CAN_DEV_OFFSET(0)) - && (slaveRxData[1] <= APALIS_TK1_K20_CAN_OUT_BUF_END + APALIS_TK1_K20_CAN_DEV_OFFSET(0))) { - ret = can0_registers(&slaveXfer); + } else if ((req_register >= APALIS_TK1_K20_CANREG + APALIS_TK1_K20_CAN_DEV_OFFSET(0)) + && (req_register <= APALIS_TK1_K20_CAN_OUT_BUF_END + APALIS_TK1_K20_CAN_DEV_OFFSET(0))) { + ret = canx_registers(&slaveXfer, 0); - } else if ((slaveRxData[1] >= APALIS_TK1_K20_CANREG + APALIS_TK1_K20_CAN_DEV_OFFSET(1)) - && (slaveRxData[1] <= APALIS_TK1_K20_CAN_OUT_BUF_END + APALIS_TK1_K20_CAN_DEV_OFFSET(1))) { - ret = can1_registers(&slaveXfer); + } else if ((req_register >= APALIS_TK1_K20_CANREG + APALIS_TK1_K20_CAN_DEV_OFFSET(1)) + && (req_register <= APALIS_TK1_K20_CAN_OUT_BUF_END + APALIS_TK1_K20_CAN_DEV_OFFSET(1))) { + ret = canx_registers(&slaveXfer, 1); #ifdef BOARD_USES_ADC - } else if ((slaveRxData[1] >= APALIS_TK1_K20_ADCREG) && (slaveRxData[1] <= APALIS_TK1_K20_ADC_CH3H)) { + } else if ((req_register >= APALIS_TK1_K20_ADCREG) && (req_register <= APALIS_TK1_K20_ADC_CH3H)) { ret = adc_registers(&slaveXfer); - } else if ((slaveRxData[1] >= APALIS_TK1_K20_TSCREG) && (slaveRxData[1] <= APALIS_TK1_K20_TSC_YPH)) { + } else if ((req_register >= APALIS_TK1_K20_TSCREG) && (req_register <= APALIS_TK1_K20_TSC_YPH)) { ret = tsc_registers(&slaveXfer); #endif - } else if ((slaveRxData[1] >= APALIS_TK1_K20_GPIOREG) && (slaveRxData[1] <= APALIS_TK1_K20_GPIO_STA)) { + } else if ((req_register >= APALIS_TK1_K20_GPIOREG) && (req_register <= APALIS_TK1_K20_GPIO_STA)) { ret = gpio_registers(&slaveXfer); + } else if (req_register == APALIS_TK1_K20_RET_REQ) { + /* something wrong with the SPI peripheral, try resetting it */ + DSPI_StopTransfer(SPI2); + DSPI_Enable(SPI2, false); + DSPI_SlaveInit(SPI2, &spi2_slaveConfig); + ret = retry_size - 1; } else { /* Register not defined */ ret = -EINVAL; } - if (ret < 0) { + if (ret <= 0) { slaveTxData[0] = TK1_K20_INVAL; slaveTxData[1] = TK1_K20_INVAL; } else { @@ -207,8 +228,11 @@ void spi_task(void *pvParameters) { if (slaveRxData[0] == APALIS_TK1_K20_READ_INST || slaveRxData[0] == APALIS_TK1_K20_BULK_READ_INST) { - slaveXfer.dataSize = (ret >= 0) ? (ret + 1):2; /* Extra byte is for sentinel */ + slaveXfer.dataSize = (ret > 0) ? (ret + 1):2; /* Extra byte is for sentinel*/ + retry_size = slaveXfer.dataSize; + slaveXfer.rxData = NULL; /* We're not expecting any MOSI traffic */ DSPI_SlaveTransferNonBlocking(SPI2, &spi_handle, &slaveXfer); + GPIO_SetPinsOutput(GPIOD, 1u << 11u); xSemaphoreTake(cb_msg.sem, portMAX_DELAY); } } diff --git a/source/com_task.h b/source/com_task.h index 843d840..a5db8c4 100644 --- a/source/com_task.h +++ b/source/com_task.h @@ -40,7 +40,7 @@ void spi_task(void *pvParameters); #define APALIS_TK1_K20_BULK_WRITE_INST 0x3C #define APALIS_TK1_K20_BULK_READ_INST 0xC3 -#define APALIS_TK1_K20_MAX_BULK (64) +#define APALIS_TK1_K20_MAX_BULK (32) /* General registers*/ #define APALIS_TK1_K20_STAREG 0x00 /* general status register RO */ @@ -60,14 +60,15 @@ void spi_task(void *pvParameters); #define APALIS_TK1_K20_CAN_IN_BUF_CNT 0x15 /* CAN0 IN received data count RO */ #define APALIS_TK1_K20_CAN_IN_BUF 0x16 /* CAN0 IN RO */ /* buffer size is 13 bytes */ +#define APALIS_TK1_K20_CAN_IN_BUF_END 0x22 /* CAN0 IN RO */ #define APALIS_TK1_K20_CAN_OUT_BUF_CNT 0x23 /* CAN0 OUT data Count WO */ -#define APALIS_TK1_K20_CAN_OUT_FIF0 0x26 /* CAN0 OUT WO */ +#define APALIS_TK1_K20_CAN_OUT_BUF 0x26 /* CAN0 OUT WO */ /* buffer size is 13 bytes */ -#define APALIS_TK1_K20_CAN_OUT_BUF_END (APALIS_TK1_K20_CAN_OUT_FIF0 + 13 - 1)/* CAN OUT BUF END */ +#define APALIS_TK1_K20_CAN_OUT_BUF_END (APALIS_TK1_K20_CAN_OUT_BUF + 13 - 1)/* CAN OUT BUF END */ #define APALIS_TK1_K20_CAN_DEV_OFFSET(x) (x ? 0x30 : 0) /* 0x33-0x3F Reserved */ -/* 0x40-0x62 CAN1 registers */ +/* 0x40-0x62 CAN1 registers same layout as CAN0*/ /* 0x63-0x6F Reserved */ /* ADC Registers */ @@ -110,7 +111,9 @@ void spi_task(void *pvParameters); #define APALIS_TK1_K20_GPIO_STA_OE BIT(0) #define APALIS_TK1_K20_GPIO_STA_VAL BIT(1) -/* 0x93-0xFF Reserved */ +/* 0x93-0xFD Reserved */ +#define APALIS_TK1_K20_RET_REQ 0xFE +/* 0xFF Reserved */ /* Interrupt flags */ #define APALIS_TK1_K20_GEN_IRQ 0 @@ -120,7 +123,7 @@ void spi_task(void *pvParameters); #define APALIS_TK1_K20_TSC_IRQ 4 #define APALIS_TK1_K20_GPIO_IRQ 5 -#define APALIS_TK1_K20_FW_VER 0x09 +#define APALIS_TK1_K20_FW_VER 0x0B #define FW_MINOR (APALIS_TK1_K20_FW_VER & 0x0F) #define FW_MAJOR ((APALIS_TK1_K20_FW_VER & 0xF0) >> 4) @@ -128,6 +131,14 @@ void spi_task(void *pvParameters); #define TK1_K20_SENTINEL 0x55 #define TK1_K20_INVAL 0xAA +#define APALIS_TK1_K20_NUMREGS 0x3f +#define APALIS_TK1_K20_IRQ_REG_CNT 1 +#define APALIS_TK1_K20_IRQ_PER_REG 8 + +#define APALIS_TK1_CAN_CLK_UNIT 6250 + +#define APALIS_TK1_CAN_RX_BUF_SIZE 1 + #define APALIS_TK1_K20_HEADER 4 #define ADC0_CHANNEL_CNT 4 diff --git a/source/gpio_ext.c b/source/gpio_ext.c index 977a42e..6d4d3a8 100644 --- a/source/gpio_ext.c +++ b/source/gpio_ext.c @@ -39,8 +39,11 @@ int is_gpio_valid(uint8_t pin) for (i = 0; i < sizeof(gpio_list)/sizeof(struct gpio_id); i++){ temp = port_type_to_int(gpio_list[i].port) * 32; temp += gpio_list[i].pin; - if ( temp == pin ) + if ( temp == pin ) { return i; + } + if (temp > pin) + return -EINVAL; } return -EINVAL; @@ -95,7 +98,7 @@ int gpio_registers(dspi_transfer_t *spi_transfer) uint8_t *tx_buf = &spi_transfer->txData[1]; if (rx_buf[0] == APALIS_TK1_K20_READ_INST) { - switch (rx_buf[1]) { + switch (rx_buf[2]) { case APALIS_TK1_K20_GPIOREG: return -ENOENT; break; @@ -109,7 +112,10 @@ int gpio_registers(dspi_transfer_t *spi_transfer) case APALIS_TK1_K20_GPIO_STA: if (gen_regs.gpio_no != 0xFF){ tx_buf[0] = get_gpio_status(gen_regs.gpio_no); - return 1; + if (tx_buf[0] != 0xFF) + return 1; + else + return -ENOENT; } else return -ENOENT; break; @@ -124,7 +130,7 @@ int gpio_registers(dspi_transfer_t *spi_transfer) case APALIS_TK1_K20_GPIO_NO: if (is_gpio_valid(rx_buf[2]) >= 0){ gen_regs.gpio_no = rx_buf[2]; - return 0; + return 1; } else { gen_regs.gpio_no = 0xFF; return -ENOENT; diff --git a/source/gpio_ext.h b/source/gpio_ext.h index ed1316a..a5a14da 100644 --- a/source/gpio_ext.h +++ b/source/gpio_ext.h @@ -26,10 +26,8 @@ struct gpio_id gpio_list [] = { {PORTB, GPIOB, 2}, {PORTB, GPIOB, 3}, #endif -#ifndef SDK_DEBUGCONSOLE {PORTB, GPIOB, 10}, {PORTB, GPIOB, 11}, -#endif {PORTB, GPIOB, 16}, {PORTB, GPIOB, 17}, {PORTB, GPIOB, 18}, @@ -56,8 +54,10 @@ struct gpio_id gpio_list [] = { {PORTD, GPIOD, 13}, {PORTD, GPIOD, 14}, {PORTD, GPIOD, 15}, +#ifndef SDK_DEBUGCONSOLE {PORTE, GPIOE, 0}, {PORTE, GPIOE, 1}, +#endif {PORTE, GPIOE, 2}, {PORTE, GPIOE, 3}, {PORTE, GPIOE, 4}, diff --git a/source/main.c b/source/main.c index 5e6a9d3..d910ab1 100644 --- a/source/main.c +++ b/source/main.c @@ -74,7 +74,8 @@ TaskHandle_t debug_task_handle; #ifdef SDK_DEBUGCONSOLE static void debug_task(void *pvParameters) { for (;;) { - vTaskDelay(10000); + vTaskDelay(10000); + PRINTF("Alive\r\n"); } } #endif @@ -90,23 +91,29 @@ int main(void) { PRINTF("Apalis K20 Firmware Version %d.%d\r\n", FW_MAJOR, FW_MINOR); /* Create RTOS task */ - if(xTaskCreate(spi_task, "SPI_task", 2000L / sizeof(portSTACK_TYPE), NULL, 4, &spi_task_handle) != pdPASS) + if(xTaskCreate(spi_task, "SPI_task", 1000L / sizeof(portSTACK_TYPE), NULL, 4, &spi_task_handle) != pdPASS) { PRINTF("create SPI task error\r\n"); } - if(xTaskCreate(can_task, "CAN_task", 2000L / sizeof(portSTACK_TYPE), NULL, 2, &can_task_handle) != pdPASS) + + if(xTaskCreate(can0_task, "CAN0_task", 1000L / sizeof(portSTACK_TYPE), NULL, 2, &can0_task_handle) != pdPASS) + { + PRINTF("create CAN0 task error\r\n"); + } + + if(xTaskCreate(can1_task, "CAN1_task", 1000L / sizeof(portSTACK_TYPE), NULL, 2, &can1_task_handle) != pdPASS) { - PRINTF("create CAN task error\r\n"); + PRINTF("create CAN1 task error\r\n"); } #ifdef BOARD_USES_ADC - if(xTaskCreate(adc_task, "ADC_task", 2000L / sizeof(portSTACK_TYPE), NULL, 2, &adc_task_handle) != pdPASS) + if(xTaskCreate(adc_task, "ADC_task", 1000L / sizeof(portSTACK_TYPE), NULL, 2, &adc_task_handle) != pdPASS) { PRINTF("create ADC task error\r\n"); } - if(xTaskCreate(tsc_task, "TSC_task", 2000L / sizeof(portSTACK_TYPE), NULL, 2, &tsc_task_handle) != pdPASS) + if(xTaskCreate(tsc_task, "TSC_task", 1000L / sizeof(portSTACK_TYPE), NULL, 2, &tsc_task_handle) != pdPASS) { PRINTF("create TSC task error\r\n"); } -- cgit v1.2.3