
我们以有关UDB的赛普拉斯专有文档的翻译结束了我们的史诗。 有关解决UDB的最新问题就摆在您面前。
循环的一般内容是“ UDB。 这是什么?
第1部分。简介。 请第2部分。数据路径。第3部分。数据路径FIFO。第4部分。数据路径ALU。第5部分。数据路径。 有用的小东西。第6部分。管理和状态模块。第7部分。时序和复位控制模块第8部分。寻址UDB。 (当前文章)
21.3.5 UDB寻址
UDB对具有三个唯一的地址空间:
- 8位工作寄存器-每个总线周期只能访问8位数据的总线控制器可以使用此地址空间读取或写入任何UDB工作寄存器。 这些寄存器包括在正常操作期间CPU和DMA与之交互的寄存器。
- 16位工作寄存器-诸如DMA或PSoC 5LP Cortex-M3之类的16位总线控制器可以在单个总线周期中访问16位,以提供需要16位或更多位的数据传输功能。 尽管该地址空间未绑定到与8位空间绑定的区域,但它只能访问同一寄存器,一次只能访问一对寄存器。
- 8位或16位配置寄存器-这些寄存器配置UDB以执行功能。 配置后,通常在UDB操作期间将寄存器设置为静态。 这些寄存器在睡眠模式后保持其状态。
译者注一切都以某种方式复杂地制定。 我认为,对于前两点,引入工作寄存器的不同位深度的寻址方法的概念比较容易。 分别通过8位和16位工作寄存器。 如果您在阅读这些段落时感到困惑,请尝试以这种方式考虑文本。 CPU地址空间中的不同窗口,可通过不同位的工作寄存器对它们进行寻址。 仅此而已。21.3.5.1工作寄存器地址空间
工作寄存器在正常操作期间使用,包括电池,数据寄存器,FIFO,控制和状态寄存器,掩码重叠寄存器和辅助控制寄存器。
图21-43显示了一个UDB的寄存器映射。
在图21-43的右边是一个始终为偶数的16位地址。 在这种情况下,由于地址的偶数位置,UDB号的大小为5位而不是4位。 高4位仍设置寄存器号。
图21-43。 工作寄存器UDB。8位工作寄存器访问在此模式下,通过字节边界上对齐的地址访问所有UDB寄存器。 在8位寄存器的访问模式下,如图21-44所示,所有写入UDB的数据字节均与16位UDB总线的低字节对齐。
在这种模式下,任何时候只能访问一个字节。
图21-44。 访问8位工作寄存器。16位工作寄存器地址空间一个16位地址空间,用于高效的DMA访问,并为支持它的处理器(例如PSoC 5LP中的Cortex-M3)提供CPU编程访问。 访问16位寄存器有两种模式:默认模式和串联模式。 如图21-45所示,在默认模式下,它通过低字节访问UDB'i'中的指定寄存器,并通过高字节访问UDB'i + 1'中的同一寄存器。 这使得在配置为16位功能的相邻UDB中(按地址顺序)高效处理16位数据。
图21-45。 在默认模式下访问16位工作寄存器。在串联模式下,一个UDB的寄存器被合并以形成16位寄存器,如图21-46所示。 在这种模式下,UDB阵列的16位数据总线必须以图中所示的格式访问UDB中的一对寄存器。 例如,当访问寄存器A0时,实际上将发生通过低字节访问A0和通过高字节访问A1的情况。
图21-46。 在串联模式下访问16位工作寄存器DMA的使用受16位工作寄存器的位深度限制。 当使用大于16位的功能时,这还不够。 如图所示,这是由地址覆盖引起的
表格21-25。
表21-25。 针对16位UDB功能的优化地址空间。
当DMA将16位发送到地址0时,低字节和高字节分别写入UDB0和UDB1。 在下一次到地址2的16位DMA传输中,UDB1中的值被该传输的低字节覆盖。
为避免与此类存储器组织相关的问题,建议对于位深度大于16位的功能,对具有8位工作寄存器的区域启动DMA处理。
21.3.5.2配置寄存器地址空间
配置在UDB对级别完成。 一个UDB对由两个UDB和一个关联的跟踪器通道组成,如图21-47所示。

图21-47。 用于配置UDB对的地址方案。
21.3.5.3 UDB配置地址空间
图21-48显示了特定UDB的地址配置图。 如您所见,此配置空间在两个UDB中成对重复。 每个UDB配置总共保留128个字节(7位地址),这些字节分为16位段。 值得注意的是,不支持对奇数边界的16位访问。 读取总是在配置空间中返回16位,并且不必要的字节可以忽略。

图21-48。 UDB配置的地址空间。
21.3.5.4路由配置地址空间
UDB跟踪配置由嵌入式RAM位组成,用于控制网关交换机,分段和输入/输出缓冲区的状态。
21.3.6系统总线访问一致性
UDB寄存器具有双重访问模式:
- 访问系统总线,CPU或DMA在其中读取或写入UDB寄存器;
- UDB内部访问,其中UDB函数更新或使用寄存器的内容
。
21.3.6.1同时访问系统总线
下表包含可能的并发访问事件和所需行为的列表。
表21-26。 同时访问系统总线。
一个 使用FIFO软件捕获功能可以安全地读取Ax寄存器。
b。 在Dx寄存器中,只能动态写入FIFO。 在这种模式下,无法直接读取Dx寄存器。
c。 仅当禁用CNT寄存器时,才能安全地读取它。 动态读取CNT值的另一种方法是将输出跟踪到SC寄存器(透明模式)。
d。 可以将MC寄存器位跟踪到状态寄存器输入(透明模式)以安全读取。
21.3.6.2相干累加器访问(原子读取和写入)
UDB电池是数据处理的主要目标。 因此,如上表所示,在正常操作期间直接读取这些寄存器将产生不确定的结果。 但是,以原子捕获的形式内置支持,以程序捕获的形式在链中连接的块上实现。 在这种使用模型中,读取最后一个有效的电池会将数据从链中连接的所有模块传输到关联的FIFO。 FIFO中的原子记录可以通过编程实现。 可以在FIFO输入上执行单独的写操作,然后可以将最近记录的FIFO状态信号转发到所有连接的模块,同时FIFO数据将传输到Dx或Ax寄存器。
译者的后记
这个翻译周期是对文章评论的回应,该文章首先被提议来简要描述UDB是什么。 现在很明显,对于一个简短的答案,有必要至少引用这里介绍的材料的一半,否则答案仍然是不完整的。 但是现在所有材料都经过翻译和编译。 任务完成。
在进行这项工作的同时,我们还提请注意另一个有趣的PSoC模块,该模块虽然鲜为人知,但功能强大。 这是DFB,数字滤波器模块。 没错,赶紧进行翻译很可怕。 从有关UDB的翻译中可以明显看出,一个文档还不够,需要实践。 麻烦的是,UDB上没有现成的示例,但确实如此。 尚无法从DFB上的示例中找到有价值的内容(赛普拉斯本身以黑匣子的形式制作了一个数字滤波器,它可以工作,但尚不清楚如何操作)。 没有示例的翻译将毫无意义。 因此,借此机会,我们提请读者注意这一块。 评论中的某个人也许会提供指向好的示例的链接。 如果我们设法解决这一问题,将有可能在其上进行翻译和撰写实用文章。 同时,仅此而已。