本例子是在GD32f470芯片上实现的,通过配置CAN1初始化和发送函数,500k最大限度实现1ms发送3帧报文。
一、CAN1初始化
void Can1_Init(uint32_t baud,uint8_t MasterSlave)
{
can_parameter_struct can_parameter;
can_filter_parameter_struct can_filter;
/* initialize CAN register */
rcu_periph_clock_enable(RCU_CAN1);
can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);//Initialization parameters
can_deinit(CAN1);
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 = ENABLE;
can_parameter.working_mode = CAN_NORMAL_MODE;
if(baud == 125)
{
//CAN baud AP1_60MHz/(20*(4+16+4))=125kHz
can_parameter.resync_jump_width = CAN_BT_SJW_4TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_16TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
can_parameter.prescaler = 20;
}
else if(baud == 250)
{
//CAN Baud AP1_60MHz/(15*(1+14+1))=250kHz
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_14TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
can_parameter.prescaler = 15;
}
else if(baud == 500)
{
//CAN baud AP1_60MHz/(15*(1+6+1))=250kHz
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_6TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
can_parameter.prescaler = 15;
}
else if(baud == 1000)
{
//CAN baud AP1_60MHz/(15*(1+2+1))=1000kHz
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_2TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
can_parameter.prescaler = 15;
}
/* initialize CAN */
can_init(CAN1, &can_parameter);
/* initialize filter */
/* CAN0 filter number */
can_filter.filter_number = 15;
/* initialize filter */
can_filter.filter_mode = CAN_FILTERMODE_MASK;
can_filter.filter_bits = CAN_FILTERBITS_32BIT;
if(MasterSlave == 0) //Master
{
can_filter.filter_list_high = 0x0000;
can_filter.filter_list_low = 0x0000;
can_filter.filter_mask_high = 0x0000;
can_filter.filter_mask_low = 0x0000;
}
else if(MasterSlave == 1) //Slave
{
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);
can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE1);
/* configure CAN1 NVIC */
nvic_irq_enable(CAN1_RX1_IRQn, 6, 0);
}
二、CAN1发送函数
//CAN1修改
int SendByCan1(unsigned int std,void* data,const int len)
{
can_trasnmit_message_struct TxMessage = {0};//Define Send Message Structure
volatile uint32_t i = 0;
uint8_t TransmitMailbox = 0;
TxMessage.tx_sfid = std;
TxMessage.tx_efid = std;
TxMessage.tx_ft =CAN_FT_DATA; //Set the frame type of the message to be transmitted: data frame
TxMessage.tx_ff =CAN_FF_EXTENDED; //Extended identifier
TxMessage.tx_dlen = (len> 8)?8:len;
volatile uint8_t *psrc = (uint8_t*)data;
for(i=0; i<len; i++)
{
TxMessage.tx_data[i] = psrc[i];
}
TransmitMailbox = can_message_transmit(CAN1,&TxMessage);//Start the transmission of a message
i = 0;
while((i<0XFFF))
{
if(can_transmit_states(CAN1,TransmitMailbox) == 1)break;
i++;
}
if(i < 0XFFF)
{
return 0;
}
else
{
return -1;
}
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_37822396/article/details/147744684
|