eric2013 发表于 2023-3-8 00:47:07

H7-TOOL的CAN/CANFD稳定性和兼容性系统测评帖子,持续更新(2023-03-08)



之前客户帮忙反馈了一些问题,最近准备第2期CAN/CANFD/CANopen视频专题,正好来个系统测评,将常用型号的CAN控制器和PHY芯片做个测试。

并将制作好的例子也整理到此贴。


eric2013 发表于 2023-3-11 01:31:07

今天开始整理,优先把CAN/CANFD的可视化方式搞出来


https://img.anfulai.cn/dz/attachment/forum/202302/16/033352a2on2wo2ftdzehrb.png

avita 发表于 2023-3-11 09:36:39

H7-TOOL 用 CAN/CANFD 是要外接收发器不,我还有首发版的 H7-TOOL 还没用,感觉可以用 H7-TOOL 的 Lua 脚本做个 CAN 固件离线更新器

eric2013 发表于 2023-3-11 09:59:33

avita 发表于 2023-3-11 09:36
H7-TOOL 用 CAN/CANFD 是要外接收发器不,我还有首发版的 H7-TOOL 还没用,感觉可以用 H7-TOOL 的 Lua 脚本 ...
1、带CAN收发器
2、CAN离线关键更新已经做了

H7-TOOL的CANFD/CAN接口脱机烧写操作说明,已经更新(2022-07-12)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=113770


avita 发表于 2023-3-11 10:36:21

汗,H7-TOOL 一直吃灰,发现的晚了,做 BOOT 的时候没有适配你们的协议。现在 CAN BOOT 和 PC CAN BOOT 上位机已经做好了。空了再适配你们的协议或者用 LUA 适配自有协议

eric2013 发表于 2023-3-11 10:47:46

avita 发表于 2023-3-11 10:36
汗,H7-TOOL 一直吃灰,发现的晚了,做 BOOT 的时候没有适配你们的协议。现在 CAN BOOT 和 PC CAN BOOT 上 ...

常用的都做了。

【实战技能】单片机bootloader的CANFD,I2C,SPI和串口方式更新APP视频教程(2022-08-01)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=114491&fromuid=58
(出处: 硬汉嵌入式论坛)

eric2013 发表于 2023-3-19 13:49:02

CANFD时钟配置容错处理


/**
\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   select       Bitrate selection
               - ARM_CAN_BITRATE_NOMINAL : nominal (flexible data-rate arbitration) bitrate
               - ARM_CAN_BITRATE_FD_DATA : flexible data-rate data bitrate
\param   bitrate      Bitrate
\param   bit_segments Bit segments settings
\param   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 == 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;

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;
}

eric2013 发表于 2023-3-22 00:37:38


页: [1]
查看完整版本: H7-TOOL的CAN/CANFD稳定性和兼容性系统测评帖子,持续更新(2023-03-08)