打印
[研电赛技术支持]

GD32F103C8T6低温CAN外设不正常

[复制链接]
4299|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xjycug|  楼主 | 2020-10-24 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次使用GD32F103
使用的型号是GD32F103C8T6,其实我想买CBT6结果采购人员鬼使神差地买回来了C8T6。我看资料工作温度范围是-40℃至85℃,
芯片用了定时器,IO,还有CAN等资源。常温下工作一切正常,CAN总线输出状态数据有七八包,每包数据都是定时1秒的周期输出,IO控制指示灯,周期闪烁。后来需要低温-40℃工作,在-40℃下指示灯周期闪烁,感觉正常,也能接入仿真器仿真工作,但是CAN总线输出状态数据不正常,对外表现为总线上应该1秒上报的各项状态只有一个状态项以不到10ms的周期,有时甚至只有3ms的间隔快速输出,其余状态总线上没有看到,通过仿真发现,发送采用的是FIFO方式,但是进入发送后,邮箱都是满的,无法访问,直接程序判断退出了。当温度从-40℃升高到-21℃后,CAN总线恢复正常,与常温表现一样。
我想问问使用过这个芯片的朋友,低温工作目前看只有CAN外设不正常,定时器,IO都正常CAN的波特率也正常,是这个外设有些寄存器需要注意设置吗?还是低温就是不可靠了?谢谢

使用特权

评论回复
评论
xjycug 2023-7-29 11:31 回复TA
@天月 :没解决,后来用STM32,程序还是那段程序,都是好的,-43°也没问题 
天月 2022-7-1 11:04 回复TA
解决了吗,是什么情况啊 
沙发
imdx| | 2020-10-25 07:55 | 只看该作者
本帖最后由 imdx 于 2020-10-25 08:03 编辑

收发器用的什么型号?是否满足-40温度?建议用替换法来测试,先替换收发器,然后换成同封装的STM32F103C8T6来测试,很容易定位到问题。

使用特权

评论回复
板凳
xjycug|  楼主 | 2020-10-25 09:22 | 只看该作者
收发使用的是周立功的CTM1051AM满足-40℃工作,单裸板放在温箱,其余的仿真器,CAN调试盒都在温箱外的常温环境,同封装的STM32F103CBT6换上去正常,兆易的板子通电工作,调整温箱温度,低于-21摄氏度不正常,高于-21℃正常,CAN程序不能访问发送寄存器,我想问问这个软件能解决吗?通过设置什么寄存器,重启一下,能不能好?

使用特权

评论回复
地板
imdx| | 2020-10-25 09:26 | 只看该作者
xjycug 发表于 2020-10-25 09:22
收发使用的是周立功的CTM1051AM满足-40℃工作,单裸板放在温箱,其余的仿真器,CAN调试盒都在温箱外的常温 ...

这样的话看起来是GD32F103C8T6本身的问题了,只能联系GD原厂了,看看他们怎么说。

使用特权

评论回复
5
xjycug|  楼主 | 2020-10-25 10:44 | 只看该作者
好的,谢谢

使用特权

评论回复
6
C666| | 2020-10-25 20:29 | 只看该作者

您好   GD原厂针对这个问题有回复了吗?  另外想了解一下低温发送有问题 can接收有没有问题?

使用特权

评论回复
7
lvben5d| | 2020-10-26 08:24 | 只看该作者
CBT6 就浪费了  128KFLASH  , 对了,楼主这个-40° 应用是什么样的环境,比较苛刻。 如果感觉芯片扛不住,可以把芯片三防漆密封起来试试,可以减少同外界热传递,这样就不怕冷一些,不过怕热。

使用特权

评论回复
8
2722554400| | 2020-11-4 09:58 | 只看该作者
遇见过一样的问题, 当时使用的是单片机的HSI, 后来加了个外部晶振解决了

使用特权

评论回复
9
lvben5d| | 2020-11-4 13:19 | 只看该作者
2722554400 发表于 2020-11-4 09:58
遇见过一样的问题, 当时使用的是单片机的HSI, 后来加了个外部晶振解决了 ...

你这个是因为内部 HSI  是RC震荡,本身工艺就有1%偏差(25°下标定),温度过低或过高,这个基准就不知道偏哪了,你弄个串口115200bps 或许还可以正常运行, 上到500kbps的CAN 不就危险了。

使用特权

评论回复
10
2722554400| | 2020-11-9 22:26 | 只看该作者
本帖最后由 2722554400 于 2020-11-11 09:59 编辑
lvben5d 发表于 2020-11-4 13:19
你这个是因为内部 HSI  是RC震荡,本身工艺就有1%偏差(25°下标定),温度过低或过高,这个基准就不知道偏 ...

使用特权

评论回复
11
lzgztm5211314| | 2021-4-22 10:19 | 只看该作者
GD32F103VC  CAN发送一直失败,恳请楼主指点指点,从STM32移植过来的

使用特权

评论回复
12
chenyelong| | 2021-5-6 10:22 | 只看该作者
lzgztm5211314 发表于 2021-4-22 10:19
GD32F103VC  CAN发送一直失败,恳请楼主指点指点,从STM32移植过来的

can通信解决了吗

使用特权

评论回复
13
Michael_Pu1005| | 2021-11-16 09:46 | 只看该作者
大佬,我用的GD32F103RBT8,can0,回环可以发数,收数也可以进中断,单端口没波形。正常模式时钟发不了数据,也收不到数据。帮我看看啊

使用特权

评论回复
14
Michael_Pu1005| | 2021-11-16 09:48 | 只看该作者
#include "gd32f10x.h"
#include "systick.h"
#include <stdio.h>

//-------------------------------------------------------------------------------------------------------------------------------------------------------------
void Delay(unsigned long i)
{
    while(i--) ;
}
can_trasnmit_message_struct transmit_message;
can_receive_message_struct receive_message;
uint16_t receive_flag=0;

void CAN0_RX1_IRQHandler(void)
{
    /* check the receive message */
    can_message_receive(CAN0, CAN_FIFO1, &receive_message);
        gpio_bit_write(GPIOC, GPIO_PIN_1,(bit_status)(1-gpio_input_bit_get(GPIOC, GPIO_PIN_1)));
        //gpio_bit_write(GPIOC, GPIO_PIN_13,(bit_status)(1-gpio_input_bit_get(GPIOC, GPIO_PIN_13)));
    if((0x321 == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff) && (2 == receive_message.rx_dlen)){
        receive_flag = SET;
    }
}

void can_config(void)
{
        can_parameter_struct can_parameter;
    can_filter_parameter_struct can_filter;
       
    /* initialize CAN register */
    can_deinit(CAN0);
   
    /* initialize CAN parameters */
    can_parameter.time_triggered = DISABLE;
    can_parameter.auto_bus_off_recovery = DISABLE;
    can_parameter.auto_wake_up = DISABLE;
    can_parameter.no_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_3TQ;
    can_parameter.time_segment_2 = CAN_BT_BS2_2TQ;       
        can_parameter.prescaler = 80;   //72M / 120 / (2+3+1) =  10000kbps
    can_init(CAN0, &can_parameter);
   
    /* initialize filter */
    can_filter.filter_number=0;
    can_filter.filter_mode = CAN_FILTERMODE_MASK;
    can_filter.filter_bits = CAN_FILTERBITS_32BIT;
    can_filter.filter_list_high = 0x0020;
    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);

        nvic_irq_enable(CAN0_RX1_IRQn, 0, 0);
        can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE1);       
}

uint32_t timeout = 0xFFFF;
uint8_t transmit_mailbox = 0;
can_transmit_state_enum state=0;

int main(void)
{       
        Delay(2000000);   
    systick_config();
       
        rcu_periph_clock_enable(RCU_GPIOC);
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
       
    rcu_periph_clock_enable(RCU_CAN0);
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_8);        //PB12 -- CAN1_RX
        gpio_pin_remap_config(GPIO_CAN_FULL_REMAP,ENABLE);       

    can_config();

    transmit_message.tx_sfid = 0x0002;        //standard format frame identifier
    transmit_message.tx_efid = 0x00;        //extended format frame identifier
    transmit_message.tx_ft = CAN_FT_DATA;        //type of frame, data or remote
    transmit_message.tx_ff = CAN_FF_STANDARD;        //format of frame, standard or extended format
    transmit_message.tx_dlen = 2;        //data length
    transmit_message.tx_data[0] = 0x11;
    transmit_message.tx_data[1] = 0x22;

        while(1)
        {       
                transmit_mailbox=can_message_transmit(CAN0, &transmit_message);
                timeout = can_transmit_states(CAN0, transmit_mailbox);
                //gpio_bit_write(GPIOC, GPIO_PIN_1,(bit_status)(1-gpio_input_bit_get(GPIOC, GPIO_PIN_1)));
                Delay(2000000);               

        }
        return 0;
}

使用特权

评论回复
15
cgeng| | 2021-11-17 00:50 | 只看该作者
我感觉是IO的配置问题,你PB8没有配成AF模式哇?

使用特权

评论回复
16
autodash| | 2021-11-17 12:46 | 只看该作者
   can_filter.filter_list_high = 0x0020; <----------设置错误 ,如果不过滤你设置成0,如果你想只接受0x20这个ID, 写成( 0x20<<5)
    can_filter.filter_list_low = 0x0000;
    can_filter.filter_mask_high = 0x0000;
    can_filter.filter_mask_low = 0x0000;  

使用特权

评论回复
17
JackChenChen| | 2022-7-5 17:32 | 只看该作者
@xjycug 你好,楼主!低温CAN的问题解决了,我也有用到这样的场景,但是我没这样测试过啊,被你这个现象吓到了啊~关注中……

使用特权

评论回复
18
chenqianqian| | 2022-7-5 21:07 | 只看该作者
收发器是不是用的工业级的?

使用特权

评论回复
19
xjycug|  楼主 | 2022-11-13 07:45 | 只看该作者
后来没再用GD32了,还是STM32,以后有机会再试试。当时仅仅更换了STM32,低温-43℃也没问题。应该还是GD的问题,问过代理,解释说批次的问题,还几个板子都试了,现象一样

使用特权

评论回复
20
chenqianqian| | 2022-11-19 11:24 | 只看该作者
看来质量还是有点区别啊

使用特权

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

本版积分规则

20

主题

185

帖子

2

粉丝