summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2017-11-09 19:51:32 +0100
committerDominik Sliwa <dominik.sliwa@toradex.com>2017-11-28 11:06:57 +0100
commit3020f5caf0b09fcaf85b3b3fa84fdf688ba22cc0 (patch)
tree971e36ac2bbd28b534791ca07efeca9e762c614a
parent41a46914821b1ea72c6dd68b308a3740276139ee (diff)
Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com>
-rw-r--r--.settings/language.settings.xml4
-rw-r--r--.settings/org.eclipse.cdt.core.prefs163
-rw-r--r--.settings/org.eclipse.cdt.ui.prefs3
-rw-r--r--board/board.h8
-rw-r--r--board/clock_config.c140
-rw-r--r--board/pin_mux.c4
-rw-r--r--drivers/fsl_dspi.c9
-rw-r--r--drivers/fsl_flexcan.c13
-rw-r--r--drivers/fsl_flexcan.h2
-rw-r--r--source/FreeRTOSConfig.h2
-rw-r--r--source/adc_task.c6
-rw-r--r--source/can_task.c639
-rw-r--r--source/can_task.h9
-rw-r--r--source/com_task.c88
-rw-r--r--source/com_task.h23
-rw-r--r--source/gpio_ext.c14
-rw-r--r--source/gpio_ext.h4
-rw-r--r--source/main.c19
18 files changed, 961 insertions, 189 deletions
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 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1752776928443483227" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1090621813304243453" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1786576365201881109" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1056822376545845571" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
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");
}