编程指南
3 Mar 2025
Read time: 3 minute(s)
控制器初始化
上电后,CANFD 控制器的初始化操作步骤如下:
- 配置模块时钟源,并使能模块时钟,释放模块复位状态。
- 配置 CANFD 引脚功能。
- RESET = 1 将 CANFD 置于复位状态。
- 配置所需的波特率分频因子。
- RESET = 0 使 CANFD 退出复位状态。
- 配置对应的中断使能控制位。
- 发送模式选择,若选择单发模式,则置位 TPSS 或者 TSSS。否则,则清零 TPSS 和 TSSS。
- 进入传输阶段,分别执行下列对应条件的相应操作:
- 若选择 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,且普速域波特率必须小于高速域波特率。
- 配置 CAN 2.0 帧格式以及 CANFD 帧格式的普速域的时钟分频系数,相关寄存器如下所示:
- 配置 CANFD 帧格式的高速域的时钟分频系数,相关寄存器如下所示:
- 选择合适的采样占空比,典型值是 80%,一般在 50% ~ 100% 之间。普速域占空比和高速域占空比可根据实际情况设置不同值。
- 必须分开计算普速域波特率和高速域波特率的分频因子:
- 依次循环执行 S_PRESC 或者 F_PRESC 从 1 到 256。
- 对每一个 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 的配置值。
- 计算采样点前的时间段 Tseg1。计算公式为 Tseg1 = nTQ × duty_cycle:
- nTQ 表示每一个帧信息位包含的 TQ 数量。
- duty_cycle 表示整个帧信息位的采样点的占空比
若计算出来的 Tseg1 值不为整数,则进一步评估和比较 Tseg1 和 Tseg1 + 1 值,将更靠近目标占空比值作为 Tseg1 的配置值。
。 - 计算采样点后的时间段 Tseg2。计算公式为 Tseg2 = nTQ - Tseg1。
- 在满足CANFD 控制器时序建议设定范围的约束情况下,计算并保存根据当前的 nTQ、Tseg1 和 Tseg2 值计算出来的跟目标波特率以及目标占空比的误差值。
- 计算 重新同步补偿宽度时间 Tsjw。计算公式为 Tsjw = Tseg2:注: 若有使用高速域波特率计算,则可以预配置 TDCEN = 1,SSPOFF = Tseg1。
- 跳转到下一个 S_PRESC 或者 F_PRESC 值,重复执行步骤 b 到 步骤 f,分别计算 nTQ,Tseg1 和 Tseg2 值以及波特率和占空比误差值,并跟上一个 S_PRESC 或者 F_PRESC 值计算出来的波特率和占空比误差值作对比,选取最小的误差值的配置值作为最优解。
- 确认此时 RESET = 1,即 CANFD 控制器置于复位状态。
- 按照公式普通速率/高速速率分频因子计算公式将配置值更新到对应的寄存器中。

接收过滤器
接收过滤器具体操作可以参考下列步骤:
- 设置 SELMASK = 0,选择接收 ID 值模式。
- 在 CANFD_ACFCTRL
中选择需进行过滤配置的对应通道序号。
一共有十六个通道 (0 ~ 15) 。
- 将参考目标 ID 写进CANFD_ACODEx
中。注: CANFD_ACODEx 必须在 RESET = 1 的情况下才可写入。
- 设置 SELMASK = 1,选择接收掩码模式。
- 在 AIDEE 和 AIDE 位选择需要过滤的帧,包括下列选项:
- 只过滤标准帧 ID
- 只过滤扩展帧 ID
- 两者都滤除
- 将掩码值写进寄存器 CANFD_MASKx中。
- 如果对应位是 1,表示该位不进行过滤,无论接收到的是 0 或 1 都可以被接收。
- 如果对应位是 0,表示该位必须与 ACODE 中的值相同才可以被接收,否则被滤除。
注: 寄存器 CANFD_MASKx 必须在 RESET = 1 的情况下才可写入。