can结构

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)
	{
		
	}
			
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值