APB总线学习汇总
APB简介
APB(Advanced Peripheral Bus),外围总线。APB属于AMBA 3 协议系列,它提供了一个低功耗的接口, 并降低了接口的复杂性。 APB接口用在低带宽和不需要高性能总线的外围设备上。 APB是非流水线结构,所有的信号仅与时钟上升沿相关,这样就可以简化APB外围设备的设计流程,每个传输至少耗用两个周期。APB可以与AMBA高级高性能总线(AHB-Lite) 和AMBA 高级可扩展接口 (AXI)连接。
APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。其特性包括:两个时钟周期传输;无需等待周期和回应信号;控制逻辑简单,只有四个控制信号。APB上的传输可以用状态图来说明。
Operating states
a) 系统初始化为IDLE状态,此时没有传输操作,也没有选中任何从模块。
b) 当有传输要进行时,PSELx=1,PENABLE=0,系统进入SETUP状态,并只会在SETUP 状态停留一个周期。当PCLK的下一个上升沿时到来时,系统进入ENABLE 状态。
c) 系统进入ENABLE状态时,维持之前在SETUP 状态的PADDR、PSEL、PWRITE不变,并将PENABLE置为1。传输也只会在ENABLE状态维持一个周期,在经过SETUP与ENABLE状态之后就已完成。之后如果没有传输要进行,就进入IDLE状态等待;如果有连续的传输,则进入SETUP状态。
信号描述
下表给出了APB的信号。APB的支持最大32-bit的数据位宽。APB协议有两个独立的数据通道,读通道和写通道,由于APB的两个通道没有自己的handshake信号(vaild/ ready),因此两个通道不会同时使用。
APB signal descriptions
除了上表的信号外,APB还有两个信号接口:
PPROT: 保护类型,分为 normal, privileged, secure, data/instruction 访问。
PSTRRB: 写选通信号,指示哪个字节是有效的数据,PSTRB与PWDATA之间的关系为PSTRB[n] <--> PWDATA[(8n+7):(8n)]
传输
写传输
写传输包括两种类型:无等待状态和有等待状态
无等待状态
下图显示了一个基本的无等待状态的写传输。
Write transfer with no wait states
地址、写入数据、写入信号和选择信号都在时钟上升沿后改变。第一个时钟周期叫做Setup phase。 下一个时钟沿后使能信号PENABLE被置位,表示Access phase就位。地址、数据和控制信号在Access phase期间有效。传输在该周期后结束。使能信号PENABLE, 在传输结束后清空。 选择信号PSELx同样被置低,除非紧接着下一传输开始。
有等待状态
下图展示了 PREADY 信号是如何扩展了从器件的传输。
Write transfer with wait states
在Access phase期间,当PENABLE为高,传输可以通过拉低PREADY来扩展传输。下述信号仍旧不变:• 地址: PADDR• 写信号: PWRITE• 选择信号: PSEL• 使能信号:PENABLE• 写入的数据: PWDATA.
读传输
读传输包括以下两种类型:无等待状态和有等待状态
无等待状态
下图显示了一个读传输的无等待状态的时序图。从器件必须在读传输结束前提供数据。
Read transfer with no wait states
有等待状态
下图显示了信号是如何扩展传输的。如果在Access phase期间PREADY信号拉低,则传输被扩展。但下述信号不变:• 地址: PADDR• 写信号: PWRITE• 选择信号: PSEL• 使能信号: PENABLE.
图中显示了如何使用PREADY信号来添加两个周期,你也可以添加数个周期。
Read transfer with wait states
错误响应
使用PSLVERR来指示APB传输错误。当PSEL, PENABLE以及PREADY 都为高时,PSLVERR才在最后一个周期进行判断。 当任何一个PSEL, PENABLE或者PREADY为低时,你可以将PSLVERR拉低,这是推荐,并不是强制要求。 收到一个错误后,可能或不可能改变外围器件的状态。 APB外围设备不要求必须支持PSLVERR引脚,当不使用该引脚时,应被置低。
写传输失败的例子。
Example failing write transfer
读传输同样可以使用错误响应,下图便是一个错误响应的例子
PSLVERR映射:
AXI桥接到APB: AXI的RRESP/BRESP = APB的SLVERR(read: PSLVERR -> RRESP[1], write: PSLVERR -> BRESP[1])
AHB桥接到APB: PSLVERR被映射到HRESP = ERROR(PSLVERR -> HRESP[0])