今天刚好用到这个can1 测试通过
void can_gpio_config(void) //PA11 PA12
{
//////////////////////////////////////////////PA11 PA12
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct); /* 初始化 GPIO 配置结构体 */
/* 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_12;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &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_11;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOA, &gpio_init_struct);
///////////////////////////////////////////////////////PB8 PB9 CAN1 引脚复用到 PB9 PB8
//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);
////////////////////////////
}
/**
* @brief can configiguration.
* @param none
* @retval none
*/
void can_configuration(void) ///500K
{
can_base_type can_base_struct;
can_baudrate_type can_baudrate_struct;
can_filter_init_type can_filter_init_struct;
/* enable the can clock */
crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE); /* 使能 CAN 时钟 */
/* can 基础配置 */
can_default_para_init(&can_base_struct); /* 初始化 CAN 基础配置结构体 */
can_base_struct.mode_selection = CAN_MODE_COMMUNICATE; /* CAN 模式:正常通信模式 */
// can_base_struct.mode_selection = CAN_MODE_LOOPBACK;//回环模式
can_base_struct.ttc_enable = FALSE; /* CAN 时间触发模式(时间戳):关闭 */
can_base_struct.aebo_enable = TRUE; /* 自动退出离线功能:开启 */
can_base_struct.aed_enable = TRUE; /* 自动退出睡眠功能:开启 */
can_base_struct.prsf_enable = FALSE; /* 禁止自动重传:关闭(即开启自动重传—同 CAN 标准协议) */
can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED; /* 报文溢出丢弃规则:丢弃之前收到的报文,保留最新收到的报文 */
can_base_struct.mmssr_selection = CAN_SENDING_BY_ID; /* 报文发送优先级:根据 ID(ID 小的先发送) */
can_base_init(CAN1, &can_base_struct); /* 将以上配置写入 CAN 主控制寄存器 */
/* can 波特率配置:
can baudrate, set boudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size))
此处 pclk=144M;
因此 boudrate = 36/(9*(1+6+1))=500Kbps
*/
can_baudrate_struct.baudrate_div = 9;
can_baudrate_struct.rsaw_size = CAN_RSAW_1TQ;
can_baudrate_struct.bts1_size = CAN_BTS1_6TQ;
can_baudrate_struct.bts2_size = CAN_BTS2_1TQ;
can_baudrate_set(CAN1, &can_baudrate_struct);
/* can 过滤器配置 */
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; /* 使用哪个 FIFO(FIFO1/FIFO1):FIFO0 */
can_filter_init_struct.filter_number = 0; /* 使用哪个过滤器组(0~27):0 */
can_filter_init_struct.filter_bit = CAN_FILTER_32BIT; /* 过滤器位宽:32bit 宽度 */
can_filter_init_struct.filter_id_high = 0; /* 过滤器 ID 高位设定:0 */
can_filter_init_struct.filter_id_low = 0; /* 过滤器 ID 低位设定:0 */
can_filter_init_struct.filter_mask_high = 0; /* 过滤器掩码高位设定:0(即所有位都不关心,所有 ID都可以通过) */
can_filter_init_struct.filter_mask_low = 0; /* 过滤器掩码低位设定:0(即所有位都不关心,所有 ID都可以通过) */
can_filter_init(CAN1, &can_filter_init_struct); /* 将以上配置写入过滤器相关寄存器 */
/* can 中断配置 */
nvic_irq_enable(CAN1_SE_IRQn, 0x00, 0x00); /* 中断优先级配置及使能:CAN1 状态变化/错误中断 */
nvic_irq_enable(USBFS_L_CAN1_RX0_IRQn, 0x00, 0x00); /* 中断优先级配置及使能:CAN1 FIFO0 接收中断*/
can_interrupt_enable(CAN1, CAN_RF0MIEN_INT, TRUE); /* CAN1 FIFO0 非空中断使能:FIFO0接收到一帧有效数据即产生中断 */
can_interrupt_enable(CAN1, CAN_ETRIEN_INT, TRUE); /* 错误类型记录中断使能:ETR[2:0]不为0 时产生中断 */
can_interrupt_enable(CAN1, CAN_EOIEN_INT, TRUE); /* CAN1 错误中断使能:所有错误中断的总开关 */
}
////////////////// 测试
can_transmit_data();//can发送数据
|