硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1136|回复: 6
收起左侧

[CAN助手] H7-TOOL的SWD接口监测CAN/CANFD状态实现可视化初步效果,新增时钟容错率计算

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2023-3-22 00:44:01 | 显示全部楼层 |阅读模式

白天再整理下,初步V1.0版本就出来了。CANFD主要还是FIFO,buffer和queue的监测。

1245678.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2023-3-22 00:47:01 | 显示全部楼层
容错率计算就是把这个函数做了lua的实现,此函数来自CMSIS-Driver

[C] 纯文本查看 复制代码
/**
  \fn          int32_t CANx_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments, uint8_t x)
  \brief       Set bitrate for CAN interface.
  \param[in]   select       Bitrate selection
                 - ARM_CAN_BITRATE_NOMINAL : nominal (flexible data-rate arbitration) bitrate
                 - ARM_CAN_BITRATE_FD_DATA : flexible data-rate data bitrate
  \param[in]   bitrate      Bitrate
  \param[in]   bit_segments Bit segments settings
  \param[in]   x            Controller number (0..1)
  \return      execution status
*/
static int32_t CANx_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments, uint8_t x) {
  FDCAN_GlobalTypeDef *ptr_CAN;
  uint32_t             cccr, sjw, prop_seg, phase_seg1, phase_seg2, pclk, brp, brp_max, tq_num;
 
  if (x >= CAN_CTRL_NUM)                                                            { return ARM_DRIVER_ERROR;               }
  if ((select != ARM_CAN_BITRATE_NOMINAL) && (select != ARM_CAN_BITRATE_FD_DATA)  ) { return ARM_CAN_INVALID_BITRATE_SELECT; }
  if (can_driver_powered[x] == 0U)                                                  { return ARM_DRIVER_ERROR;               }
 
  prop_seg   = (bit_segments & ARM_CAN_BIT_PROP_SEG_Msk  ) >> ARM_CAN_BIT_PROP_SEG_Pos;
  phase_seg1 = (bit_segments & ARM_CAN_BIT_PHASE_SEG1_Msk) >> ARM_CAN_BIT_PHASE_SEG1_Pos;
  phase_seg2 = (bit_segments & ARM_CAN_BIT_PHASE_SEG2_Msk) >> ARM_CAN_BIT_PHASE_SEG2_Pos;
  sjw        = (bit_segments & ARM_CAN_BIT_SJW_Msk       ) >> ARM_CAN_BIT_SJW_Pos;
 
  if (select == ARM_CAN_BITRATE_NOMINAL) {
    if (((prop_seg + phase_seg1) < 2U) || ((prop_seg + phase_seg1) > 256U)) { return ARM_CAN_INVALID_BIT_PROP_SEG;   }
    if (( phase_seg2             < 1U) || ( phase_seg2             > 128U)) { return ARM_CAN_INVALID_BIT_PHASE_SEG2; }
    if (( sjw                    < 1U) || ( sjw                    > 128U)) { return ARM_CAN_INVALID_BIT_SJW;        }
    brp_max = 512U;
  } else {
    if (((prop_seg + phase_seg1) < 2U) || ((prop_seg + phase_seg1) >  32U)) { return ARM_CAN_INVALID_BIT_PROP_SEG;   }
    if (( phase_seg2             < 1U) || ( phase_seg2             >  16U)) { return ARM_CAN_INVALID_BIT_PHASE_SEG2; }
    if (( sjw                    < 1U) || ( sjw                    >   8U)) { return ARM_CAN_INVALID_BIT_SJW;        }
    brp_max = 32U;
  }
 
  tq_num = 1U + prop_seg + phase_seg1 + phase_seg2;
  pclk   = CAN_GetClock ();           if (pclk == 0U)    { return ARM_DRIVER_ERROR;        }
  brp    = pclk / (tq_num * bitrate); if (brp > brp_max) { return ARM_CAN_INVALID_BITRATE; }
  if (pclk > (brp * tq_num * bitrate)) {
    if ((((pclk - (brp * tq_num * bitrate)) * 1024U) / pclk) > CAN_CLOCK_TOLERANCE) { return ARM_CAN_INVALID_BITRATE; }
  } else if (pclk < (brp * tq_num * bitrate)) {
    if (((((brp * tq_num * bitrate) - pclk) * 1024U) / pclk) > CAN_CLOCK_TOLERANCE) { return ARM_CAN_INVALID_BITRATE; }
  }
 
  ptr_CAN = ptr_regs_CANx[x];
 
  cccr = ptr_CAN->CCCR;
  if ((cccr & (FDCAN_CCCR_CCE | FDCAN_CCCR_INIT)) != (FDCAN_CCCR_CCE | FDCAN_CCCR_INIT)) {
    ptr_CAN->CCCR = FDCAN_CCCR_CCE  |   // Configuration change enable
                    FDCAN_CCCR_INIT ;   // Initialization
    while ((ptr_CAN->CCCR & FDCAN_CCCR_INIT) == 0U);
  }
 
  if (select == ARM_CAN_BITRATE_NOMINAL) {
    ptr_CAN->NBTP  = ((brp - 1U) << 16) | ((prop_seg + phase_seg1 - 1U) << 8) |  (phase_seg2 - 1U)       | ((sjw - 1U) << 25);
  } else {
    ptr_CAN->DBTP = ((brp - 1U) << 16) | ((prop_seg + phase_seg1 - 1U) << 8) | ((phase_seg2 - 1U) << 4) |  (sjw - 1U);
  }
  ptr_CAN->CCCR = cccr;
 
  return ARM_DRIVER_OK;
}



回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2023-3-22 09:16:47 | 显示全部楼层
2.2.1什么时候发布
代码不规范,亲人两行泪!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2023-3-22 10:04:15 | 显示全部楼层
missfox 发表于 2023-3-22 09:16
2.2.1什么时候发布

快了,这个月末左右应该可以。
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2023-3-22 12:43:37 | 显示全部楼层
苦等FreeRTOS 做梦都在想
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2023-3-23 01:25:13 | 显示全部楼层
准备增加个FIFO,buffer和queue的部分消息展示
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2023-3-30 02:35:01 | 显示全部楼层
继续精进

QQ截图20230330023559.png
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 06:24 , Processed in 0.190639 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表