基于STM32/GD32的双CAN、一路485开发板

双CAN、一路485开发板的设计

最近工作经常会出现一些小问题。就想设计一款带CAN的开发板用来测试代码,于是就设计了一款双CAN带一路485的开发板。 此篇文章是关于开发板的设计方案。

开发板配置

  • 双路CAN通信
  • 一路485通信(两路串口可选)
  • 一个EEPROM存储
  • 三个LED指示灯
  • 三个按键
  • 其余所有IO口引出

器件选型

主控采用了国产兆易的GD互联型芯片,有两路CAN通信,CAN采用目前比较流程TJA1057方案。以下是主要的器件选型:

  1. 主控MCU :GD32F105RBT6
  2. CAN芯片:TJA1057T
  3. 485芯片:MAX3485ESA
  4. EEPROM芯片:AT24C128
  5. 电源芯片芯片:ASM1117-3.3V

CAN设计

硬件设计

CAN设计采用TJA1057T设计,由于TJA1057T是5V芯片,需要在Rx到单片机采用一个电压转换电路。为了节省成本,我们采用一个分压电阻,将电压调试到3.3V。设计还并联了一个120欧的匹配电阻,和一个跳线帽串联起来,用户可以通过跳线帽先择是否接入120电阻。这题设计如图所示。
在这里插入图片描述

软件设计

CAN波特率计算:波特率 = APB1频率 / CAN分频 / (BS1 + BS2 +1);
这里初始化采用的是掩码模式,掩码中设置的为1时,报文ID为必须匹配,掩码为0时报文ID为无关紧要。例如ID为:0x18FF1111。当掩码设置为0x1FFF FFFF时。只有接收到0x18FF1111才会通过滤波进入CAN接收中断。当掩码设置为0x1FFFFFFE时,可以接收到0x18FF1110和0x18FF1111。

void SysInit_CAN(void)
{
    /* CANs configuration */
    CAN_Config();
    /* IT Configuration for CAN1 */
    can_interrupt_enable(CAN0,  ENABLE);
    can_interrupt_enable(CAN1,  ENABLE);
}
/*CAN初始化*/
void CAN_Config(void)
{
    uint32_t id ;
    can_parameter_struct CAN_InitStructure;
    can_filter_parameter_struct CAN_FilterInitStructure;

    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_CAN0);
    rcu_periph_clock_enable(RCU_CAN1);
    rcu_periph_clock_enable(RCU_AF);
    /* Configure CAN1 RX pin */
	gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP, ENABLE);
    gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);

    gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_10MHZ, GPIO_PIN_12);
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_13);
    /* Configure CAN1 TX pin */

    /* CAN1 and CAN2 register init */
    can_deinit(CAN0);
    can_deinit(CAN1);

    /* initialize CAN */
    CAN_InitStructure.time_triggered = DISABLE;
    CAN_InitStructure.auto_bus_off_recovery = ENABLE;
    CAN_InitStructure.auto_wake_up = DISABLE;
    CAN_InitStructure.auto_retrans = DISABLE;
    CAN_InitStructure.rec_fifo_overwrite = DISABLE;
    CAN_InitStructure.trans_fifo_order = DISABLE;
    CAN_InitStructure.working_mode = CAN_NORMAL_MODE;
    CAN_InitStructure.resync_jump_width = CAN_BT_SJW_1TQ;
    CAN_InitStructure.time_segment_1 = CAN_BT_BS1_6TQ;
    CAN_InitStructure.time_segment_2 = CAN_BT_BS2_1TQ;

    /* baudrate 250K bps */
    CAN_InitStructure.prescaler = 6;
    can_init(CAN0, &CAN_InitStructure);
    CAN_InitStructure.prescaler = 6;
    can_init(CAN1, &CAN_InitStructure);

    /* initialize filter */
    id = 0x18ffffff;//需过滤的EXT_ID
    /* CAN0 filter number */
    CAN_FilterInitStructure.filter_number = 0;
    /* initialize filter */
    CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;
    CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;
    CAN_FilterInitStructure.filter_list_high = (((u32)id <<3)&0xFFFF0000)>>16;;
    CAN_FilterInitStructure.filter_list_low = (((u32)id <<3)|CAN_FF_STANDARD|CAN_FF_EXTENDED)&0xFFFF;;
    CAN_FilterInitStructure.filter_mask_high = 0x0000;
    CAN_FilterInitStructure.filter_mask_low = 0x0000;
    CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;
    CAN_FilterInitStructure.filter_enable = ENABLE;
    can_filter_init(&CAN_FilterInitStructure);

    /* initialize filter */
    id = 0x18ffffff;//需过滤的EXT_ID
    /* CAN0 filter number */
    CAN_FilterInitStructure.filter_number = 15;
    /* initialize filter */
    CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;
    CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;
    CAN_FilterInitStructure.filter_list_high = (((u32)id <<3)&0xFFFF0000)>>16;;
    CAN_FilterInitStructure.filter_list_low = (((u32)id <<3)|CAN_FF_STANDARD|CAN_FF_EXTENDED)&0xFFFF;;
    CAN_FilterInitStructure.filter_mask_high = 0x0000;
    CAN_FilterInitStructure.filter_mask_low = 0x0000;
    CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;
    CAN_FilterInitStructure.filter_enable = ENABLE;
    can_filter_init(&CAN_FilterInitStructure);

    can_interrupt_enable(CAN0, CAN_INT_RFNE0);
    can_interrupt_enable(CAN1, CAN_INT_RFNE0);
}
/*CAN0接收中断*/
void CAN0_RX0_IRQHandler(void)
{
    Init_RxMes(&RxMessage);
    can_message_receive(CAN0, CAN_FIFO0, &RxMessage);
    CAN0_RXData();
}
/*CAN1接收中断*/
void CAN1_RX0_IRQHandler(void)
{
    Init_RxMes(&RxMessage);
    can_message_receive(CAN1, CAN_FIFO0, &RxMessage);
    CAN1_RXData();
}

485设计

485硬件设计采用了自动收发报文的设计。具体实现方案可以自行百度搜索。

硬件设计

在这里插入图片描述

软件设计

软件就是一般的串口初始化。

/*IO口初始化*/
void usart_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_AF);
    rcu_periph_clock_enable(RCU_USART0);

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    usart_deinit(USART0);
    usart_baudrate_set(USART0, 9600);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);

    usart_interrupt_enable(USART0, USART_INT_RBNE);

    nvic_irq_enable(USART0_IRQn,1,2);
}

/* retarget the C library printf function to the usart */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t) ch);
    while (RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}
/*串口0接收中断*/
void USART0_IRQHandler(void)
{
    uint16_t data;

    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
    {
        /* receive data */
        data = usart_data_receive(USART0);
        usart_data_receive(USART0);
    }
}

其他设计

LED硬件

硬件LED采用的是共阴极,IO口驱动的话输出高电平LED点亮。
在这里插入图片描述

按键硬件

硬件按键采用的是监测地。配置IO口时要配置为上拉输入。当IO口监测到低电平时表示按键按下。

在这里插入图片描述

PCB板子和实物图

在这里插入图片描述
在这里插入图片描述

开发板测试视频

板子焊接好后,按照如图所示插上相应的跳线帽,通过5VType-C口给模块供电。测试代码固件烧录进去之后,三个LED点亮,其中一个LED0.5HZ频率闪烁。按下按键后,相应的LED灯切换状态。串口波特率为9600,并且每1秒输出Shiboven PCB-018 测试固件 V1.0 CAN测试请使用5VUSB供电。两路CAN波特率都为250k。两路CAN都是250K波特率并每1秒输出一路为:ID0x12345678,另一路为0x17654321

注意:CANH、CANL别接反了。485A、485B也别接反了!!!

双CAN+一路485演示视频演示视频

其他资料

资料包中有硬件软件源码及其他资料。包括一堆CAN资料包。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

释博文

您的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值