草庐IT

APB协议讲解

大收藏家 2024-04-20 原文

APB协议讲解

声明:本文参考了Miracle_ICdvMr.Marc的博客,如有侵权,请与我联系!

1. APB介绍

1.1 APB的产生

APB(advanced Peripheral Bus)协议是ARM公司中AMBA协议的一种。最早的APB协议现在叫做APB2,2003年ARM公司发布了APB3,2010年发布APB4。APB协议是向下兼容的,随着时间的推移,根据实际需求,APB3在APB2的基础上添加一些功能,APB4在APB3的基础上再添加了一些功能。现在我们所说的APB总线一般是指APB3,APB4增加的功能很少被使用到。

1.2 APB的功能

一个典型的APB总线架构如下图所示:APB使用的目的是实现与外围低功耗设备,低速设备进行数据传输。在APB总线中,唯一的M为APB bridge,其他的一些低速低功率的外围设备均为slave。

1.3 APB协议的特点

  1. 低成本。
  2. 低功耗。
  3. 低带宽。
  4. 无流水线结构。
  5. 所有信号的跳变仅与时钟上升沿相关。
  6. 每次传输至少需要两个时钟周期。

1.4 APB协议的英文文档很短,建议看原文

2. APB协议的信号列表如下图所示(取自APB4协议)


中文版如下

signalDescripion
PCLK时钟。APB协议里所有的数据传输都在PCLK上升沿进行
PRESETn复位。低电平有效
PADDRAPB地址总线。最大宽度为32位
PSELx选通。APB master会将此信号生成给每个slave。它指示已选择的slave,并且需要进行数据传输。 每个slave都有一个PSELx信号。
PENABLE使能。当它为高时,表示数据有效
PWRITE读写控制。为高时表示写操作,为低时表示读操作
PWDATA写数据。master通过PWDATA将数据写到slave,该总线最大宽度为32位
PRDATA读数据。master通过PRDATA将数据从slave读取回来,该总线最大宽度为32位

3. APB时序介绍

3.1 APB2时序图介绍

3.1.1 下图为APB2的写操作时序图


T0-T1:初始状态
T1-T2:master把PADDR和PWRITE放在总线上,通过PSEL选择一个slave,slave得知mater将要进行一次写操作,并且master把需要写进slave的data也放到总线上。
T2:PENABLE为高,表示当前数据有效,并且master将data写入slave
T3:数据传输结束,再次回到初始状态

3.1.2下图为APB2的读操作时序图


所有的数据都是在PCLK上升沿跳变的
T0-T1:初始状态,准备开始数据传输
T1时刻:master向总线上发送了地址,这个地址是slave的地址;并且把PWRITE拉低,说明这次数据传输是一次读数据。PSEL拉高,APB协议里可能是有一个master,多个slave,当PADDR将地址发到总线上后,PSEL选择哪一个slave也就定了。
T1-T2时刻:保持现状不变,这个时候slave收到了mater的地址,读写控制,salve得知自己要讲这个地址对应的数据发送到master,所以它会做好准备。
T3时刻:PENABLE也就是使能信号拉高,这个时候也就是master通知slave进行PRDATA的传输
总结一下:一开始我们就说到,APB数据传输至少需要两个周期,也就是T1-T3。其实很简单,第一个周期做准备工作(把PADDR,PWRITE,PSEL发送到总线),第二个周期进行传输读或写的data(PENABLE拉高,表面当前时刻,数据有效,是master想要的数据!)

3.2 APB3时序图介绍

APB3在APB2的基础上增加了两个端口,PREADY和PSLVERR。PREADY用于扩展APB的传输。PSLVERR是一个错误反馈信号,表示当前传输发生了错误。

3.2.1 写操作,无等待

3.2.3 写操作,有等待


当PSEL和PENABLE都为高的时候,PREADY为低,说明slave没有准备好,再给他一点时间,在T4时刻这条虚线,发现PSEL和PENABLE为高,但是PREADY还是为低,继续等待。在T5时刻这条虚线,发现PSEL,PENABLE,PREADY都为高,说明这个时候采样的Data是我们想要读取的data。

3.2.3 读操作,无等待时序图

3.2.4 读操作,有等待时序图

3.2.5 写操作 PSLVERR时序图


PSLVERR只在APB传输的最后一个周期有效, 也就是说当PSEL,PENABLE和PREADY均为1时是有效的,在其他时间是无效的。当一些APB模块不支持PSLVERR时,比如只支持APB3协议,可以将这个pad接0.

3.2.6 读操作PSLVERR时序图


读操作的机理与写操作一样。
这里要说的是 PSLVERR在系统中的连接映射关系,PSLVERR需要连接到AXI的RRESP/BRESP或者AHB的HRESP信号。返回PSLVERR说明这次读写发生了问题。至于产生error信号如何处理协议并没有规定。

3.3 APB4时序说明

APB4在APB3的基础上添加了两个端口,一个是PPROT,一个是PSTRB.

3.3.1 PSTRB信号

	写选通信号是指当所传输数据的位宽小于设计中的数据位宽时,可以通过指定PSTRB信号有效的方式来指定哪些数据位是有效的。 下图显示了32位数据总线上的这种关系。
	写选通信号PSTRB使写数据总线上的稀疏数据传输成为可能。 每个写选通信号对应于写数据总线的一个字节。 当置为高电平时,写选通脉冲指示写数据总线的相应字节通道包含有效信息。 写数据总线的每八位有一个写选通脉冲,因此PSTRB [n]对应于PWDATA [(8n + 7): ( 8n)]。
	当进行读操作时,master需要驱动PSTRB为0。

3.3.2 PRTOT

PROT的主要功能是对APB的读写操作进行保护,指示是secure-access还是no secure-access。直接上英文原文


4. 对于APB的master和slave的设计

个人认为最重要的是了解状态机的设计,根据状态机也比较容易进行设计。状态机图如下图所示:

  1. IDLE: 状态是APB的默认状态。
  2. SETUP: 当发起一个传输时,master会选择一个PSEl进行拉高,PENABLE为0,这指示传输的第一个周期。
  3. ACCESS:当PSEL为1, PENABLE为1时,看PREADY的状态,PREADY是指slave是否准备好了传输数据,在时钟的上升沿检测到PREADY为1,则该次读写传输结束。如果还要继续传输数据,则转回到SETUP状态,如果不继续传输数据则转回到IDLE状态,这个是由master来控制的,个人感觉转移条件是master是否继续传输数据。

有关APB协议讲解的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  4. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  5. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  6. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

  7. ruby - 构建Trie数据结构的Ruby代码讲解 - 2

    所以我从维基百科上抓取了这段ruby​​代码并做了一些修改:@trie=Hash.new()defbuild(str)node=@triestr.each_char{|ch|cur=chprev_node=nodenode=node[cur]ifnode==nilprev_node[cur]=Hash.new()node=prev_node[cur]end}endbuild('dogs')puts@trie.inspect我首先在控制台irb上运行它,每次我输出node时,每次{}都会给我一个空哈希值,但当我实际调用时该函数使用参数'dogs'字符串构建,它确实有效,并输出{"d"=>

  8. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  9. 超详细的文件操作讲解 - 2

    各位朋友们,大家好啊,今天我要分享的是关于文件操作方面的知识。文章目录为什么会有文件操作什么是文件文件操作文件指针文件的打开与关闭fopen(打开文件)fclose(关闭文件)打开文件的方式文件的顺序读写fgets函数fputc函数fgets函数fputs函数fprintf函数fscanf函数文件的非顺序读写fseek函数ftell函数rewind函数二进制读写fwrite函数`fread函数结语为什么会有文件操作那么大家可能会问:为什么会有文件操作呢?前面我们可能都了解了通讯录,我们知道当我们使用通讯录的时候我们可以添加联系人,也可以删除联系人,但是当我们退出程序之后下次再进来的时候,我们要

  10. ruby - 协议(protocol)族不支持的地址族 - 2

    我尝试执行此页面中显示的ruby示例:http://tomayko.com/writings/unicorn-is-unix但我得到的只是echo.rb:9:in`bind':Addressfamilynotsupportedbyprotocolfamily-bind(2)(Errno::EAFNOSUPPORT)fromecho.rb:9:in`'有什么想法吗? 最佳答案 我遇到了同样的问题。只需将localhost更改为0.0.0.0:address=Socket.pack_sockaddr_in(4242,'0.0.0.0')

随机推荐