3070|6

53

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【先楫HPM6750测评】测试CAN收发 [复制链接]

 

        HPM6750有4个CAN控制器,支持CANFD,目前在工业上用的还是CAN2.0比较多,本次测评使用CAN1控制器。CAN驱动芯片使用TI的VD230,电脑端使用了一个USB转CAN调试器,带有调试上位机软件。

连线如下:

1.初始化CAN引脚和时钟

        HPM_IOC->PAD[IOC_PAD_PE31].FUNC_CTL = IOC_PE31_FUNC_CTL_CAN1_TXD;
        HPM_IOC->PAD[IOC_PAD_PE30].FUNC_CTL = IOC_PE30_FUNC_CTL_CAN1_RXD;

        /* Set the CAN1 peripheral clock to 80MHz */
        clock_set_source_divider(clock_can1, clk_src_pll1_clk1, 5);
        freq = clock_get_frequency(clock_can1);

2.初始化CAN

        can_config_t can_config;
        can_get_default_config(&can_config);
        can_config.baudrate = 500000; /* 500kbps */
        can_config.mode = can_mode_normal;
        board_init_can(HPM_CAN1);
        uint32_t can_src_clk_freq = board_init_can_clock(BOARD_APP_CAN_BASE);
        hpm_stat_t status = can_init(HPM_CAN1, &can_config, can_src_clk_freq);
        if (status != status_success) {
            printf("CAN initialization failed, error code: %d\n", status);
            return;
        }

3.设置CAN中断

        can_enable_tx_rx_irq(HPM_CAN1, CAN_EVENT_RECEIVE);
        intc_m_enable_irq_with_priority(IRQn_CAN1, 1);

4.CAN中断

        

SDK_DECLARE_EXT_ISR_M(IRQn_CAN1, test_can1_isr);

void test_can1_isr(void)
{
    uint8_t flags = can_get_tx_rx_flags(HPM_CAN1);
    if ((flags & CAN_EVENT_RECEIVE) != 0) {
        can_read_received_message(HPM_CAN1, (can_receive_buf_t *)&s_can_rx_buf);
        has_new_rcv_msg = true;
    }
    if ((flags & (CAN_EVENT_TX_PRIMARY_BUF | CAN_EVENT_TX_SECONDARY_BUF))) {
        has_sent_out = true;
    }
    if ((flags & CAN_EVENT_ERROR) != 0) {
        has_error = true;
    }
    can_clear_tx_rx_flags(HPM_CAN1, flags);

    error_flags = can_get_error_interrupt_flags(HPM_CAN1);
    can_clear_error_interrupt_flags(HPM_CAN1, error_flags);
}

5.CAN发送接收到的数据

        

    while (!has_new_rcv_msg) {
        }
    has_new_rcv_msg = false;
    show_received_can_message((const can_receive_buf_t *)&s_can_rx_buf);

    can_transmit_buf_t tx_buf;
    memset(&tx_buf, 0, sizeof(tx_buf));
    tx_buf.dlc = s_can_rx_buf.dlc;
    tx_buf.id = 0x321;
    uint32_t msg_len = can_get_data_bytes_from_dlc(s_can_rx_buf.dlc);
    memcpy(&tx_buf.data, (uint8_t *)&s_can_rx_buf.data, msg_len);
    status = can_send_message_blocking(BOARD_APP_CAN_BASE, &tx_buf);
    if (status != status_success) {
        printf("CAN sent message failed, error_code:%d\n", status);
        return;
    }

6.测试程序,设置CAN调试器为CA2.0,波特率500k,标准模式,依次发送数据,接收均正常。

 

最新回复

错误帧率呢?也就是给出来的时钟精确度?   详情 回复 发表于 2022-8-10 19:08
点赞 关注
 
 

回复
举报

7215

帖子

11

TA的资源

版主

沙发
 
用CAN调式器测试可以通过,可以试试跟其他的开发板测评一下,这样更有说明力。

点评

我的CAN调试器就是用的STM32F103的CAN控制器,PHY用的是TJA1040  详情 回复 发表于 2022-8-9 21:49
 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

CAN应用场景都有哪些?目前只用过串口,SPI,IIC等常用接口

点评

    CAN相对于串口最大的优势在自动仲裁,方便做多主站。串口做多主站通常需要令牌环  详情 回复 发表于 2022-8-9 21:51
CAN在汽车电子方面用得比较多,相比串口、SPI、IIC的传输无论是距离、抗干扰等都相对较强。  详情 回复 发表于 2022-8-9 11:51
 
 
 

回复

7215

帖子

11

TA的资源

版主

4
 
qzc飘曳 发表于 2022-8-9 11:00 CAN应用场景都有哪些?目前只用过串口,SPI,IIC等常用接口

CAN在汽车电子方面用得比较多,相比串口、SPI、IIC的传输无论是距离、抗干扰等都相对较强。

 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

5
 
lugl4313820 发表于 2022-8-8 23:31 用CAN调式器测试可以通过,可以试试跟其他的开发板测评一下,这样更有说明力。

我的CAN调试器就是用的STM32F103的CAN控制器,PHY用的是TJA1040

 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

6
 
qzc飘曳 发表于 2022-8-9 11:00 CAN应用场景都有哪些?目前只用过串口,SPI,IIC等常用接口

    CAN相对于串口最大的优势在自动仲裁,方便做多主站。串口做多主站通常需要令牌环

 
 
 

回复

7794

帖子

18

TA的资源

五彩晶圆(高级)

7
 

错误帧率呢?也就是给出来的时钟精确度?

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表