主题中讨论的其他器件: TCAN4550
你好
我通过 有线连接将 TCAN4550EVM 连接到我的板。
我正在尝试 Linux 驱动程序代码(从最新版本开始... 5.12.xxx)。
Linux 代码提供了位定时计算功能( CAN_calc_bittiming()),我尝试了这种方法。
TCAN4550EVM 提供的40MHz CAN 时钟和 我测试过的 CAN 速率为500kHz、FD 数据速率为2MHz。
根据 Linux 代码、位时序常量是这样计算的
static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt, const struct can_bittiming_const *btc, const u32 *bitrate_const, const unsigned int bitrate_const_cnt) { .... if (!bt->tq && bt->bitrate && btc) err = can_calc_bittiming(dev, bt, btc); .... }
我输入了上面的"bt->bitration"值、而输入的"BTC"值则是 TI Linux 代码所输入的。
static const struct can_bittiming_const m_can_bittiming_const_31X = { .name = KBUILD_MODNAME, .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */ .tseg1_max = 256, .tseg2_min = 2, /* Time segment 2 = phase_seg2 */ .tseg2_max = 128, .sjw_max = 128, .brp_min = 1, .brp_max = 512, .brp_inc = 1, }; static const struct can_bittiming_const m_can_data_bittiming_const_31X = { .name = KBUILD_MODNAME, .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */ .tseg1_max = 32, .tseg2_min = 1, /* Time segment 2 = phase_seg2 */ .tseg2_max = 16, .sjw_max = 16, .brp_min = 1, .brp_max = 32, .brp_inc = 1, };
然后按如下方式进行位时序计算:
BT 计时:br:50000 BRP:1,proseg:34 SJW:1 tseg1:35 tseg2:10 sp:875 tq:25
数据 bt 时序:br:2000000 BRP:1,proseg:7 SJW:1 tseg1:7 tseg2:5 sp:750 tq:25
然后我测试了该值、正常 CAN 或 CANFD 信号正常、但 CANFD BRS 信号不工作。
这意味着这些经过计算的数据双时序值不起作用。
Q1)我的方法是否正确? 在开发 TI 代码时、使用了什么方法?
Q2)这些计算值是否正确?
Q3)能否获得与这些设置类似的采样位时序值?
谢谢你