中级会员
 
- 积分
- 303
- 金钱
- 303
- 注册时间
- 2019-11-10
- 在线时间
- 61 小时
|
1金钱
本帖最后由 woshi520laoxie 于 2021-12-22 17:18 编辑
求助帖:关于CANFD的数据域和仲裁域直接的联系
使用开发环境:STM32H7
硬件: CANFD
我一开始的想法是这样的,CANFD的报文总线有一个仲裁的过程,根据ID,谁有优先级高,那么就优先发送谁的报文。
那么当总线中数据比较多的时候就会产生总线仲裁,把优先级高的数据优先发送,那么仲裁域的速度理论上只有在总线中同时出现多个数据的时候会发生
所以当总线中的数据不多的时候,仲裁域并没有多大的影响。
所以接下来使用过程中问题就出现了。
CAN-FD 可以以更高的速率传输数据,仲裁段(ID 和 ACK)的速率和 CAN 一样最高 1Mbps,
保持不变,这样可以保证总线健壮可靠。但是 CAN-FD 帧数据段可以 5Mbps 甚至更高!这个技
术叫做数据段波特率可变, CAN-FD 中 FD 的全称就是 Flexible Data-Rate
那么我不关心仲裁的速度,因为很快可以忽略。
所以继续往下,根据安富莱的例子描述
/* 位时间特性配置
Bit time parameter | Nominal | Data
---------------------------|--------------|----------------
fdcan_ker_ck | 20 MHz | 20 MHz
Time_quantum (tq) | 50 ns | 50 ns
Synchronization_segment | 1 tq | 1 tq
Propagation_segment | 23 tq | 1 tq
Phase_segment_1 | 8 tq | 4 tq
Phase_segment_2 | 8 tq | 4 tq
Synchronization_Jump_width | 8 tq | 4 tq
Bit_length | 40 tq = 2us | 10 tq = 0.5us
Bit_rate | 0.5 MBit/s | 2 MBit/s
*/
根据描述和文档中的介绍,
1、配置仲裁阶段波特率
CAN时钟20MHz时,仲裁阶段的波特率就是
CAN FD Freq / (Sync_Seg + Pro_Seg + Phase_Seg1 + Phase_Seg2) = 20MHz / (1+0x1F + 8) = 0.5Mbps
其中Sync_Seg是固定值 = 1 , Pro_Seg + Phase_Seg1 = NominalTimeSeg1, Phase_Seg2 = NominalTimeSeg2
2、配置数据阶段波特率
CAN时钟20MHz时,数据阶段的波特率就是
CAN FD Freq / (Sync_Seg + Pro_Seg + Phase_Seg1 + Phase_Seg2) = 20MHz / (1+5+ 4) = 2Mbps
其中Sync_Seg是固定值 = 1 , Pro_Seg + Phase_Seg1 = DataTimeSeg1, Phase_Seg2 = DataTimeSeg2
那么我是认为,这个时候CANFD的数据就是2M的速度发送,1M就是1us,2M应该是0.5us,0.5M是2us
所以我按照安富莱的进行配置,使用示波器查看数据如下。
稍微做了一些修改,修改方式是: FDCAN_FRAME_FD_NO_BRS
g_hfdcan[ch].Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
如果我不按照这个配置发现CAN分析仪接收不到。
那么实际和我的理解有出入了,因为我认为主要的配置在数据域上,仲裁默认配置为1M即可。
还有正点原子配置的是只有1M的仲裁阶段,没有配置数据阶段。实际波特率就是仲裁域的速度
实际上整个CANFD的数据的速度都在仲裁域上,貌似和数据域关系不大。因为我使用周立功的CANFD工具抓取数据包的时候有一个配置是这样的。
不开启CANFD加速:有仲裁,没有数据,开启了CANFD加速,才有数据域的作用。那么这个数据域就不是我理解的数据域了,仲裁域的波特率才表示CAN报文的波特率
那么CAN还是1M啊,除了64个字节以外,没什么特别的感觉,我总觉得哪里不对。
但是我实际测试的效果也是这样的。
我完全可以不配置数据域,只配置仲裁域。配置的仲裁域就是对应的CAN的波特率。
我想问问大家,到底是实际的数据速度是数据域,还是说就是测试的这样,实际的速度是仲裁域,其实数据域没啥用。
我认为CANFD肯定是能到达5M的波特率的,所以我认为还是哪里不对,有朋友知道的吗?
CANFD能否把波特率加到2M以上,竟然CAN收到芯片都写着最高5M,那肯定能到5M才对,否则和1M的CAN收发器不就没多大区别了吗?
是不是和我的配置有关系,因为我使用的是 FDCAN_FRAME_FD_BRS
会不会因为FDCAN_FRAME_FD_NO_BRS 这个配置导致使用最低的波特率,因为不能改变,但是我使用 FD_BRS周立功的CAN分析仪就接收不到数据了。因为我开启了重发机制,导致整个数据报文就特别的多,一直在进行数据的重发
还是这个FD_BRS的配置有什么要求的。否则无法启用
|
最佳答案
查看完整内容[请看2#楼]
我自己回复一下,测试了没有问题,关键点的确在于_FD_BRS这个,开启了可变才会使用到数据域的波特率,还需要把CAN分析仪配置的一样,我用示波器查看波特率的确是500ns。的确是2M的速度
|