can波特率计算方式
/**
CAN初始化
*/
#include "can.h"
//CAN0_QUEUE Can0_Rcv_Msg; //接收BUF
//CAN0_QUEUE Can0_Snd_Msg; //发送BUF
//CAN1_QUEUE Can1_Rcv_Msg; //接收BUF
//CAN1_QUEUE Can1_Snd_Msg; //发送BUF
can_receive_message_struct MyCAN_RxMsg;
uint8_t MyCAN_RxFlag;
//波特率函数列表
typedef struct{
uint8_t SJW;
uint8_t BS1;
uint8_t BS2;
uint16_t PreScale;
}TCAN_BaudRate;
TCAN_BaudRate CAN_BaudRateInitTab[]= { // CLK=54MHz
{CAN_BT_SJW_1TQ, CAN_BT_BS1_6TQ, CAN_BT_BS2_2TQ, 6}, // 1M 54/6/(1+6+2) = 1M
{CAN_BT_SJW_1TQ, CAN_BT_BS1_7TQ, CAN_BT_BS2_1TQ, 12}, // 500K
{CAN_BT_SJW_1TQ, CAN_BT_BS1_6TQ, CAN_BT_BS2_1TQ, 27}, // 250K
{CAN_BT_SJW_1TQ, CAN_BT_BS1_15TQ, CAN_BT_BS2_2TQ, 15}, // 200K
{CAN_BT_SJW_1TQ, CAN_BT_BS1_6TQ, CAN_BT_BS2_1TQ, 54}, // 125K
{CAN_BT_SJW_1TQ, CAN_BT_BS1_7TQ, CAN_BT_BS2_1TQ, 60}, // 100K
};
//单位K
uint32_t CAN_GetBaudRateNum(uint32_t BaudRate)
{
switch(BaudRate){
case 1000:return 0;
case 500 :return 1;
case 250 :return 2;
case 200 :return 3;
case 125 :return 4;
case 100 :return 5;
default :return 0;
}
}
void CAN0_Init(uint16_t Baud)
{
can_parameter_struct can_parameter;
can_filter_parameter_struct can_filter;
//端口设置
/* enable can clock */
rcu_periph_clock_enable(RCU_CAN0);
rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_AF);
gpio_pin_remap_config(GPIO_CAN0_FULL_REMAP,ENABLE);
/* configure CAN0 GPIO, CAN0_TX(PD1) and CAN0_RX(PD0) */
gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
gpio_init(GPIOD, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
//功能配置
/* initialize CAN register */
can_deinit(CAN0);
/* initialize CAN */
can_parameter.working_mode = CAN_NORMAL_MODE;//CAN_SILENT_MODE;// //CAN_NORMAL_MODE; //正常模式
can_parameter.resync_jump_width = CAN_BaudRateInitTab[CAN_GetBaudRateNum(Baud)].SJW;
can_parameter.time_segment_1 = CAN_BaudRateInitTab[CAN_GetBaudRateNum(Baud)].BS1;
can_parameter.time_segment_2 = CAN_BaudRateInitTab[CAN_GetBaudRateNum(Baud)].BS2;
can_parameter.prescaler = CAN_BaudRateInitTab[CAN_GetBaudRateNum(Baud)].PreScale; //波特率预分频器
can_parameter.time_triggered = DISABLE; //时间触发通信模式
can_parameter.auto_bus_off_recovery = ENABLE; //自动总线关闭恢复
can_parameter.auto_wake_up = DISABLE; //自动唤醒模式
can_parameter.no_auto_retrans = DISABLE; //自动重传模式禁用
can_parameter.rec_fifo_overwrite = DISABLE; //接收 FIFO 覆盖模式
can_parameter.trans_fifo_order = DISABLE; //发送先进先出顺序
can_init(CAN0, &can_parameter);
// 滤波器配置
/* initialize filter */
/* CAN0 filter number */
can_filter.filter_number = 0; //过滤器号
/* 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_FIFO0; //接收与过滤器关联的 FIFO
can_filter.filter_enable = ENABLE; //过滤工作与否
can_filter_init(&can_filter);
// 配置NVIC
nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);// 分组
nvic_irq_enable(CAN0_RX0_IRQn,0,2);// CAN0_RX0_IRQn 中断通道
//中断使能
/* enable CAN receive FIFO0 not empty interrupt(FIFO0 RFNE0) */
can_interrupt_enable(CAN0, CAN_INT_RFNE0); // 开启了CAN外设的RFNE0的中断信号输出
}
void MyCAN_Transmit(can_trasnmit_message_struct* transmit_message)
{
/* 发送数据 */
uint8_t transmit_mailbox_number = can_message_transmit(CAN0, transmit_message);
uint32_t Timeout = 0;
while(can_transmit_states(CAN0, transmit_mailbox_number) == CAN_TRANSMIT_FAILED)
{
Timeout ++;
if (Timeout > 100000)
{
break;
}
}
}
// uint8_t MyCAN_ReceiveFlag(void)
//{
// /* CAN receive message length */
// if (can_receive_message_length_get(CAN0, CAN_FIFO0) > 0)
// {
// return 1;
// }
// return 0;
//}
// void MyCAN_Receive(can_receive_message_struct*RxMessage)
//{
// /* CAN receive message */
// can_message_receive(CAN0, CAN_FIFO0, RxMessage);
//}
//USBD_LP_CAN0_RX0_IRQHandler
//CAN0接收中断
void CAN0_RX0_IRQHandler(void)
{
if(can_interrupt_flag_get(CAN0, CAN_INT_FLAG_RFL0) == SET)
{
can_message_receive(CAN0, CAN_FIFO0, &MyCAN_RxMsg);
MyCAN_RxFlag = 1;// 标志位,在主循环处理
}
if(MyCAN_RxMsg.rx_sfid == 0x03c)
{
}
}