RISC-V技术论坛
直播中

Evanee

4年用户 11经验值
擅长:嵌入式技术
私信 关注

【先辑半导体HPM6750EVKMINI评估板试用体验】##3:can总线初步

本帖最后由 Evanee 于 2022-6-19 07:31 编辑

1.前言
hpm6750具有高性能,比较适合做复杂控制算法,而工控领域can总线是绕不开的话题,本文进行基本can测试,后续将在此基础上进行相对复杂的程序编写。

2.接线
本次测评的hpm67650evkmini板子上没有can总线的phy,如果要用can总线就只能外接,刚好手上有个TJA1050小板,就用它测试。
TJA1050PHY板第一步:查询芯片手册以及开发板手册,找到需要的引脚。
芯片数据手册(HPM6700_6400_DS_V1_2.pdf)

板载P2连接器列表(HPM6750EVKMINI USER GUIDE.pdf)

板载P1连接器列表(HPM6750EVKMINI USER GUIDE.pdf)

整理需要连接的引脚如下表所示:
TJA1050PHY板引脚
HPM6750EVKMINI引脚
+5v
P1_2
GND
P1_6
CAN_TX
P2_7
CAN_RX
P2_10

然后使用杜邦线,将两块板以及usbcan进行连接,连好后的照片如下图。
3.生成can测试工程
start_cmd.cmd进入D:AEMBEDHPM6750sdk_env_v0.11.0hpm_sdksamplesdriverscan
  1. > generate_project -b hpm6750evkmini -t flash_xip
使用SEGGER Embedded Studio打开工程。
4.代码分析
根据can_demo.c中的源代码,准备测试board_can_echo_test_responder回传程序,关键代码如下:
  1. void board_can_echo_test_responder(void)
  2. {
  3.     can_config_t can_config;
  4.     can_get_default_config(&can_config);
  5.     can_config.baudrate = 500000; /* 500kbps */
  6.     can_config.mode = can_mode_normal;
  7.     board_init_can(BOARD_APP_CAN_BASE);
  8.     uint32_t can_src_clk_freq = board_init_can_clock(BOARD_APP_CAN_BASE);
  9.     hpm_stat_t status = can_init(BOARD_APP_CAN_BASE, &can_config, can_src_clk_freq);
  10.     if (status != status_success) {
  11.         printf("CAN initialization failed, error code: %d
  12. ", status);
  13.         return;
  14.     }

  15.     can_enable_tx_rx_irq(BOARD_APP_CAN_BASE, CAN_EVENT_RECEIVE);
  16.     intc_m_enable_irq_with_priority(BOARD_APP_CAN_IRQn, 1);
  17.     printf("CAN echo test: Responder is waiting for echo message...
  18. ");
  19.     while (!has_new_rcv_msg) {
  20.     }
  21.     has_new_rcv_msg = false;
  22.     show_received_can_message((const can_receive_buf_t *)&s_can_rx_buf);

  23.     can_transmit_buf_t tx_buf;
  24.     memset(&tx_buf, 0, sizeof(tx_buf));
  25.     tx_buf.dlc = s_can_rx_buf.dlc;
  26.     tx_buf.id = 0x321;
  27.     uint32_t msg_len = can_get_data_bytes_from_dlc(s_can_rx_buf.dlc);
  28.     memcpy(&tx_buf.data, (uint8_t *)&s_can_rx_buf.data, msg_len);
  29.     status = can_send_message_blocking(BOARD_APP_CAN_BASE, &tx_buf);
  30.     if (status != status_success) {
  31.         printf("CAN sent message failed, error_code:%d
  32. ", status);
  33.         return;
  34.     }
  35.     printf("Sent echo message back
  36. ");
  37. }
分析代码,总结函数功能:如果接收到can信息,将在串口打印出该信息的id以及信息内容,并且以ID=0x321将该can信息原路发送回去。

5.下载工程
使用SEGGER Embedded Studio编译下载,运行:

1)串口控制台输入3,板子进入等待接收状态;

2)使用usbcan发送如图所示信息,板子串口控制台出现响应,同时usbcan接收到板子发回的can信息。

3)试验现象与分析一致,can总线测试成功!





更多回帖

发帖
×
20
完善资料,
赚取积分