内部循环模式时板子能够正常工作,当切换为正常通讯模式后,
CAN会卡死在:state_index = CAN_TX_STATUS_PENDING;
雅特力官方程序如下:
- void can_gpio_config(void)
- {
- gpio_init_type gpio_init_struct;
- crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
- gpio_pin_remap_config(CAN1_GMUX_0010,TRUE);
- gpio_default_para_init(&gpio_init_struct);
- /* can tx pin */
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
- gpio_init_struct.gpio_pins = GPIO_PINS_9;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init(GPIOB, &gpio_init_struct);
- /* can rx pin */
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
- gpio_init_struct.gpio_pins = GPIO_PINS_8;
- gpio_init_struct.gpio_pull = GPIO_PULL_UP;
- gpio_init(GPIOB, &gpio_init_struct);
- }
- void can_configuration(void)
- {
- can_base_type can_base_struct;
- can_baudrate_type can_baudrate_struct;
- can_filter_init_type can_filter_init_struct;
- crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
- /* can base init */
- can_default_para_init(&can_base_struct);
- can_base_struct.mode_selection = CAN_MODE_COMMUNICATE;
- can_base_struct.ttc_enable = FALSE;
- can_base_struct.aebo_enable = TRUE;
- can_base_struct.aed_enable = TRUE;
- can_base_struct.prsf_enable = FALSE;
- can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED;
- can_base_struct.mmssr_selection = CAN_SENDING_BY_ID;
- can_base_init(CAN1, &can_base_struct);
- /* can baudrate, set baudrate = pclk/(baudrate_div *(3 + bts1_size + bts2_size)) */
- can_baudrate_struct.baudrate_div = 10;
- can_baudrate_struct.rsaw_size = CAN_RSAW_1TQ;
- can_baudrate_struct.bts1_size = CAN_BTS1_8TQ;
- can_baudrate_struct.bts2_size = CAN_BTS2_3TQ;
- can_baudrate_set(CAN1, &can_baudrate_struct);
- /* can filter init */
- can_filter_init_struct.filter_activate_enable = TRUE;
- can_filter_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
- can_filter_init_struct.filter_fifo = CAN_FILTER_FIFO0;
- can_filter_init_struct.filter_number = 0;
- can_filter_init_struct.filter_bit = CAN_FILTER_32BIT;
- can_filter_init_struct.filter_id_high = 0;
- can_filter_init_struct.filter_id_low = 0;
- can_filter_init_struct.filter_mask_high = 0;
- can_filter_init_struct.filter_mask_low = 0;
- can_filter_init(CAN1, &can_filter_init_struct);
- /* can interrupt config */
- nvic_irq_enable(CAN1_SE_IRQn, 0x00, 0x00);
- nvic_irq_enable(USBFS_L_CAN1_RX0_IRQn, 0x00, 0x00);
- can_interrupt_enable(CAN1, CAN_RF0MIEN_INT, TRUE);
- can_interrupt_enable(CAN1, CAN_ETRIEN_INT, TRUE);
- can_interrupt_enable(CAN1, CAN_EOIEN_INT, TRUE);
- }
- void can_transmit_data(void)
- {
- uint8_t transmit_mailbox;
- can_tx_message_type tx_message_struct;
- tx_message_struct.standard_id = 0x400;
- tx_message_struct.extended_id = 0;
- tx_message_struct.id_type = CAN_ID_STANDARD;
- tx_message_struct.frame_type = CAN_TFT_DATA;
- tx_message_struct.dlc = 8;
- tx_message_struct.data[0] = 0x11;
- tx_message_struct.data[1] = 0x22;
- tx_message_struct.data[2] = 0x33;
- tx_message_struct.data[3] = 0x44;
- tx_message_struct.data[4] = 0x55;
- tx_message_struct.data[5] = 0x66;
- tx_message_struct.data[6] = 0x77;
- tx_message_struct.data[7] = 0x88;
- transmit_mailbox = can_message_transmit(CAN1, &tx_message_struct);
- while(can_transmit_status_get(CAN1, (can_tx_mailbox_num_type)transmit_mailbox) != CAN_TX_STATUS_SUCCESSFUL);
- }
|