FPGA-CAN MAC 层 IP 核测试(二) 4字节发送 改成 8字节发送 标准帧

 

FPGA CAN MAC 层 IP 核测试(一) 上板实测 - 所长 - 博客园

FPGA-CAN MAC 层 IP 核测试(二) 4字节发送 改成 8字节发送 - 所长 - 博客园

 

没改之前的源码:

WangXuan95/FPGA-CAN: An FPGA-based lightweight CAN bus controller. 基于FPGA的轻量级CAN总线控制器

 

代码一通乱改后,可以发送标准帧+8字节,波形抓取:

image

 

image

 

CAN 入门手册 

ScreenShot_2026-07-29_095516_733

 

以下是对标准CAN(控制器局域网)数据帧各字段的中文详细解释。为了方便理解,我在解释中补充了“显性”和“隐性”的电子特性含义(显性通常代表逻辑0,优先级更高;隐性代表逻辑1)。

-

• SOF(帧起始)
1个显性位。用于标记一条报文的开始,并在总线空闲后重新同步总线上的所有节点。

• Identifier(标识符)
标准CAN的11位标识符。它决定了报文的优先级——二进制数值越低,优先级越高(在总线仲裁时,显性位优先于隐性位)。

• RTR(远程发送请求)
1个位。当某个节点需要从其他节点请求信息时,该位为隐性。所有节点都会收到该请求,但由标识符来决定具体响应的是哪个节点。响应的数据同样会被所有节点接收,并供感兴趣的节点使用。这种方式保证了系统中所有正在使用的数据是一致的。

RTR  -> 显性表示数据帧;

• IDE(标识符扩展位)
1个位。当该位为显性时,表示当前发送的是标准CAN标识符(即不扩展为29位扩展帧)。

• r0(保留位)
1个保留位,留作未来标准修订时可能使用(目前通常为显性)。

• DLC(数据长度码)
4个位。用于指示当前报文所传输的数据字节数(有效范围为0~8,对应数据段长度)。

• Data(数据段)
最多可传输 64位(即8个字节) 的应用层数据。

• CRC(循环冗余校验)
共16位(由15位校验序列 + 1位界定符组成)。它包含对前面应用数据的校验和,用于接收端进行错误检测,判断数据在传输过程中是否受损。

• ACK(应答场)
共2位(1位应答位 + 1位界定符)。
工作方式:任何一个成功接收到准确报文的节点,会将原报文中的这个隐性位覆盖为显性位,以表示收到了无差错报文。如果某个接收节点检测到错误,则会将此位保持为隐性;发送节点发现应答缺失后,会丢弃当前报文,并在重新总线仲裁后再次重发该报文。通过这种方式,每个节点都对自身数据的完整性进行了“应答确认”。

• EOF(帧结束)
7个位的场。用于标记CAN帧(报文)的结束。此区域会禁用位填充机制,且如果在该区域检测到显性位,则会被视为填充错误(因为此处预期为全隐性)。
补充解释“位填充”:在正常操作中,若连续出现5个相同的逻辑电平,则会自动插入1个相反电平的位,以防止时钟同步丢失。

• IFS(帧间空间)
3个位。包含了控制器将正确接收的帧移动到消息缓冲区中合适位置所需的时间间隔,用于帧与帧之间的间隔分隔。

 

CAN 扩展帧

 

  • SRR(替代远程请求位):在扩展帧格式中,SRR 占据标准帧里 RTR 位的位置,作为占位比特。
  • IDE(标识符扩展位):IDE 为隐性电平时,表示后续还有更多标识符比特;IDE 之后紧跟 18 位扩展 ID。
  • r1:在 RTR 位与 r0 保留位之后、DLC 长度位之前,新增 1 个保留位。

 

标准帧示波器图   CAN 总线 - 维基百科

CAN-Frame_mit_Pegeln_mit_Stuffbits

 

CAN CRC计算范围?

image

 BUG1: 接收方,对于ACK什么时候发送

image

 源代码里, 多了一个 本地ID 匹配,才会发送 ACK 信号, 这个要注意,和标准不太一样;

image

 

BUG2: 源码里 本地发送数据 ,在收到 总线8个隐性位后, 还需要等待 不确定位,才会发送, 

  我理解,收到11个 隐性位后, 有数据发送,就要发送 SOF,否则不会产生总裁,因为 每次都是等别人发送完成 ,  再发送数据

1、需要 在 状态机里,跳转 IDLE 之前,将 cnt 清零;注意 有很多个  状态 跳转  IDLE;

2、在 IDLE 状态里  将 end else if(cnt<8'd20) begin   改为 end else if(cnt<8'd1) begin

 

通道0发送,仲裁失败,不在发送数据,转接收,并在通道2产生 ID匹配正确的 信号,  波形抓取:

 

image

 仲裁失败后,上位机发送所有的帧后, 再将数据发送出来: 图中  应该是  500kbps

image

 

posted on 2026-07-04 14:13  所长  阅读(20)  评论(0)    收藏  举报

导航