查看: 742|回复: 1

【瑞萨RA4系列开发板体验】CAN总线收发测试

[复制链接]

116

主题

133

帖子

3768

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3768
发表于 2023-2-3 14:34:52 | 显示全部楼层 |阅读模式
【瑞萨RA4系列开发板体验】CAN总线收发测试
作者:我爱下载


CAN总线收发测试
在前一个shell终端测试的基础上,本次完成CAN总线接口的收发测试,采用e2studio基于fsp的架构,测试起来还是相当顺利的。
基本硬件
通过数据手册了解到,R7FA4M2AD3CFP具备一组CAN总线接口,其占用的控制器引脚分别为P102、P103和P402、P401两组。这里选择P102和P103这组引脚进行测试,其中P102为CRX0,P103为CTX0。
如下图所示,这两引脚在J4的1脚和J3的7脚。

软件实现
通过FSP配置CAN

在FSP的Pin Configuration选项卡中,选择Peripherals->Connectivity:CAN->CAN0,并如下图所示,配置为
Operation Mode: Enable
CRX0 : P102
CTX0 : P103
如果发现P102和P103被占用无法选择,需要将被占用的功能关闭。


切换到Stacks选项页,选择New Stack->Connectivity->CAN(r_can),添加一个CAN口g_can0 CAN(r_can)。

点击新增的CAN控件,编辑Properties,如下标所示。我这里分配了4 Mailboxes,其中
前三个为发送邮箱,第4个为接收邮箱,并且将Mailbox 0-3 Group Mask设置为0,取消ID过滤功能。
波特率选择 125000(125K);中断回调函数设置为can_callback 。


件处理
增加CAN中断回调函数,处理发送完成和接收完成两个事件。
  1. void can_callback (can_callback_args_t * p_args)
  2. {
  3. if  (p_args->event ==  *CAN_EVENT_TX_COMPLETE* )
  4. {
  5. can_send_complete_flag = true;

  6. }
  7. if (p_args->event ==  *CAN_EVENT_RX_COMPLETE* )
  8. {
  9. can_r = p_args->frame;
  10. can_recv_complete_flag = true;
  11. }
  12. }
复制代码
实测运行
创建两个shell命令,分别为can_send和can_recv,观察执行效果。
can_send函数接收一个十进制的id输入,固定输出8个字节的标准数据帧。

  1. int  can_send  ( int  argc,  char argv[])
  2. {

  3. if  (argc < 2)
  4. {
  5. shellPrint(&shell, "please input string same as can_send 123\n\r");

  6. return  -1;

  7. }
复制代码
  1. unsigned  int id = ( unsigned  int  )  atoi  (argv[1]);
  2. fsp_err_t err =  FSP_SUCCESS ;

  3. can_frame_t
  4. can_s;

  5. can_s.id = id;

  6. can_s.id_mode =  CAN_ID_MODE_STANDARD ;

  7. can_s.data_length_code = 8;

  8. can_s.data[0] = 0x01;

  9. can_s.data[1] = 0x02;

  10. can_s.data[2] = 0x03;

  11. can_s.data[3] = 0x04;

  12. can_s.data[4] = 0x05;

  13. can_s.data[5] = 0x06;

  14. can_s.data[6] = 0x07;

  15. can_s.data[7] = 0x08;

  16. err = R_CAN_Write (&g_can0_ctrl, 0, &can_s);

  17. if  (FSP_SUCCESS != err)
  18. __BKPT();

  19. while (can_send_complete_flag == false){}

  20. can_send_complete_flag = false;

  21. return 0;

  22. }

  23. SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE( SHELL_TYPE_CMD_MAIN ),
  24. can_send, can_send, can_send id);
复制代码


can_recv函数输入一个接收测试的数量,并将接收到的信息打印出来。
  1. int    can_recv  ( int  argc, char  *argv[])
  2. {
  3. if (argc< 2)
  4. {
  5. shellPrint(&shell, "please input string same as can_recv 100\n\r");
  6. return -1;
  7. }

  8. unsigned  int c = ( unsigned  int  ) atoi (argv[1]);
  9. unsigned int count = 0;
  10. while (count < c)
  11. {

  12. if (can_recv_complete_flag == true)
  13. {
  14. can_recv_complete_flag = false;
  15. count++;
  16. shellPrint(&shell,"canfram %04x %d %02x %02x %02x %02x %02x %02x %02x %02x\n\r", can_r.id, can_r.data_length_code,
  17. can_r.data[0],
  18. can_r.data[1],
  19. can_r.data[2],
  20. can_r.data[3],
  21. can_r.data[4],
  22. can_r.data[5],
  23. can_r.data[6],
  24. can_r.data[7]
  25. );
  26. }

  27. vTaskDelay(10);
  28. }
  29. return 0;

  30. }

  31. SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE( SHELL_TYPE_CMD_MAIN ), can_recv, can_recv, can_recv count);
复制代码


回复

使用道具 举报

3

主题

195

帖子

1271

积分

金牌会员

Rank: 6Rank: 6

积分
1271
发表于 2023-3-14 11:08:21 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

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

本版积分规则

用户排行榜

RA助手

主题: 116帖子:133精华:0

RA_Lance

主题: 92帖子:132精华:9

lugl

主题: 39帖子:127精华:0

xujiwei263

主题: 16帖子:73精华:0

books咦

主题: 11帖子:11精华:2

Juggernaut

主题: 9帖子:95精华:0
快速回复 返回顶部 返回列表