int can_receive_cnt = 0;
// CAN接收处理
void CAN0_RX0_IRQHandler(void)
{
uint8_t i;
can_message_receive(CAN0, CAN_FIFO0, &g_receive_message);
can_receive_cnt++;
}
void CanCtrl(void)
{
// CanSend();
fdcan_send();
}
void fdcan_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_CAN0);
gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_11);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12);
can_parameter_struct can_parameter;
can_fdframe_struct can_fd_parameter;
can_fd_tdc_struct can_fd_tdc_parameter;
can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
can_deinit(CAN0);
// can_deinit(CAN1);
CAN_CTL(CAN0) |= CAN_CTL_SWRST;
while((CAN_CTL(CAN0) & CAN_CTL_SWRST) != 0);
while((CAN_STAT(CAN0) & CAN_STAT_SLPWS) == 0);
can_parameter.time_triggered = DISABLE;
can_parameter.auto_bus_off_recovery = DISABLE;
can_parameter.auto_wake_up = DISABLE;
can_parameter.auto_retrans = ENABLE;
can_parameter.rec_fifo_overwrite = ENABLE;
can_parameter.trans_fifo_order = ENABLE;
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;
can_parameter.prescaler = 6;
can_init(CAN0, &can_parameter);
// can_init(CAN1, &can_parameter);
can_struct_para_init(CAN_FD_FRAME_STRUCT, &can_fd_parameter);
can_fd_parameter.fd_frame = ENABLE;
can_fd_parameter.excp_event_detect = ENABLE;
can_fd_parameter.delay_compensation = ENABLE;
can_fd_tdc_parameter.tdc_filter = 0x04;
can_fd_tdc_parameter.tdc_mode = CAN_TDCMOD_CALC_AND_OFFSET;
can_fd_tdc_parameter.tdc_offset = 0x04;
can_fd_parameter.p_delay_compensation = &can_fd_tdc_parameter;
can_fd_parameter.iso_bosch = CAN_FDMOD_ISO;
can_fd_parameter.esi_mode = CAN_ESIMOD_HARDWARE;
can_fd_parameter.data_resync_jump_width = CAN_BT_SJW_1TQ;
can_fd_parameter.data_time_segment_1 = CAN_BT_BS1_2TQ;
can_fd_parameter.data_time_segment_2 = CAN_BT_BS2_1TQ;
can_fd_parameter.data_prescaler = 4;
can_fd_init(CAN0, &can_fd_parameter);
// CAN_FDCTL(CAN0) |= CAN_FDCTL_FDEN;
// can_fd_init(CAN1, &can_fd_parameter);
can1_filter_start_bank(14);
can_filter_mask_mode_init(0x123, 0x0000, CAN_STANDARD_FIFO0, 0);
// can_filter_mask_mode_init(0x123, 0x0000, CAN_STANDARD_FIFO0, 15);
nvic_irq_enable(CAN0_RX0_IRQn, 0, 0);
// nvic_irq_enable(CAN1_RX0_IRQn, 0, 0);
can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0);
// can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE0);
can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &g_transmit_message);
g_transmit_message.tx_sfid = 0x00;
g_transmit_message.tx_efid = 0x00;
g_transmit_message.tx_ft = CAN_FT_DATA;
g_transmit_message.tx_ff = CAN_FF_STANDARD;
g_transmit_message.tx_dlen = 64;
g_transmit_message.fd_flag = CAN_FDF_FDFRAME;
g_transmit_message.fd_brs = 1;
g_transmit_message.fd_esi = 0;
/* initialize receive message */
can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &g_receive_message);
}
int can_send_cnt = 0;
void fdcan_send(void)
{
if(timerStr.flag.bit._100ms==1)
{
g_transmit_message.tx_sfid = 0x123;
for(uint8_t i = 0;i < 64;i++)
{
g_transmit_message.tx_data[0+i] = 0xaa;
}
can_message_transmit(CAN0, &g_transmit_message);
can_send_cnt++;
}
}
在main函数中先调用初始化,再发送,APB1是60MHZ的,用示波器查看CANHIGH与地的波形,发现没有明显的波形变化,在2.5v附近的一条类似直线
|
|