Edit online

编程指南

3 Mar 2025
Read time: 3 minute(s)

控制器初始化

上电后,CANFD 控制器的初始化操作步骤如下:

  1. 配置模块时钟源,并使能模块时钟,释放模块复位状态。
  2. 配置 CANFD 引脚功能。
  3. RESET = 1 将 CANFD 置于复位状态。
  4. 配置所需的波特率分频因子。
  5. RESET = 0 使 CANFD 退出复位状态。
  6. 配置对应的中断使能控制位。
  7. 发送模式选择,若选择单发模式,则置位 TPSS 或者 TSSS。否则,则清零 TPSS 和 TSSS。
  8. 进入传输阶段,分别执行下列对应条件的相应操作:
    • 若选择 PTB 启动发送操作,则将帧数据填进 TBUF,置位 TPE,等待 TPE 执行完成。
    • 若选择 STB 启动发送操作,则将帧数据填进 TBUF,每写进一层,则需要置位 TSNEXT 切换到 STB 的下一层。以下配置二选一:
      • 置位 TSONE,等待 TSONE 完成。
      • 置位 TSALL,等待 TSALL 完成。
    • 若启动接收操作,则可以使能 RIE 、 RAFIE 或者 RFIE 中的任意一个,并在中断处理函数中接收数据。
注: 主机通过 RBUF 获取收缓冲器或者每一时隙帧信息后,需要置位 RREL 切到接收缓冲器的下一时隙。

波特率推荐计算

以 CANFD 帧格式举例,若用户只采用 CAN 2.0 帧格式,则对应的 CANFD 帧格式高速速率部分的系数配置可以忽略。关于 CANFD 控制器的波特率计算方法,可以参考下列步骤:

注: CANFD 帧格式普速域波特率必须小于等于 1 Mbps,高速域波特率必须小于等于 10 Mbps,且普速域波特率必须小于高速域波特率。
  1. 配置 CAN 2.0 帧格式以及 CANFD 帧格式的普速域的时钟分频系数,相关寄存器如下所示:
  2. 配置 CANFD 帧格式的高速域的时钟分频系数,相关寄存器如下所示:
  3. 选择合适的采样占空比,典型值是 80%,一般在 50% ~ 100% 之间。普速域占空比和高速域占空比可根据实际情况设置不同值。
  4. 必须分开计算普速域波特率和高速域波特率的分频因子:
    1. 依次循环执行 S_PRESC 或者 F_PRESC 从 1 到 256。
    2. 对每一个 S_PRESC 或者 F_PRESC 值,计算每一个帧信息位包含的 TQ 数量。
      计算公式: nTQ = (clk_src / presc) / baudrate,其中
      • nTQ 表示每一个帧信息位包含的 TQ 数量。
      • clk_src 表示 CANFD 控制器的时钟源。
      • presc 即为 S_PRESC 或者 F_PRESC 值。
      • baudrate 即为对应的目标普速域或者高速域的波特率。

      计算得到的 nTQ 若不为整数,则进一步评估 nTQ + 1 和 nTQ,选择更靠近目标波特率的值作为 nTQ 的配置值。

    3. 计算采样点前的时间段 Tseg1。计算公式为 Tseg1 = nTQ × duty_cycle:
      • nTQ 表示每一个帧信息位包含的 TQ 数量。
      • duty_cycle 表示整个帧信息位的采样点的占空比

      若计算出来的 Tseg1 值不为整数,则进一步评估和比较 Tseg1 和 Tseg1 + 1 值,将更靠近目标占空比值作为 Tseg1 的配置值。

    4. 计算采样点后的时间段 Tseg2。计算公式为 Tseg2 = nTQ - Tseg1。
    5. 在满足CANFD 控制器时序建议设定范围的约束情况下,计算并保存根据当前的 nTQ、Tseg1 和 Tseg2 值计算出来的跟目标波特率以及目标占空比的误差值。
    6. 计算 重新同步补偿宽度时间 Tsjw。计算公式为 Tsjw = Tseg2:
      注: 若有使用高速域波特率计算,则可以预配置 TDCEN = 1,SSPOFF = Tseg1。
    7. 跳转到下一个 S_PRESC 或者 F_PRESC 值,重复执行步骤 b步骤 f,分别计算 nTQ,Tseg1 和 Tseg2 值以及波特率和占空比误差值,并跟上一个 S_PRESC 或者 F_PRESC 值计算出来的波特率和占空比误差值作对比,选取最小的误差值的配置值作为最优解。
  5. 确认此时 RESET = 1,即 CANFD 控制器置于复位状态。
  6. 按照公式普通速率/高速速率分频因子计算公式将配置值更新到对应的寄存器中。


1. 波特率计算

接收过滤器

接收过滤器具体操作可以参考下列步骤:

  1. 设置 SELMASK = 0,选择接收 ID 值模式。
  2. CANFD_ACFCTRL 中选择需进行过滤配置的对应通道序号。

    一共有十六个通道 (0 ~ 15) 。

  3. 将参考目标 ID 写进CANFD_ACODEx 中。
    注: CANFD_ACODEx 必须在 RESET = 1 的情况下才可写入。
    注: CANFD_EN0CANFD_EN1 对应使能通道 0 ~ 15,每个通道对应 1 位。通道 0 默认使能,并且 CANFD_MASKx 是全 1,表示默认接受任何帧数据。
  4. 设置 SELMASK = 1,选择接收掩码模式。
  5. 在 AIDEE 和 AIDE 位选择需要过滤的帧,包括下列选项:
    • 只过滤标准帧 ID
    • 只过滤扩展帧 ID
    • 两者都滤除
  6. 将掩码值写进寄存器 CANFD_MASKx中。
    • 如果对应位是 1,表示该位不进行过滤,无论接收到的是 0 或 1 都可以被接收。
    • 如果对应位是 0,表示该位必须与 ACODE 中的值相同才可以被接收,否则被滤除。
    注: 寄存器 CANFD_MASKx 必须在 RESET = 1 的情况下才可写入。