打印
[AT32F403/403A]

AT32F403A的PA11与PA12能用CAN1吗?但官方BSP里面没有相应的配置代码

[复制链接]
923|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vhuanyou|  楼主 | 2022-10-21 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AT32F403A的PA11与PA12能用CAN1吗?但官方BSP里面没有相应的配置代码,要配置PA11PA12只有AT32F407才有这行代码?

使用特权

评论回复
沙发
muyichuan2012| | 2022-10-21 17:08 | 只看该作者
CAN1和CAN2完全一样的设计,仅需把CAN2的相关配置修改为CAN1即可。
另外407和403A除了网口,其他完全一样的,在CAN外设无任何差别。

使用特权

评论回复
板凳
i269725520| | 2022-10-21 17:24 | 只看该作者
今天刚好用到这个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发送数据

使用特权

评论回复
地板
vhuanyou|  楼主 | 2022-10-21 17:25 | 只看该作者
muyichuan2012 发表于 2022-10-21 17:08
CAN1和CAN2完全一样的设计,仅需把CAN2的相关配置修改为CAN1即可。
另外407和403A除了网口,其他完全一样的 ...

使用PB8、PB9这个IO口CAN通信正常,PA11、PA12就不行。代码是用STM32F1的HAL库,在STM32板上运行正常,吹掉芯片替换AT32就不行。

使用特权

评论回复
5
i269725520| | 2022-10-21 17:28 | 只看该作者
用AT库  毕竟他自己的库用起来没问题

使用特权

评论回复
6
i269725520| | 2022-10-21 17:30 | 只看该作者
vhuanyou 发表于 2022-10-21 17:25
使用PB8、PB9这个IO口CAN通信正常,PA11、PA12就不行。代码是用STM32F1的HAL库,在STM32板上运行正常,吹 ...

默认是usb  要复用

使用特权

评论回复
7
vhuanyou|  楼主 | 2022-10-26 14:15 | 只看该作者
多谢,问题解决了,贴的CAN芯片型号不对

使用特权

评论回复
8
doze| | 2022-11-2 15:59 | 只看该作者
AT32F415 碰到同样的问题

使用特权

评论回复
9
doze| | 2022-11-2 17:47 | 只看该作者
原因是开发板的PA11,PA12默认用作USB,如果用作CAN,需要把开发板的0Ω电阻 R29,R30 焊接上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

59

帖子

1

粉丝