打印

GD32F303RB CAN通讯调不通

[复制链接]
1205|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zzccww|  楼主 | 2022-10-11 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚接触GD32,芯片是GD32F303RBT6。回环通讯可以,但两块板子之间无法通讯。现改为一块板子发送,通过CAN分析仪发送到PC端,这种情况比较简化一些,但PC端就是收不到数据。CAN控制器型号:NSi1050。用示波器看CANH和CANL之间的波形,波形就不对。折腾好几天没个结果,想到论坛里一定有很多熟悉GD32CAN通讯的朋友,就到这里来请教了。附上代码和图片。
int main(void)
{
    receive_flag = RESET;
    systick_config();
    /* configure GPIO */
    gpio_config();
    /* configure NVIC */
    nvic_config();
    /* initialize CAN */
    can_networking_init();
    /* enable CAN receive FIFO1 not empty interrupt */
    can_interrupt_enable(CAN0, CAN_INT_RFNE1);
    /* initialize transmit message */
    can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message);
    transmit_message.tx_sfid = 0x321;
    transmit_message.tx_efid = 0x01;
    transmit_message.tx_ft = CAN_FT_DATA;
    transmit_message.tx_ff = CAN_FF_STANDARD;
    transmit_message.tx_dlen = 1;
    /* initialize receive message */
    can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &receive_message);
    while(1)
    {

        delay_1ms(500);
        /* if transmit_number is 0x10, set it to 0x00 */
        if(transmit_number == 0x10)
        {
            transmit_number = 0x00;
         }else
         {
             transmit_message.tx_data[0] = transmit_number++;
             /* transmit message */
             can_message_transmit(CAN0, &transmit_message);
         }
        if(SET == receive_flag)
        {
            receive_flag = RESET;
        }
    }
}

void can_networking_init(void)
{
    can_parameter_struct            can_parameter;
    can_filter_parameter_struct     can_filter;
   
    can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
    can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);
   
    /* initialize CAN register */
    can_deinit(CANX);
   
    /* initialize CAN */
    can_parameter.time_triggered = DISABLE;
    can_parameter.auto_bus_off_recovery = DISABLE;
    can_parameter.auto_wake_up = DISABLE;
    can_parameter.auto_retrans = ENABLE;
    can_parameter.rec_fifo_overwrite = DISABLE;
    can_parameter.trans_fifo_order = DISABLE;
    can_parameter.working_mode = CAN_NORMAL_MODE;
    can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
    can_parameter.time_segment_1 = CAN_BT_BS1_6TQ;  //5
    can_parameter.time_segment_2 = CAN_BT_BS2_3TQ;  //4
    /* baudrate 1Mbps 125k*/
    can_parameter.prescaler = 48;//6
    can_init(CANX, &can_parameter);//CANX=CAN0      #define CANX CAN0

    /* initialize filter */
#ifdef  CAN0_USED
    /* CAN0 filter number */
    can_filter.filter_number = 0;
#else
    /* CAN1 filter number */
    can_filter.filter_number = 15;
#endif
    /* 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_FIFO1;
    can_filter.filter_enable = ENABLE;
    can_filter_init(&can_filter);
}

void gpio_config(void)
{
    /* enable CAN clock */
    rcu_periph_clock_enable(RCU_CAN0);
   
#ifdef GD32F30X_CL  /*GD32F30X_CL 未定义*/
    rcu_periph_clock_enable(RCU_CAN1);
    rcu_periph_clock_enable(RCU_GPIOB);
#endif
   
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_AF);
   
    /* configure CAN0 GPIO */
    gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12);        //CAN_TX
    gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_11);        //CAN_RX

//    gpio_pin_remap_config(GPIO_CAN0_FULL_REMAP,ENABLE);
    gpio_pin_remap_config(GPIO_CAN_FULL_REMAP,ENABLE);        //debug
   
#ifdef GD32F30X_CL
    /* configure CAN1 GPIO */
    gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_5);
    gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6);
    gpio_pin_remap_config(GPIO_CAN1_REMAP,ENABLE);
#endif
}

void nvic_config(void)
{
#ifdef  CAN0_USED   /*CAN0_USED 定义了的*/
    /* configure CAN0 NVIC */
    nvic_irq_enable(CAN0_RX1_IRQn,0,0);
#else
    /* configure CAN1 NVIC */
    nvic_irq_enable(CAN1_RX1_IRQn,0,0);
#endif

}

void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt)
{
    CAN_INTEN(can_periph) |= interrupt;
}

void can_struct_para_init(can_struct_type_enum type, void* p_struct)
{
    uint8_t i;
   
    if(NULL == p_struct){
        CAN_ERROR_HANDLE("struct parameter can not be NULL \r\n");
    }
   
    /* get type of the struct */
    switch(type){
        /* used for can_init() */
        case CAN_INIT_STRUCT:
            ((can_parameter_struct*)p_struct)->auto_bus_off_recovery = DISABLE;
            ((can_parameter_struct*)p_struct)->auto_retrans = DISABLE;
            ((can_parameter_struct*)p_struct)->auto_wake_up = DISABLE;
            ((can_parameter_struct*)p_struct)->prescaler = 0x03FFU;
            ((can_parameter_struct*)p_struct)->rec_fifo_overwrite = DISABLE;
            ((can_parameter_struct*)p_struct)->resync_jump_width = CAN_BT_SJW_1TQ;
            ((can_parameter_struct*)p_struct)->time_segment_1 = CAN_BT_BS1_3TQ;
            ((can_parameter_struct*)p_struct)->time_segment_2 = CAN_BT_BS2_1TQ;
            ((can_parameter_struct*)p_struct)->time_triggered = DISABLE;
            ((can_parameter_struct*)p_struct)->trans_fifo_order = DISABLE;
            ((can_parameter_struct*)p_struct)->working_mode = CAN_NORMAL_MODE;
            
            break;
        /* used for can_filter_init() */
        case CAN_FILTER_STRUCT:
            ((can_filter_parameter_struct*)p_struct)->filter_bits = CAN_FILTERBITS_32BIT;
            ((can_filter_parameter_struct*)p_struct)->filter_enable = DISABLE;
            ((can_filter_parameter_struct*)p_struct)->filter_fifo_number = CAN_FIFO0;
            ((can_filter_parameter_struct*)p_struct)->filter_list_high = 0x0000U;
            ((can_filter_parameter_struct*)p_struct)->filter_list_low = 0x0000U;
            ((can_filter_parameter_struct*)p_struct)->filter_mask_high = 0x0000U;
            ((can_filter_parameter_struct*)p_struct)->filter_mask_low = 0x0000U;
            ((can_filter_parameter_struct*)p_struct)->filter_mode = CAN_FILTERMODE_MASK;
            ((can_filter_parameter_struct*)p_struct)->filter_number = 0U;

            break;
        /* used for can_message_transmit() */
        case CAN_TX_MESSAGE_STRUCT:
            for(i = 0U; i < 8U; i++){
                ((can_trasnmit_message_struct*)p_struct)->tx_data[i] = 0U;
            }
            
            ((can_trasnmit_message_struct*)p_struct)->tx_dlen = 0u;
            ((can_trasnmit_message_struct*)p_struct)->tx_efid = 0U;
            ((can_trasnmit_message_struct*)p_struct)->tx_ff = (uint8_t)CAN_FF_STANDARD;
            ((can_trasnmit_message_struct*)p_struct)->tx_ft = (uint8_t)CAN_FT_DATA;
            ((can_trasnmit_message_struct*)p_struct)->tx_sfid = 0U;
            
            break;
        /* used for can_message_receive() */
        case CAN_RX_MESSAGE_STRUCT:
            for(i = 0U; i < 8U; i++){
                ((can_receive_message_struct*)p_struct)->rx_data[i] = 0U;
            }
            
            ((can_receive_message_struct*)p_struct)->rx_dlen = 0U;
            ((can_receive_message_struct*)p_struct)->rx_efid = 0U;
            ((can_receive_message_struct*)p_struct)->rx_ff = (uint8_t)CAN_FF_STANDARD;
            ((can_receive_message_struct*)p_struct)->rx_fi = 0U;
            ((can_receive_message_struct*)p_struct)->rx_ft = (uint8_t)CAN_FT_DATA;
            ((can_receive_message_struct*)p_struct)->rx_sfid = 0U;
            
            break;

        default:
            CAN_ERROR_HANDLE("parameter is invalid \r\n");
    }
}

E:\controller\杂项\*.*

使用特权

评论回复
沙发
zzccww|  楼主 | 2022-10-11 15:36 | 只看该作者
补上图片E:\controller\杂项\CAN波形.jpg

使用特权

评论回复
板凳
zzccww|  楼主 | 2022-10-11 15:39 | 只看该作者
图片发不出来呢

使用特权

评论回复
地板
zzccww|  楼主 | 2022-10-11 15:52 | 只看该作者
附上图片

CAN波形.jpg (201.1 KB )

CAN波形

CAN波形

CAN分析仪.jpg (317.56 KB )

CAN分析仪

CAN分析仪

NSi1050.jpg (237.25 KB )

CAN控制器芯片

CAN控制器芯片

上位机CAN工具软件.png (35.87 KB )

上位机CAN工具软件

上位机CAN工具软件

使用特权

评论回复
5
zzccww|  楼主 | 2022-10-11 16:51 | 只看该作者
请路过的大神指点一下,不胜感激!

使用特权

评论回复
6
liangqingbang| | 2022-10-11 16:57 | 只看该作者
终端电阻?

使用特权

评论回复
7
zzccww|  楼主 | 2022-10-11 17:02 | 只看该作者

没加呢

使用特权

评论回复
8
zzccww|  楼主 | 2022-10-11 17:03 | 只看该作者

距离近,就没加

使用特权

评论回复
9
zzccww|  楼主 | 2022-10-11 17:04 | 只看该作者

谢谢您的回复!

使用特权

评论回复
10
sagade| | 2022-10-11 19:18 | 只看该作者
gpio_config(); 里面,CAN的GPIO不需要gpio_pin_remap_config的吧

使用特权

评论回复
11
sagade| | 2022-10-11 19:26 | 只看该作者
C2-TX和C2-RX分别对应PA12和PA11吗?
C2-TX怎么接到1050的RXD上,C2-RX接到1050的TXD上了,是不是画反了

使用特权

评论回复
12
zzccww|  楼主 | 2022-10-11 20:43 | 只看该作者
sagade 发表于 2022-10-11 19:18
gpio_config(); 里面,CAN的GPIO不需要gpio_pin_remap_config的吧

感谢您的回复。我明天取消gpio_pin_remap_config试试

使用特权

评论回复
13
zzccww|  楼主 | 2022-10-11 20:45 | 只看该作者
sagade 发表于 2022-10-11 19:26
C2-TX和C2-RX分别对应PA12和PA11吗?
C2-TX怎么接到1050的RXD上,C2-RX接到1050的TXD上了,是不是画反了 ...

谢谢您的回复。C2-TX和C2-RX就是分别对应PA12和PA11。图确实有问题,但是实际电路是对的,我检查过的。

使用特权

评论回复
14
cooldog123pp| | 2022-10-11 21:49 | 只看该作者
CAN的波特率确定对么,你的分析仪设置了么,要设置的。

使用特权

评论回复
15
zzccww|  楼主 | 2022-10-12 08:27 | 只看该作者
cooldog123pp 发表于 2022-10-11 21:49
CAN的波特率确定对么,你的分析仪设置了么,要设置的。

谢谢您的提醒。波特率设好了的,两边都是125K。

使用特权

评论回复
16
zzccww|  楼主 | 2022-10-12 08:58 | 只看该作者
sagade 发表于 2022-10-11 19:18
gpio_config(); 里面,CAN的GPIO不需要gpio_pin_remap_config的吧

今天太高兴了,太谢谢您了!我一早按您说的把gpio_pin_remap_config取消了,上位机立马就收到数据了。

使用特权

评论回复
评论
zzccww 2022-10-12 12:35 回复TA
@zyj9490 :程序是能运行。但就是波形不对,接收方收不到数据 
zyj9490 2022-10-12 09:18 回复TA
端口转移错了。一开始单发的时测试下,能不能发得出来? 
17
圣骑士by| | 2022-10-12 15:32 | 只看该作者
注意:TVS选的不合适,可能会影响通信。

使用特权

评论回复
18
xmxu2022| | 2022-10-14 09:17 | 只看该作者

GD32F205RCT6的CAN通信无法接收数据

本帖最后由 xmxu2022 于 2022-10-14 10:02 编辑

GD芯片CAN通讯我也遇到问题卡壳,不知道哪位大侠能帮忙解决一下。
问题是:GD32F205RCT6的CAN通信无法接收数据

在移植到自己创建的(使用GD32F205RCT6芯片)工程中运行发现:CAN0和CAN1可以正常发送数据,但都无法接收到电脑发过来的数据,可是用示波器测CAN0和CAN1对应GD32F205RCT6芯片的接收引脚,数据波形又是正常的,这说明CAN通讯硬件电路是没有问题的。考虑到程序运行时电脑发送数据,虽然接收引脚数据波形正常,但程序无法进行接收中断,因此判定是程序的问题;而程序是兆易创新官网下载的例程移植过来的,为了排除自己做的项目工程程序中的其它部分对例程的影响,直接用例程只做部分IO的重定义以适应自己的硬件电路,发现GD32F205RCT6的CAN通信无法接收数据问题仍然一样。

程序部分B.zip

272.48 KB

程序部分A.zip

193.29 KB

CAN通讯电路部分.zip

56.79 KB

使用特权

评论回复
19
cooldog123pp| | 2022-10-29 16:54 | 只看该作者
xmxu2022 发表于 2022-10-14 09:17
GD芯片CAN通讯我也遇到问题卡壳,不知道哪位大侠能帮忙解决一下。
问题是:GD32F205RCT6的CAN通信无法接收 ...

看看是不是和楼主是同一个问题啊,管脚映射不对头啊。

使用特权

评论回复
20
tpgf| | 2022-11-2 11:47 | 只看该作者
需要确认有没有接收方 另外还得看接没接终端电阻

使用特权

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

本版积分规则

2

主题

22

帖子

0

粉丝