1520_AURIX TC275 FPI总线接口 SFI桥简介

本文详细介绍了嵌入式系统中的SFI、FPI和SPB总线技术。SFI是一个单向总线,用于接收SRI的信息,而FPI在结构上与SRI相似,但包含数据处理功能。SPB基于PFI,具有更复杂的仲裁规则和饥饿机制。文章探讨了总线的传输类型、错误处理以及配置选项,对于理解嵌入式系统的内部通信机制提供了深入见解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com)

前面大概看完了SRI的介绍,这一次开始看SFI。其实,看SRI的时候遇到了一个名词不知道是什么概念,这个名词是FPI。其实,SFI与之基本是对等的概念。

1. 首先看这个标题,基本上在一定程度上解答了我之前不熟悉的FPI的概念。但是,依然没有看到这个是什么单词的缩写。

2. SFI是一个单向的总线,我重新看了之前的总线设计的拓扑图。这个SFI只能够接收来自于SRI的信息,但是不能够发送给SRI。SRI是一个64bit的总线,而SFI是32bit,因此传输的过程中有一个数据转换的过程。

3. SFI可以缓冲多个写操作的处理。这样,SPB通过SFI向SRI写入操作可以在SPB上完成,同时通过SFI在SRI上同步。如果写入出现了问题,SPB不会得到什么信息提示。其实,后面的结论很容易理解,前面的同步我有点糊涂。开始,我以为这种同步是因为总线宽度不同因此有了一个转换效率导致了一定的加速。但是现在看来,既然这个总线是一个单向的,或许这个根本就不会成功。而这部分的描述或许只是为了表达错误产生之后不会得到什么提示信息。

1. 从功能的划分来看,FPI很多结构的概念跟SRI是相似的。

2. 刚开始看到320M字节的速度还觉得怎么突然间这么快了,但是看看单位其实很容易理解。这个MCU的地址总线基本都是32bit起步的,这也是为什么MCU被叫做32bit的MCU的原因。而这个速度其实就是有效的数据传输发生在了每一个时钟周期内的结果。

3. FPI的各种主从结构等描述跟SRI也是很相似的,但是多了一个数据的处理。

1. 类似SRI,FPI的处理本身也是通过主从的配合。

2. SBCU,总线控制单元。如果类比SRI来看,应该主要的功能类似于仲裁器,或者大一些Xbar_SRI。

1. 传输类型有几种:单传、块传、原子传。其中,原子传输看起来其实就是两个单传传输。

2. FPI总线事件请求时,如果slave正在忙,这可以导致FPI总线延迟传输。这时候,master会释放总线让slave提示是否已经ready。这个过程可以不断循环,一直到slave ready。

1. 这里多少有一点疑问,A0是一个什么概念?是寄存器吗?难道这个寄存器的作用在实现的时候是固定的,专门用来寻址?

2. FPI的基本操作:请求/授权、寻址、数据处理。

3. 从上面的传输示例来看,能够看出一个基本原则。上面的三种操作是可以同时发生的,但是每一个操作至多只有一个。

1. 开始的一段信息非常有用,这里能够让我明白一个基本的概念。其实SPB在概念上是要多于FPI的,因为从描述看,SPB是基于PFI的。而SBCU的缩写从这里能够看出一个完整的拼写,系统总线控制单元。是用来进行FPI的控制的。

2. 总线的仲裁规则:如果有挂起的请求,那么授权给最高优先级;如果没有挂起的请求,授权给默认;如果没有请求,那么进入idle。

3. 基于由县级的仲裁,而优先级是4bit的,这个是SRI的两倍。而且,用到的DMA控制器其实还有3个优先级。

4.前面提到了一个默认,那么什么是默认呢?其实,用的最频繁的master用作默认。如果是reset之后,优先级为0的作为默认。

5. 不同于SRI,SPB的总线仲裁只有优先级仲裁加上了饥饿机制,没有轮询。

6.复位之后,每一个优先级寄存器都有一个默认值。每一个FPI的master都有一个独立的默认优先级。

1. 默认优先级基本上在应用的时候就是最优的,但是依然可以改。

2. 改的时候需要注意,不要出现两个相同的优先级。

3. 主优先级的修改只能够在只有一个master的时候进行配置修改,有多个master的时候不能够改。

1. SPB的饥饿机制跟SRI中的饥饿机制类似,都是通过一个计数器来实现。这个机制是永远使能的。

2. FPI的错误处理条件:错误确认;为实现的地址访问;超时。

3. 如果出现错误会记录地址和数据。

1. 在进行错误捕获的时候,机制类似于SRI,只进行第一个错误的捕获。

2. 如果捕获了一个错误之后,寄存器会锁定。只有接触锁定之后,才能够进行下一次捕获。

3. 写入事务中TriCore(应该是CPU的意思)引起的错误不会被提示,因为它不是有效的主代理。

4. 错误捕捉设置中也有一个SV的模式。

5. 这里给出了几种错误码以及操作码。

以上是对SPB的基本功能做了一个大概的了解,有了之前对SRI的了解这部分看得时候还是比较顺利的。这一次的学习暂且到此,后面再看一下是否有类似SRI的一些调试或者细致的配置。

<think>好的,我现在需要详细分析用户提供的关于英飞凌AURIX TC3xx架构中的SRI总线映射配置语句:`map (dest=bus:tc0:fpi_bus, src_offset=0, dest_offset=0, size=0xc0000000);`。用户之前已经询问过类似的配置,现在可能希望深入了解这一行代码的具体含义和作用。 首先,我要确认用户的基础知识水平。用户之前已经接触过SRI总线的基本概念,可能具备一定的嵌入式系统背景,但需要更详细的参数解析。用户的问题集中在`map`指令的结构和参数,因此我需要逐一拆解每个参数的意义,并结合实际应用场景进行说明。 接下来,我需要回忆英飞凌TC3xx的文档,特别是关于SRI总线和地址映射的部分。SRI总线作为系统资源接口,负责连接内核、外设和内存。`map`指令在这里用于配置地址空间的映射关系,将源地址区域映射到目标总线。 参数分析: - `dest=bus:tc0:fpi_bus`:目标总线是物理核tc0的FPI总线。需要解释FPI总线的作用,以及tc0代表的具体含义,比如物理核中的某个具体实例。 - `src_offset=0`:源地址偏移为0,表示映射的起始地址从源总线的0开始。 - `dest_offset=0`:目标地址偏移也为0,意味着源地址0开始的区域直接映射到目标总线的0地址。 - `size=0xc0000000`:映射区域的大小为3GB。这个值可能对应系统的地址空间布局,需要说明为何是这个特定值,是否与内存分配或外设地址范围有关。 需要进一步考虑用户可能的疑问点:比如这样的映射如何影响物理核和虚拟核的访问,是否有地址重叠或冲突的风险,实际应用中的配置示例,以及调试时如何验证映射是否正确生效。 此外,用户可能想知道这样的配置在系统启动过程中的作用,比如是否在初始化阶段完成,以及如何与其他映射配置配合工作。是否需要提到安全机制或权限校验,尤其是在多核环境中,不同核之间的地址访问权限问题。 还要考虑用户的实际应用场景,比如在汽车电子中,这样的配置可能用于外设共享或资源分配,举例说明具体外设模块(如CAN、ADC)如何通过该映射被访问。可能需要提到性能影响,比如访问延迟或总线带宽的限制。 最后,需要检查是否有常见的配置错误或注意事项,比如地址范围溢出、偏移量设置不当等,并给出调试建议,如使用调试工具观察总线事务或相关寄存器状态。 总结,我需要将技术参数与实际应用、潜在问题及解决方案结合起来,确保用户不仅能理解这行代码的结构,还能掌握其在实际系统中的作用和影响。</think>在英飞凌AURIX TC3xx架构中,`map (dest=bus:tc0:fpi_bus, src_offset=0, dest_offset=0, size=0xc0000000);` 是一个关键的总线地址映射配置指令,其技术内涵如下: --- ### 一、指令结构解析 | 参数 | 值 | 技术含义 | |--------------|-------------------|--------------------------------------------------------------------------| | `dest` | `bus:tc0:fpi_bus` | 目标总线:物理核0的FPI总线(Frontside Peripheral Interface) | | `src_offset` | 0 | 源地址起始偏移量(映射源的基地址) | | `dest_offset`| 0 | 目标地址起始偏移量(映射目标的基地址) | | `size` | 0xC0000000 | 映射空间大小(3GB,对应地址范围0x00000000-0xBFFFFFFF) | --- ### 二、映射机制详解 #### 1. 地址映射原理 $$ \text{物理地址} = dest\_offset + (src\_address - src\_offset) $$ 在您提供的配置中: - 源地址范围:$[0, 0+BFFFFFFFF]$ → **线性映射** - 目标地址范围:$[0, 0+BFFFFFFFF]$ → **完全覆盖FPI总线地址空间** #### 2. FPI总线特性 - **物理连接**: ``` CPU Core <-> SRI <-> FPI Bridge <-> 外设模块簇 ``` - **典型外设映射**: ```c #define CAN0_BASE 0xF0000000 // CAN模块在FPI总线上的地址 #define ADC0_BASE 0xF0020000 // ADC模块基地址 ``` #### 3. 多核访问机制 ```mermaid sequenceDiagram participant CPU_Core participant SRI participant FPI_Bus CPU_Core->>SRI: 发起地址0xF0000000访问 SRI->>FPI_Bus: 转换为物理地址0x1F000000 FPI_Bus-->>SRI: 返回CAN寄存器数据 SRI-->>CPU_Core: 传递响应数据 ``` --- ### 三、开发注意事项 #### 1. 地址冲突规避 - **典型冲突场景**: ```c // 危险配置:两个映射重叠 map(dest=bus:tc0:fpi_bus, ..., size=0xC0000000); map(dest=bus:tc1:fpi_bus, ..., size=0xC0000000); // 引发总线仲裁冲突 ``` - **解决方案**: ```c // 使用分块映射 map(dest=bus:tc0:fpi_bus, src_offset=0, dest_offset=0, size=0x60000000); // 1.5GB map(dest=bus:tc1:fpi_bus, src_offset=0x60000000, dest_offset=0, size=0x60000000); ``` #### 2. 性能优化 - **预取机制**: ```c // 启用FPI总线预取(提升连续访问速度) FPI_ACCEN0.B.PREFETCH = 1; // 设置预取使能位 ``` - **访问延迟数据**: | 访问类型 | 延迟周期数 | |----------------|------------| | 单次32位读 | 5 | | 突发4次读 | 8 | | 带缓存访问 | 3 | #### 3. 调试技巧 - **总线监控**: ```c // 通过SRI调试寄存器捕获错误 SRI_DEBUGCTRL.B.ERR_EN = 1; // 使能错误检测 SRI_DEBUGSTAT.B.ERR_ADDR; // 读取出错地址 ``` - **UDE调试器命令**: ```shell trace sri -core 0 -range 0x00000000:0xBFFFFFFF # 监控指定地址范围的总线活动 ``` --- ### 四、典型应用场景 #### 1. 外设寄存器访问 ```c // 通过映射访问CAN模块 volatile uint32* CAN_CTRL = (uint32*)(0xF0000000 + 0x100); *CAN_CTRL |= 0x1; // 使能CAN控制器 ``` #### 2. 内存映射外设 ```c // 访问DMA描述符表 #define DMA_DESC_BASE 0xD0000000 typedef struct { uint32 ctrl; uint32 src_addr; uint32 dest_addr; } DmaDesc; DmaDesc* desc_table = (DmaDesc*)(DMA_DESC_BASE); desc_table[0].ctrl = 0x80000000; // 启动DMA传输 ``` 需要进一步了解特定外设模块(如CAN、ADC)的详细映射规则,或需要示例代码演示实际访问操作吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值