一个简单的前端实现,用于计算CAN/FDCAN参数: CANAN/FDCAN 智能参数计算器
can
对于不兼容fdcan的单片机
需要配置的主要有这几个参数:
Bit Timings Parameter
参数列表
- Prescaler
- Time Quanta in Bit Segment 1 (单位time,复数times)
- Time Quanta in Bit Segment 2 (单位time,复数times)
- ReSynchronization Jump Width( 单位time,复数times)
计算得到的一共有如下几个参数:
- Time Quantum (ns)
- Time for one Bit (nas)
- Baud Rate (bps)(主要关注)
参数计算方法
波特率计算公式:
CANFrequency(FDCAN频率):CAN时钟频率,查找芯片手册,一般挂载在APB1总线上
Prescaler(预分频器):CAN频率还需要除预分频系数得到一个更小的频率 方便我们后续计算。假设TimeSeg1和TimeSeg2的值范围在1-32和1-16 如果CAN频率过大算出来可能达不到我们想要的波特率。
关于采样点
采样点是在一个 bit 时间里,控制器“读总线电平”的时刻百分比。也就是:这一位走到多少 % 的时候,CAN 才判断 0 / 1。
一个 CAN bit 由这些段组成(单位都是 tq):
1 | | SyncSeg | TimeSeg1 | TimeSeg2 | |
- SyncSeg:固定 1 tq
- Seg1:可配置
- Seg2:可配置
其中采样点在Seq1和Seq2的交界处,即采样点位于[SyncSeg+Seg1] 之后。所以采样点计算的标准公式为:
一般经典CAN常用采样点位87.5%,FDCAN数据段采样点可用75%。这是因为数据段一般速率高,边沿快,一般会高一点。
所以我们选择参数的要求是 采样率(SMP)为75%左右的同时 BRP(Prescaler(预分频器))的值尽量要小,且Sync Jump Width和TimeSeg2两个参数尽量保证一致且较大。
Sync Jump Width ≠ 采样点,SJW 是 允许采样点“前后挪动”的最大量,一般有SJW ≤ Seg2。Sync Jump Width和TimeSeg2两个参数尽量保证一致且较大。
其他配置(Basic Parameters&Advanced Parameters)
| 分类 | 参数名 | 中文含义 | 推荐配置 | 备注 / 原因 |
|---|---|---|---|---|
| 基础 | Time Triggered Communication Mode | 时间触发通信 | Disable | RM 不用时间表通信 |
| 基础 | Automatic Bus-Off Management | 自动 Bus-Off 恢复 | Disable(老手) Enable(新手) |
抓错误用的 |
| 基础 | Automatic Wake-Up Mode | 自动唤醒 | Disable | 不用 Sleep |
| 基础 | Automatic Retransmission | 自动重发 | Enable | CAN 稳定性核心 |
| 基础 | Receive FIFO Locked Mode | 接收 FIFO 锁定 | Disable | 保留最新数据 |
| 基础 | Transmit FIFO Priority | 发送 FIFO 优先级 | Enable | 控制帧优先 |
| 高级 | Operating Mode | 工作模式 | Normal | 喵帕斯 |
是的就是这么简单
FDCAN (非H7)
这一部分针对的是兼容FDCAN的非H7的单片机的配置,主要是H7那个配置有点烦人。喵了个咪的。
For classic can
Basic Parameters
| 参数名 | 值 | 含义 | 备注 / 建议 |
|---|---|---|---|
| Clock Divider | Divide kernel clock by 1 | CAN 外设时钟分频 | 1 = 不分频 |
| Frame Format | Classic mode | CAN 帧格式 | 经典 CAN(非 CAN FD) |
| Mode | Normal mode | 工作模式 | 正常通信 |
| Auto Retransmission | Disable | 发送失败是否自动重发 | 建议 Enable |
| Transmit Pause | Disable | 连续发送是否插入空闲 | 一般保持 Disable |
| Protocol Exception | Disable | CAN FD 协议异常处理 | Classic CAN 必须关 |
| Nominal Sync Jump Width | 1 | 同步跳转宽度(SJW) | 常用 1~4 |
| Data Prescaler | 1 | 数据段分频 | Classic CAN 可忽略 |
| Data Sync Jump Width | 1 | 数据段 SJW | Classic CAN 可忽略 |
| Data Time Seg1 | 1 | 数据段时间段 1 | Classic CAN 可忽略 |
| Data Time Seg2 | 1 | 数据段时间段 2 | Classic CAN 可忽略 |
| Std Filters Nbr | 0 | 标准帧滤波器数量(11 位 ID) | 0 = 收不到标准帧 |
| Ext Filters Nbr | 0 | 扩展帧滤波器数量(29 位 ID) | 0 = 收不到扩展帧 |
| Tx FIFO Queue Mode | FIFO mode | 发送缓冲方式 | FIFO = 先进先出 |
说明:Frame模式一共有三种工作模式:
- Classic Mode:经典can
- FD mode without BitRate Switching 无比特率切换模式,整个canfd帧使用同样的比特率
- FD mode with BitRate Switching 有比特率切换,可以让数据域以更高的比特率传输,提高传输速率,但是要注意can芯片兼容性
关于Filter,我们参照草凡佬的这段话:
Std Filters Nbr (标准ID过滤数量) :这个参数的配置非常容易踩坑,它的参数作用是规定你需要过滤掉标准CANID的数量,通常我们我们不需要过滤任何ID,但这里绝对不能设置为0,如果设置为0则进入不了CAN的中断,必须设置为1即以上,设置为1也不代表我们需要在代码初始化过滤器时过滤掉一个ID,可将一个参数设置为0x00000000,即可不过滤掉任何ID。
所以std设置为1就可以了,ext视情况需要配。
Bit Timings Parameters
计算方式与一半CAN完全一致,此处略过了喵
要注意的是计算完了以后把上边对于点Data xxxx的数据改成和下面仲裁段配置的一致即可。
需要注意的是此时FDCAN的时钟频率需要在时钟书的“FDCAN Clock Mux”中反复确认喵
For CAN-FD
Basic Parameters
如果不起用BRS(BitRate Switch)的话,配置方法基本同Classic CAN一致。
如果使用BRS的话,配置方法如下:
首先需要明确的是,在“Basic Parameters”栏目下,Data xxxx相关配置参数之作用于数据段。计算公式为:
一定不要忘了采样点的计算喵!
Bit Timings Parameters
这部分的参数只作用于仲裁段喵!配置方式和经典CAN的一样喵!
FDCAN (H7)
H7xx,或者说比较新的芯片的配置页面,会多一些参数,所以这里分开说
主要内容其实和其他FDCAN的配置差不多,多了一下几个Basic Parameter的配置参数:
| 参数 | 是什么 | 推荐值 | 说明 |
|---|---|---|---|
| Rx Fifo0 Elmts Nbr | FIFO0 接收消息个数 | 8(或 ≥1) | 0 = FIFO0 不存在 |
| Rx Fifo0 Elmt Size | FIFO0 单条数据长度 | 8 / 64 | Classic 用 8,FD 用 64 |
| Rx Fifo1 Elmts Nbr | FIFO1 接收消息个数 | 0 或 8 | 不用 FIFO1 可设 0 |
| Rx Fifo1 Elmt Size | FIFO1 单条数据长度 | 同 FIFO0 | |
| Rx Buffers Nbr | Rx Buffer 数量 | 0 | 一般不用 |
| Rx Buffer Size | Rx Buffer 数据长度 | 默认 |
| 参数 | 是什么 | 推荐值 | 说明 |
|---|---|---|---|
| Tx Buffers Nbr | 独立 Tx Buffer 数量 | 0 | 一般不用 |
| Tx Fifo Queue Elmts Nbr | 发送 FIFO 队列深度 | 8(或 ≥1) | 0 = 发不出去 |
| Tx Fifo Queue Mode | FIFO / Queue | FIFO | FIFO 最常用 |
| Tx Elmt Size | 单条发送数据长度 | 8 / 64 | 同 Rx |
| Tx Events Nbr | 发送事件记录数量 | 0 或 8 | 不看发送历史可设 0 |
这里面的配置看上面的表格基本就可以看懂了喵
然后就是关于这个,一路CAN中 在不加延时的情况下,一次最多能发送或接收的最大帧数据包的数量。草凡佬把它叫做CAN收发最大带宽数。
Clock Calibration(时钟校准),Clock Calibration 是给 CAN FD 的“数据段高速通信”用的,主要在 BRS 打开、速率很高(≥2 Mbps)时才有意义。这个后面再加。用了外部晶振基本不用管。
说些什么吧!