目录
9.4 Message Object FIFO Structure
1.硬件部分


采用usb 供电,



2.can 协议部分
2.1 error 发送和错误处理
CRC 错误:发送端和接收端can 内核计算CRC 错误
ACK错误:没有任何节点正确接收这帧
格式错误:格式错误 CAN 帧结构被破坏(ACK 界定符检测到显性)
Bit 错误:位错误,can 载波监听多路访问 / 冲突仲裁(CSMA/CR)
Stuff 错误:位填充规则被破坏(连续5个相同位后,必须插入一个反相位)
3.MultiCAN+ Kernel 功能分析

3.1Bitstream Processor:
根据ISO11898规则进行处理,实现对bit 级到帧级之间的转换,同时完成位时序、填充、CRC、错误检测等关键功能。
1.一旦检测到错误:
通知 Error Handling Unit
立即发送 Error Frame
中止当前帧
2.仲裁阶段:仲裁失败停发
自己发 recessive却读到 dominant
3.2Bit Timing Unit
决定 CAN 每一个 bit 的时间长度和采样点位置,并在总线出现相位偏差时通过重同步(resynchronization)来保证所有节点位时序一致。
3.3 Error Handling Unit
错误处理单元会对发送和接收进行错误计数,使得can 节点进入主动错误,被动错误,关闭总线状态
3.4 Node Control Unit
启用/禁用节点的can 传输,生成中断请求的节点特定事件(Can 错误,帧传输成功)
管理帧计数器和节点计时器
3.5 Interrupt Control Unit
can 节点根据产生不同的can 条件产生的中断控制处理
3.6 Message Controller
处理CAN 节点之间的can 帧交换以及存储在消息RAM中的消息对象,执行接受过滤和发送过滤(当有多个 Message Object 同时请求发送时,哪一个 Message Object 会最先被发送。),处理FIFO 缓冲区和网关功能
3.7 List Control
List Controller 是 MultiCAN+ 内部的“MO 链表管理员 + 调度执行器”,唯一允许修改 MO 链表的模块
3.8 Interrupt Control
1.多个中断源可以“绑定”到同一个 INP,只要其中 任意一个 触发,就能触发中断
2.决定“这个中断,最终接到哪一根硬件中断输出线”
3.中断事件使能和中断信号到达才能触发中断

3.4.时钟部分

The fSYN_CAN is identical to fSPB. fAi is the asynchronous clock input。fCLC根据多少个node 和message object 有最小操作频率的要求
3.5.CAN Analyzer Mode
CAN Analyzer Mode is activated when bit NCRx.CALM is set to 1. I
本质上只“接收 / 监听”,不会主动发送任何 CAN 帧
在完全不影响CAN总线行为的前提下,仍然让CAN 控制器像正常节点一样理解总线上的事情。
接收到的远程帧存储在相应的发送消息对象中,为什么放在发送消息对象中呢?
因为远程帧是请求数据,就是对应TX id,在初始化的时候根据ID 和类型会注册接收或是发送TX,rx mo 所以就放在了txMo里面
而到达的数据帧则保存在匹配的接收消息对象中。
如果启用了 CAN 分析器模式,相应的数据帧不会响应远程帧,并且不能通过设置发送请求位 MOSTATn.TXRQ 来传输数据帧。在 CAN 分析器模式下(如果已启用),所有无错误的接收帧都会产生接收中断。
3.6.Bit Timing Unit

同步段:硬同步和重新同步
SOF 的下降沿 = 同步“基准起点”

重新同步:发生在帧传输过程中,检测到 recessive → dominant 边沿
采样点由于PLL 抖动,晶振误差,导致逐渐漂移,冲同步当检测器检测到期望bit
期望 bit 边沿 ≠ 实际检测到的边沿就触发重新同步。

传播时间段
的作用,是为“信号从发送节点到接收节点并返回”的物理传播延迟预留时间,
保证在采样点到来之前,总线电平已经稳定、全网一致。
相位缓冲段1
用于“在采样点之前吸收相位误差并允许重新同步”,
相位缓冲段2
用于“在采样点之后保持位时间完整,防止采样点被破坏”。

the ISO standard. According to ISO standard, a CAN bit time,calculated as the sum of TSync, TSeg1 and T Seg2 , must not fall below 8 time quanta
Tseg1 最小3tq,Tseg2 最小2tq
3.7.位流处理器
将bit与can总线传输的帧相互转换,控制CRC 生成器,并将校验和信息添加到数据帧中。
对接收到的can 总线进行仲裁,在总线处于空闲状态时继续帧传输,在数据运行期间,监控I/O线,检测到不匹配,则生成错误中断请求。
3.8.错误处理单元
内部有两个计数器-接收错误计数器和发生错误计数器,如果位流处理器在发送操作运行时本身检测到错误,发送错误计数器会增加 8。当错误状态通过错误帧由外部 CAN 节点报告时,使用 1 次增加。
根据错误计数器的值,can 节点被设置为错误激活,错误被动或总线关闭状态。
如果发送或接收错误计数器都低于128错误被动限制,则can 节点处于错误激活状态,如果至少有一个错误计数器等于或大于128,处于错误被动状态,发送错误计数器等于大于256总线关闭限制。
3.9.CAN Frame Counter
每个can 节点都配备一个帧计数器,用于计数发送/接收的can 帧,或获取can 节点开始发送或接收帧的时间信息。
帧计数模式:
时间戳模式
帧计数器在新的一位时间开始时增加,当真的传输/接收开始时,帧计数器的值被捕获并存储到NFCRx寄存器的 CFCVAL位字段。
位时序模式
用于波特率检测和位时序分析
错误计数模式
If the NFCRx.CFCIE interrupt bit is enabled, the NFCRx.CFCOV overflow flag will be set when the frame counter overflows.
3.10.节点定时功能
CAN 节点定时功能,用硬件定时器在“不经过 CPU”的情况下,
1.实现接收超时监控和周期/触发式发送报文。
2.定时触发发送
3.11.can 节点中断
有物种硬件触发中断请求类型
1.成功发送或接收一个数据帧
2.发送CAN 协议错误,且带有最后一个错误代码
3.一个警报条件:传输/接收错误计时器达到警告限制,总线关闭状态变化,发生李彪长度错误或发生列表对象错误
4.帧计数器溢出
5.节点计时器A,C或D事件
4.消息对象列表结构
MultiCAN 模块的消息对象以双向链表的形式组织,每个消息对象都有指向前一个消息对象的指针,以及指向列表中下一个消息对象的指针。MutilCAN 最多16个列表。
如下图:三个消息对象(3,5,16)被分配到索引位2的列表

列表寄存器中的位字段 BEGIN(BEGIN = 5)指向列表中的第一个元素(示例中的对象 5),而位字段 END 指向列表中的最后一个元素(END = 3)。列表中的元素数量由列表寄存器的位字段 SIZE 指示(SIZE = 列表元素数量 - 1,因此示例中的 3 个元素 SIZE = 2)。列表寄存器的 EMPTY 位指示列表是否为空(示例中 EMPTY = 0,因为列表 2 不为空)。
每个消息对象 n 在其消息对象 n 状态寄存器 MOSTATn中都有一个指针 PNEXT,指向列表中的下一个消息对象,以及一个指针 PPREV,指向列表中的前一个消息对象。第一个消息对象的 PPREV 指向其自身,因为第一个消息对象没有前驱(在示例中,消息对象 5 是列表中的第一个消息对象,由 PPREV = 5 指示)。最后一个消息对象的 PNEXT 也指向该消息对象本身,因为最后一个消息对象没有后继(在示例中,对象 3 是列表中的最后一个消息对象,由 PNEXT = 3 指示)。
位字段 MOSTATn.LIST 指示消息对象当前分配到的列表索引号。示例中的消息对象分配给了列表 2。因此,所有分配给列表 2 的消息对象的 LIST 位字段都设置为 LIST = 2。
4.1 List Command Panel
列表结构不能通过写入 LIST 寄存器和消息对象状态寄存器中的 PPREV、PNEXT 和 LIST 位字段直接修改,因为这些是只读的。列表结构由 MultiCAN+ 模块内部的列表控制器管理和限制。通过命令面板控制列表控制器,允许用户向列表控制器发出列表分配命令。
5.CAN 节点分析器模式
5.1分析器模式
在CAN 分析器模式下,CAN 节点的发送引脚始终保持隐性电平。接收时不会回复ACK,但是会将接收的数据存储在匹配的消息对象中。
5.2回环模式
5.3 位时序分析
可以使用 CAN 帧计数器的分析模式对每个 CAN 节点进行位时序分析。帧计数器的位时序分析功能可用于自动检测 CAN 波特率,以及分析 CAN 网络的时序。
自动波特率检测
同步分析
测量第一个主导边缘与采样点之间的时间,可以从此时间推导出位时同步偏移量,因为采样点后的第一个边缘会触发同步
驱动延迟测量
测量传输边缘和相应接收边缘之间的延迟,这些延迟表示在can 总线上实现的一个新位值所需时间。
6.消息接受过滤
6.1 接收接受过滤
当一个can 帧被can 节点接收需要满足以下六个条件:
1.该消息对象被分配到can 节点的消息对象列表
2.消息对象状态寄存器的MOSTATn.MSGVAL 位被设置。
3.MOSTATn.RXEN 位被设置
4.MOSTATn.DIR 位等于接收帧的 RTR 位
5. MOAMRn.MIDE 位,==0只接收标准帧,==1只接收扩展帧
6.接收帧的标识符与存储在消息对象仲裁寄存器中的标识符相匹配,接收到的ID 需要和这组(id&mask)相匹配。

消息对象定义了优先级方案:
1.MOa 的优先级高于MOb 意味着MOA.PRI 必须大于或小于MOARb.PRI
2.如果两个消息对象具有相同优先级类别,那么MOb 是MOa 的列表后继
例子:当一个ID 同时匹配多个MO时,这一帧数据硬件该写哪个MO?
1.比较MO.PRI,PRI高的MO赢
2.PRI相同,按list 顺序
3.高优先的MO真正接受
6.2 传输接受过滤
在“同一个 CAN 节点内部”,决定“哪一个消息对象(MO)有资格参与发送、以及谁先参与发送”。
1.消息对象被分配到CAN节点的消息对象列表中
2.标志MOSTATn.MSGVAL 被设置
3.标志MOSTATn.TXRQ被设置
4.标志MOSTATn.TXEN0和MOSTATn.TXEN1被设置

7.Message Postprocessing
消息对象成功接收或发送帧后,CPU 可以被通知对消息对象执行后处理。MultiCAN+模块的后处理由两个元素组成:
1.消息中断触发后处理
2.消息挂起寄存器用于将挂起的消息中断收集到一个公共结构中进行后续处理。

接受或发送一帧消息到达ACK 段的时候会产生一个TXPEND/RXPEND信号,只有当TXIE或RXIE 使能才会直接生成一个中断信号,并路由到十六个 CAN 中断输出线之一。
7.1 Pending Messages
当生成消息中断请求时,一个消息待处理位会在消息待处理寄存器的一个被设置。总共最多256个消息挂起位(8*32)

一个挂起位的地址由两个复用器定义。3bit 来对应MSPEND0-7 , 5bit 对应MSPND0-7寄存器内具体的bit 位置。
至于这个8个bit 如何组合呢?有两种分配方式
案例1:
MCR.MPSEL = 0000
MOIPRn.MPN 的上三位(MPN[7:5])选择挂起位将被设置的 Message Pending Register MSPNDk 的数量 k
MOIPRn.MPN 的低位五位(MPN[4:0])用于选择 MSPNDk 中的位位置(0-31),用于设置挂起位。
案例2:
MCR.MPSEL = 1111
在发送事件中,TXINP 的高 3 位决定了挂起位将被设置的 Message Pending Register MSPNDk 的编号 k。在接收事件中,RXINP 的高 3 位决定了编号 k。
MSPNDk 中待设置位的位位置(0-31)由 TXINP 或 RXINP 的最低位选择(在 MSPNDk 的低半字和高半字之间选择)以及 MPN 的四个最低有效位确定
8.消息对象数据处理
8.1 消息接收部分
MultiCAN+模块不仅将接收到的数据复制到消息对象中,还提供了高级功能,以实现 MultiCAN+和 CPU 之间的一致数据交换。
MSGVAL:
只有当MSGVAL = 1,信息才会存储在消息对象中,如果CPU 将MSGVAL 位复位,MultiCAN模块将停止所有正在进行的对消息对象的写访问
RTSEL:
这次接收事务是否仍然有效。当重置MSGVAL时,应该再次设置MSGVAL之前清除RTSEL,防止该访问权限以防止存储属于消息对象旧上下文的数据帧。
清除MSGVAL的步骤:
1.清除MSGCAL位
2.在MSGVAL = 0 时重新配置消息对象
3.清除RTSEL位再次配置MSGVAL
RXUPD、NEWDAT、MSGLST
RXUPD(接收更新)标志指示正在进行的帧存储过程
NEWDAT:在存储接收到的帧(标识符、IDE 位、DLC;包括数据帧的数据字段)后,消息对象的 NEWDAT(新数据)位被设置
MSGLST(消息丢失)位设置为指示数据丢失状态

8.2 消息发送部分
一条消息只能在其所有四个位在寄存器 MOSTATn、MSGVAL(消息有效)、TXRQ(发送请求)、TXEN0(发送使能 0)、TXEN1(发送使能 1)
MSGVAL 消息有效
TXRQ 发送请求,每当需要发送消息对象时,必须设置此位,TXRQ 成功传输结束时由硬件清除
TXEN:传输使能
RTSEL:
当一个消息对象在传输接受过滤后被识别为下一个传输对象时,接收/传输选择位 MOSTATn.RTSEL 被设置。当消息对象被复制到内部传输缓冲区时,会检查 RTSEL 位,并且只有当 RTSEL = 1 时才传输消息。
NEWDAT:
当消息对象的内容被传输到 CAN 节点的内部传输缓冲区时,硬件会清除 MOSTATn.NEWDAT(新数据)位,以指示传输的消息对象数据不再新,当帧传输成功并且 NEWDAT 仍然被清除(如果在此期间没有将新数据复制到消息对象中),硬件会自动清除 TXRQ(传输请求)。

9.消息对象功能
9.1.标准消息对象
9.22.单数据传输模式
传输模式通过位MOFCRn.SDT 选择
消息接收:
当存储在消息对象中的接收消息被新接收的消息覆盖时,第一个消息的内容会丢失,并被新接收消息的内容所取代(由 MSGLST = 1 指示)。
如果 SDT 被设置(单数据传输模式激活),在接收到的数据或远程帧存储后,消息对象中的 MSGVAL 位会由硬件自动清除。这可以防止接收更多消息。
消息传输:
当消息对象接收到一系列多个远程请求时,它会响应这些远程请求传输多个数据帧。如果在传输之间的时间消息对象中的数据没有更新,相同的数据可能会在 CAN 总线上发送多次。
在单数据传输模式(SDT = 1)下,这种情况会被避免,因为 MSGVAL 在数据或远程帧成功传输后会自动清除。
9.3.单次发送尝试
STT 管的是“失败以后还要不要再试着发”
STT = 1 失败后不会重发
9.4 Message Object FIFO Structure
9.4.1 接收FIFO
在 CPU 负载较高的情况下,可能难以及时处理一系列 CAN 帧。这可能会发生在接收到多个消息或必须在短时间内传输多个消息时。
FIFO 结构还可以用于自动接收或传输一系列CAN 消息,并在整个CAN帧系列处理完毕时生成单个消息中断。对于 FIFO 从属对象,隐含假设 MOFCRn.MMC = 0000,并执行标准消息传递。FIFO 从属对象的实际消息模式(MMC 设置)被忽略
1.FIFO Base Object
只负责管理FIFO,定义FIFO的边界,当前使用的哪一个Slave,不一定参与真正的数据收发
2.FIFO Slave Objects (从对象)
必须在同一个List 中,通过PNXT串成一个链表,真正存数据,发数据,收数据的MO
3.Base Object 不要求和 Slave 在同一个 List只有 Slave 需要在同一个 List
MOFGPRn.BOT 指向(包括数量)FIFO 结构中的底部从属对象
MOFGPRn.TOP 位字段指向(包括数量)FIFO 结构中的顶部从属对象
MOFGPRn.CUR 位字段指向(包括数量)MultiCAN+模块实际用于消息传输的从属对象
CUR 指针没发生一次消息传输,当前使用CUR 指向Slave MO,传输完成CUR 自动更新为PNEXT
SEL:当CUR 指针走到SEL 指向的Slave Mo时,触发一次中断,典型用途,检测FIFO 跑完一轮,CUR 回到某个特定位置,进行中断
FIFO 快满预警
FIFO 有8个Slave,SEL 设在第6个。

接收到 CAN 帧时,基本对象的当前指针 CUR 会设置为 FIFO 结构中下一个消息对象的编号。该消息对象随后将用于存储下一个接收到的消息。
9.4.2 发送FIFO
发送 FIFO 结构用于缓冲一系列必须发送的数据或远程帧。发送 FIFO 由一个基础消息对象和一个或多个从属消息对象组成。
通过在 FIFO 基础对象中设置 MOFCRn.MMC = 0010 来选择发送 FIFO。与接收 FIFO 不同,分配给发送 FIFO 的从属对象必须明确设置其位字段 MOFCRn.MMC = 0011。
只有消息对象MOSTATn.TXEN1为1,才能通过发送接受过滤,发送完成之后硬件会清除其TXEN1位,并将CUR 指针移到下一个要发送的FIFO基础对象,下一个消息对象TXEN1自动设置为1.
可以通过MOFGPRn.SEL ,来生成FIFO 溢出中断请求,当FIFO 达到具体要求发送的消息时,会产生溢出中断标志。
9.4.3 硬件网关 Gateway
收到一阵后,硬件自动将源Mo里的内容,拷贝到一个或多个目的MO,并可选择立即触发发送或中断,全程不需要CPU 参与
Gateway Source Object 本质还是一个“普通接收 MO”,但在接收完成后,MultiCAN 会自动执行一套“拷贝 + 触发 + 指针推进”的额外动作,把这帧转交给 Destination MO,(可以选择转发并立即发出还是只缓存,等软件处理)
如果是多个Destination MO,可以通过FIFO 机制让多次接收,轮流写入多个Destination。
BOT = Dest_MO_0 TOP = Dest_MO_3 CUR 初始 = Dest_MO_0
| 接收到的帧 | Gateway 写入 |
| 第 1 帧 | Dest_MO_0 |
| 第 2 帧 | Dest_MO_1 |
| 第 3 帧 | Dest_MO_2 |
| 第 4 帧 | Dest_MO_3 |
| 第 5 帧 | Dest_MO_0(回环) |

9.4.4 外来远程请求
当在CAN 节点上接收到远程帧并存储在消息对象中时,会设置传输请求以触发对请求的应答或自动发出次级请求。
如果设置(FRREN =1 :外部远程请求使能),则会有指针MOFGPRn.CUR 引用的消息对象中设置TXRQ。
实际应用例子:诊断CAN 到地盘CAN 的Gateway Remote 转发

诊断和底盘挂载两条can 总线上,当诊断需要请求一个车速信息,网关Destination节点收到远程帧请求之后,发现当前节点并没有此ID。
不过内部用的是 MultiCAN Gateway 硬件,Gateway ECU,FRREN = 1。必须去连接地盘总线的Source节点。
网关Source节点上发送Remote帧,底盘会回复信息数据给网关Source 节点,Gateway Source Object 接收硬件拷贝给Destination Object
Gateway Destination Object在诊断总线上回复远程帧。
9.4.5 CANFD -64字节消息
单个MO 支持8个数据字节的有效载荷,当canfd 要发送64字节时数据字节缓冲区必须扩展。
MOFCR.MMC = 5。使用的额外消息对象由MOFGPR.BOT 和MOFGPR.TOP 寄存器位上的指针指定。(即这些Message Object存器(MOFCR、MOFGPR、MOIPR、MOAMR、MODATAL、MODATAH 和 MOAR)在相同地址位置上使用它们的备用寄存器视图来存储额外的数据字节,MOCTR 是唯一一个不用于数据存储的寄存器,它保留其原始功能。
以 64 字节消息为例,数据字节 0-7 存储在消息对象中,类似于标准消息对象;数据字节 8-35 存储在 MOFGPR.BOT 指向的消息对象中;数据字节 36-63 存储在 MOFGPR.TOP 指向的消息对象中。
10.MultiCAN内核寄存器


11.网关应用场景
用例简短描述
1.NODE2 ID 0x444 向总线发送数据
2.NODE0 接收消息并立即将接收到的数据网关到NODE1,并分配给CAN 节点1的三个消息对象(MO1作为FIFO的基础对象,MO2-MO3的FIFO 从属对象)
3.CAN节点1在通过网关接收数据后将数据内容以0x777发送给CAN 节点3

待补充。

4673

被折叠的 条评论
为什么被折叠?



