1、CAN-FD特性
(1)兼容经典CAN,可以遵循ISO 11898-1做数据收发。
(2)提升错误检测,支持高达CRC 21位的校验和。
(3)消息优先级。
(4)保证延迟时间。
(5)配置灵活性。
(6)具有时间同步的组播接收。
(7)系统范围内的数据一致性,每条消息最多64个字节。
(8)多主机。
(9)错误检测和信号。
(10)区分节点的临时错误和永久性故障以及自动关闭缺陷节点。
2、CAN-FD格式:
第一个仲裁阶段(The first arbitration phase)是一条消息,其中包含:
(1)帧开始(SOF)。
(2)ID号和其他位,指示消息的目的(提供或请求数据),以及速度和格式配置(CAN或CAN-FD)。
数据传输阶段(The data transmission phase)包括:
(1)数据长度代码(DLC),指示消息包含多少数据字节。
(2)用户希望发送的数据。
(3)检查循环冗余序列(CRC)。
(4)显性位。
第二个仲裁阶段(The second arbitration phase)包含:
(1)总线上其他节点发送的确认(ACK)的接收器(如果至少有一个接收器成功收到消息)
(2)帧尾(EOF),在IFS期间不传输任何消息:目标是将当前帧与下一帧分开。
注意:对于29bit标识符帧,当添加18bit标识到第1个仲裁阶段的IDE bit之后与标准CAN FD是类似的。
二、CAN-FD相比CAN2.0的提升
CAN-FD的开发可以满足需要更高带宽的通信网络需求。每帧最多具有64个字节的CAN-FD以及将比特率提高到最大的可能性,使数据阶段要快8倍,在第二个仲裁阶段要恢复到正常的比特率。通过以下方式确保数据传输的完整性:
(1)17级多项式对最大16字节的有效载荷进行CRC。
(2)21级多项式对16到64字节之间的有效载荷进行校验。
标准帧和CAN FD的区别:
标识符后,CAN 2.0和CAN-FD具有不同的作用:
(1)CAN 2.0发送RTR位以精确确定帧类型:数据帧(RTR为主要)或远程帧(RTR)是隐性的)。
(2)由于CAN-FD仅支持数据帧,因此始终发送占优势的RRS(保留)。
IDE位保持在相同位置,并以相同的动作来区分基本格式(11位标识符)。请注意,在扩展格式的情况下,IDE位以显性或隐性方式传输(29位标识符)。
与CAN 2.0相比,在CAN-FD帧中,在控制字段中添加了三个新位:
(1)扩展数据长度(EDL)位:隐性表示帧为CAN-FD,否则该位为显性(称为R0)在CAN 2.0帧中。
(2)比特率切换(BRS):指示是否启用两个比特率(例如,当数据阶段位以不同的比特率传输到仲裁阶段)。
(3)错误状态指示器(ESI):指示节点处于错误活动模式还是错误被动模式。
控制字段的最后一部分是数据长度代码(DLC),它具有相同的位置和相同的长度(4位),用于CAN 2.0和CAN-FD。 DLC功能在CAN-FD和CAN 2.0中相同,但CAN-FD有很小变化(下表中的详细信息)。 CAN-FD扩展帧允许单个消息中发送64个数据字节,而CAN 2.0有效负载数据最多可以发送8个字节。
通过增加有效载荷数据的数据字段来改善网络带宽,因为需要更少的包处理。 同时,通过为CRC添加更多位来增强消息完整性:
(1)如果有效载荷数据最多为16个字节,则CRC以17位编码。
(2)如果有效载荷数据大于20(16)个字节,则CRC以21位编码。
另外,为了确保CAN-FD帧的鲁棒性,填充位机制支持CRC字段。下表总结了CAN-FD和CAN 2.0之间的主要区别。 提供的主要功能与CAN 2.0相比,CAN‑FD的改进之处在于数据有效负载的增加和速度的提高由CAN-FD中可用的BRS,EDL和ESI位来确保。
三、CAN FD协议介绍
STM32H7的CAN FD符合ISO 11898-12015标准。
STM32器件上的FDCAN的功能如下所示:
(1)符合CAN协议2.0版A,B和ISO 11898-1:2015,-4。
(2)可访问的10 KB RAM内存,最多可分配2560个字。
(3)改进了接收过滤。
(4)两个可配置的接收FIFO。
(5)多达64个专用接收缓冲区。
(6)接收高优先级消息时的单独信令。
(7)多达32个专用发送缓冲区。
(8)可配置的发送FIFO和发送队列。
(9)可配置的发送事件FIFO。
(10)时钟校准单元。
(11)收发器延迟补偿。
下图说明了FDCAN框图。
通过这个框图要了解到以下信息:
(1)CANFD1和CANFD2共用一个RAM空间
(2)每个CANFD都有自己的内核
(3)CAN内核实现协议控制和收发移位寄存器
(4)Tx handler控制消息从CAN消息RAM到CAN内核
(5)Rx handler控制CAN内核到CAN消息RAM
四、RAM管理
必须配置每条消息的字节数,以确定每条消息所需的内存大小。 CAN-FD上有效负载的增加可以更有效的将内存都利用起来,并允许更多消息要存储在分配的存储空间中。
总的专用RAM大小是2560个32bit数据。
(1)过滤区(11bit过滤和29bit过滤)
(2)接收区(Rx FIFO 0,Rx FIFO 1和Rx Buffer)
(3)发送区(Tx event FIFO,Tx Buffers)
(4)触发空间(Trigger memory)
FDCAN外设的所有部分都可以由用户配置。 所有部分的所有元素之和必须不能超过CAN消息RAM的总大小。 该RAM通过以下方式提高了灵活性和性能:从而有可能消除未使用的部分,并为其他部分扩展足够的内存。在CAN消息中以动态且连续的方式分配每个部分(按照上图顺序); 但是为了避免超出RAM的风险并且出于可靠性的原因,没有将特定的开始和结束地址分配给每个部分。
FDCAN外设可以配置三种传输机制:Tx buffer ,Tx queue 和 Tx FIFO并可以通过Rx buffer 和 Rx FIFO 接收。 它们配置有起始地址偏移量和要存储的存储元素。 起始地址是在配置中预定义的(0到2560),用户必须确保每个内存空间中的元素数量不会导致它们重叠。
注:消息的接收和发送意味着在RAM级别存储“元素”。 这个“元素”仅包含标识符,DLC,控制位(ESI,XTD,RTR,BRS,FDF),数据字段和特定的发送/接收位字段进行控制。 CAN消息的其余位会自动由硬件处理而不保存在RAM中 。
用于控制接收的特定位字段是滤波器索引,可接受的不匹配帧和Rx时间戳。用于传输的特定位字段是消息标记(message marker)和event FIFO控制位。无论Tx buffer, Tx FIFO, Tx queue 或 Rx buffer 中的每个元素分配的32bit的数量是多少,要计算保留:
(1)标头信息(两个保留的32bit),用于分配标识符,DLC字段,控制位和特定的发送/接收位字段。
(2)数据(足够的32bit数据个数)以包含每个数据字段的字节数。
下面的公式确定为每个元素分配的32bit的数量:
元素大小(以字为单位)=标头信息(2个字)+数据(数据字段/ 4)
其中数据字段是每条消息的数据字节数
如果数据字段的范围是0到8,则每个元素为数据分配2个字。下表详细介绍了必要的“元素”大小,具体取决于数据字段范围
有效使用CAN消息RAM的示例。 这个例子假设配置了FDCAN外设的应用程序:
(1)发送带有专用Tx buffer的32条消息(每个消息在数据字段中包含8个字节)。
(2)具有128个11位过滤器,用于接收消息。
(3)接收64条消息,其中每个消息在专用Rx buffers的数据字段中包含64个字节。
(4)接收64条消息,其中每个消息在Rx FIFO 0的数据字段中包含64个字节。
在此示例中,RAM中的分配按以下顺序进行:
(1)在ID-11位部分分配128个字。
(2)保留1152个字用于接收Rx FIFO 0部分中的元素。
(3)保留1152个字,用于接收Rx缓冲区中的元素。
(4)为发送缓冲区中发送的元素保留128个字。
由于采用了动态分配,并且不对未使用的段进行任何分配,因此整个内存大小有效利用了RAM:在此应用程序中分配了所有2560个字。
注意:配置后,分配的地址范围初始化为零
大多数STM32设备支持一个以上的FDCAN外设来满足所有应用程序要求。在这种情况下,重要的是要说RAM是在不同外设之间共享的。 用户可以划分各种外设上的RAM(每个外设的大小通过指示其起始偏移地址来选择)。下图显示了使用多个FDCAN实例的CAN消息RAM的示例。 这该示例假定用户将CAN消息RAM分为两个外设:第一个外设的大小为第二个外设的两倍。
(原作者 硬汉Eric2013)