123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- /*!
- \file main.c
- \brief communication_among_Devices in normal mode
-
- \version 2017-02-10, V1.0.0, firmware for GD32F30x
- \version 2018-10-10, V1.1.0, firmware for GD32F30x
- \version 2018-12-25, V2.0.0, firmware for GD32F30x
- \version 2020-09-30, V2.1.0, firmware for GD32F30x
- */
- /*
- Copyright (c) 2020, GigaDevice Semiconductor Inc.
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- 3. Neither the name of the copyright holder nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- OF SUCH DAMAGE.
- */
- #include "gd32f30x.h"
- #include <stdio.h>
- #include "gd32f307c_eval.h"
- /* select can */
- //#define DEV_CAN0_USED
- #define DEV_CAN1_USED
- #ifdef DEV_CAN0_USED
- #define CANX CAN0
- #else
- #define CANX CAN1
- #endif
- FlagStatus receive_flag;
- uint8_t transmit_number = 0x0;
- can_receive_message_struct receive_message;
- can_trasnmit_message_struct transmit_message;
-
- void nvic_config(void);
- void led_config(void);
- void gpio_config(void);
- ErrStatus can_networking(void);
- void can_networking_init(void);
- /*!
- \brief main function
- \param[in] none
- \param[out] none
- \retval none
- */
- int main(void)
- {
- uint8_t i = 0;
- uint32_t timeout = 0xFFFF;
- uint8_t transmit_mailbox = 0;
-
- receive_flag = RESET;
- /* configure Tamper key */
- gd_eval_key_init(KEY_TAMPER, KEY_MODE_GPIO);
- /* configure GPIO */
- gpio_config();
- /* configure USART */
- gd_eval_com_init(EVAL_COM0);
- /* configure NVIC */
- nvic_config();
- /* configure leds */
- led_config();
- /* set all leds off */
- gd_eval_led_off(LED2);
- gd_eval_led_off(LED3);
- gd_eval_led_off(LED4);
- gd_eval_led_off(LED5);
- /* initialize CAN */
- can_networking_init();
-
- /* enable CAN receive FIFO1 not empty interrupt */
- can_interrupt_enable(CANX, CAN_INT_RFNE1);
-
- /* initialize transmit message */
- can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message);
- transmit_message.tx_sfid = 0x00;
- transmit_message.tx_efid = 0xaabb;
- transmit_message.tx_ft = CAN_FT_DATA;
- transmit_message.tx_ff = CAN_FF_EXTENDED;
- transmit_message.tx_dlen = 8;
-
- transmit_message.tx_data[0] = 0xA0;
- transmit_message.tx_data[1] = 0xA1;
- transmit_message.tx_data[2] = 0xA2;
- transmit_message.tx_data[3] = 0xA3;
- transmit_message.tx_data[4] = 0xA4;
- transmit_message.tx_data[5] = 0xA5;
- transmit_message.tx_data[6] = 0xA6;
- transmit_message.tx_data[7] = 0xA7;
-
- printf("Please press the Tamper key to transmit data!\r\n");
-
- /* initialize receive message */
- can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &receive_message);
-
- while(1){
- /* waiting for the Tamper key pressed */
- while(0 == gd_eval_key_state_get(KEY_TAMPER)){
- /* if transmit_number is 0x10, set it to 0x00 */
- if(transmit_number == 0x10){
- transmit_number = 0x00;
- }else{
- transmit_message.tx_data[0] = transmit_number++;
- printf("\r\n can transmit data:");
- for(i = 0; i < transmit_message.tx_dlen; i++){
- printf(" %02x", transmit_message.tx_data[i]);
- }
- /* transmit message */
- transmit_mailbox = can_message_transmit(CANX, &transmit_message);
- /* waiting for transmit completed */
- timeout = 0xFFFF;
- while((CAN_TRANSMIT_OK != can_transmit_states(CANX, transmit_mailbox)) && (0 != timeout)){
- timeout--;
- }
- /* waiting for Tamper key up */
- while(0 == gd_eval_key_state_get(KEY_TAMPER));
- }
- }
- if(SET == receive_flag){
- gd_eval_led_toggle(LED2);
- receive_flag = RESET;
- printf("\r\n can receive data:");
- for(i = 0; i < receive_message.rx_dlen; i++){
- printf(" %02x", receive_message.rx_data[i]);
- }
- }
- }
- }
- /*!
- \brief initialize CAN and filter
- \param[in] can_parameter
- \arg can_parameter_struct
- \param[in] can_filter
- \arg can_filter_parameter_struct
- \param[out] none
- \retval none
- */
- void can_networking_init(void)
- {
- can_parameter_struct can_parameter;
- can_filter_parameter_struct can_filter;
-
- can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
- can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);
-
- /* initialize CAN register */
- can_deinit(CANX);
-
- /* initialize CAN */
- can_parameter.time_triggered = DISABLE;
- can_parameter.auto_bus_off_recovery = ENABLE;
- can_parameter.auto_wake_up = DISABLE;
- can_parameter.auto_retrans = ENABLE;
- can_parameter.rec_fifo_overwrite = DISABLE;
- can_parameter.trans_fifo_order = DISABLE;
- can_parameter.working_mode = CAN_NORMAL_MODE;
- can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
- can_parameter.time_segment_1 = CAN_BT_BS1_7TQ;
- can_parameter.time_segment_2 = CAN_BT_BS2_2TQ;
- /* baudrate 1Mbps */
- can_parameter.prescaler = 6;
- can_init(CANX, &can_parameter);
- /* initialize filter */
- #ifdef DEV_CAN0_USED
- /* CAN0 filter number */
- can_filter.filter_number = 0;
- #else
- /* CAN1 filter number */
- can_filter.filter_number = 15;
- #endif
- /* initialize filter */
- can_filter.filter_mode = CAN_FILTERMODE_MASK;
- can_filter.filter_bits = CAN_FILTERBITS_32BIT;
- can_filter.filter_list_high = 0x0000;
- can_filter.filter_list_low = 0x0000;
- can_filter.filter_mask_high = 0x0000;
- can_filter.filter_mask_low = 0x0000;
- can_filter.filter_fifo_number = CAN_FIFO1;
- can_filter.filter_enable = ENABLE;
- can_filter_init(&can_filter);
- }
- /*!
- \brief configure the nested vectored interrupt controller
- \param[in] none
- \param[out] none
- \retval none
- */
- void nvic_config(void)
- {
- #ifdef DEV_CAN0_USED
- /* configure CAN0 NVIC */
- nvic_irq_enable(CAN0_RX1_IRQn,0,0);
- #else
- /* configure CAN1 NVIC */
- nvic_irq_enable(CAN1_RX1_IRQn,0,0);
- #endif
- }
- /*!
- \brief configure the leds
- \param[in] none
- \param[out] none
- \retval none
- */
- void led_config(void)
- {
- gd_eval_led_init(LED2);
- gd_eval_led_init(LED3);
- gd_eval_led_init(LED4);
- gd_eval_led_init(LED5);
- }
- /*!
- \brief configure GPIO
- \param[in] none
- \param[out] none
- \retval none
- */
- void gpio_config(void)
- {
- /* enable CAN clock */
- rcu_periph_clock_enable(RCU_CAN0);
-
- #ifdef GD32F30X_CL
- rcu_periph_clock_enable(RCU_CAN1);
- rcu_periph_clock_enable(RCU_GPIOB);
- #endif
-
- rcu_periph_clock_enable(RCU_GPIOD);
- rcu_periph_clock_enable(RCU_AF);
-
- /* configure CAN0 GPIO */
- gpio_init(GPIOD,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0);
- gpio_init(GPIOD,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1);
- gpio_pin_remap_config(GPIO_CAN0_FULL_REMAP,ENABLE);
-
- #ifdef GD32F30X_CL
- /* configure CAN1 GPIO */
- gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_5);
- gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6);
- gpio_pin_remap_config(GPIO_CAN1_REMAP,ENABLE);
- #endif
- }
- /* retarget the C library printf function to the usart */
- int fputc(int ch, FILE *f)
- {
- usart_data_transmit(EVAL_COM0, (uint8_t) ch);
- while (RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));
- return ch;
- }
|