AMBA APB总线协议(APB4)

一、APB总线介绍

APB总线是ARM公司早期推出的一款用于设备通信的分时独占总线,目前主要用于慢速外设的寄存器配置总线。APB总线结构简单、接口信号少,可以带来更低的资源和功耗,在目前主流SoC设计中仍然使用广泛。为了简化APB接口外设的集成设计难度,APB总线的信号转换和上升沿相关联,每次传输至少需要花费2个时钟周期。APB总线目前最新版本为APB3,相比于上一版本增加了PSLVERR信号,用于反馈Slave端的错误。

二、APB总线信号

APB总线有两个独立的数据总线pwdata和prdata,一个用于写数据,另一个用于读数据。总线位宽最高支持32bits,由于每个数据总线没有独立的握手信号,因此单一时间只能有一个传输事件发生,要么是读数据要么是写数据。下表是APB总线所有接口信号和说明。

信号

方向

信号说明

PCLK

时钟->总线

时钟,上升沿数据有效。

PRESETn

复位->总线

复位,低有效,该信号可直接和系统总线复位连接。

PADDR[31:0]

总线->Slave

APB总线地址,最大32bits,用于寻找。

PPROT[2:0]

总线->Slave

保护类型信号,用于表明数据传输、指令传输的保护等级,可设置三种不同等级:normal、privileged和secure,越后面保护等级越高。

PSELx

总线->Slave

Slave选中信号,总线产生该信号用于指示哪个Slave设备被选中,被选中的Slave才会产生写数据和读数据等有效传输。

PENABLE

总线->Slave

使能信号,用于使能总线传输,配合PSELx一起使用。

PWRITE

总线->Slave

该信号用于指示APB读写操作,“1”为写操作,“0”为读操作。

PWDATA[31:0]

总线->Slave

写数据,最大32bits宽度,只有PWRITE为高时才有效。

PSTRB[3:0]

总线->Slave

写字节使能,用于指示写数据中的哪些byte数据有效,Slave只会将byte有效的数据写入对应地址。

PREADY

Slave->总线

ready信号,该信号用于指示Slave端是否准备就绪。

PRDATA[31:0]

Slave->总线

读数据,最大32bits宽度,只有PWRITE为低时有效,Slave收到读操作后的返回数据。

PSLVERR

Slave->总线

该信号用于反馈Slave出现的错误,高有效。部分APB2及以下Slave不支持该功能,总线端接常值“0”处理。

APB4新增了PSTRB信号,利用PSTRB信号,可以传输以字节为单位长度的数据,例如Slave寄存器为8bits宽度,APB总线为32bits宽度,那么只需要将32bits其中的一个字节写入Slave,利用PSTRB信号来指示哪个字节为有效数据。PSTRB信号为4bits,每一个bit对应PWDATA中的一个字节,PSRTB[0]控制PWDATA[7:0],依次对应。对于读而言,该信号建议维持全“0”。

三、APB总线传输

3.1.立即写传输

立即写传输是指PREADY为高,Slave设备就绪的情况下,进行的写传输过程。其时序如下图所示,在T1时刻总线发起一次写传输,地址PADDR、PWDATA、PWRITE、PSEL同时改变,在PCLK的上升沿同时有效。T1时刻被称为本次传输的setup phase。

在T2时刻,使能信号PENABLE拉高有效,同时PREADY反馈总线设备就绪,数据在PCLK上升沿被寄存。T2时刻称为本次传输的access phase开始,PREADY拉高表示slave可以在下个上升沿完成本次传输。

PADDR、PWDATA和控制信号将会全部保持valid,直到T3时刻。T3时刻也被称为access phase的结束。PENABLE、PSEL信号会在T3时刻后拉低,表示传输的关闭或结束。如果后续还有传输进入,则该信号不会被拉低。

3.2 等待写传输

等待写传输是指当PREADY没有拉高有效时,总线发起了写传输的情况。该过程的setup phase和立即写传输相同,但在access phase开始时,由于PREADY为低,总线写传输不能继续进行,必须等待PREADY拉高有效后再继续。总线将会保持下列信号不变,直到PREADY为高:PADDR、PWRITE、PSEL、PENABLE、PWDATA、PSTRB和PPROT。

PRADY在PENABLE为低时,可以为任意数值,总线只会检查access phase开始后的PREADY情况。

3.3 读传输

读传输同样可按照PREADY情况分为立即读和等待读两种情况。立即读传输和立即写传输相似,在access phase的结束时刻,也就是T3的上升沿,将数据通过PRDATA返回,同时拉高PREADY有效。T3时刻结束后,PSEL、PENABLE等信号拉低表示传输结束。

需要注意的是,如果Slave未准备好数据,可以将PREADY拉低,直到请求地址的数据准备好以后再拉高PREADY,同时将DATA返回,如下图所示。

在access phase开始时,总线如果发现PREADY为低,则会将PADDR、PWRITE、PSEL、PENABLE、PPROT信号保持住,直到PREADY拉高。

3.4 错误响应

PSLVERR信号用于指示APB传输错误,该信号只在PSEL、PENABLE和PREADY同时为高时,也就是APB传输的最后一个时钟周期时判断是否有效。建议在未发生传输时将该信号保持低,只有在Slave发生内部错误或异常时,将该信号拉高一拍有效。

总线会将该错误信号传递回请求Master,如果Master是CPU、DSP等处理器,可能会导致Master进入异常状态,但Master未必会对产生错误的Slave进行操作,这需要根据具体情况进行分析。当一次写传输接收到error时,这并不表示写到的Slave数据没有被Slave接收;当读传输收到error时,对应的读数据应该被判定为无效。

 上图分别是读和写传输发生错误的时序,部分APB外设不支持PSLVERR信号,或者交付的IP中不支持该信号,那么总线接口处可将该信号赋常值“0”。

对于APB发送的PSLVERR信号,转到AXI协议上对应为RRESP/BRESP = SLVERR,也就是将PSLVERR映射到RRESP[1]/BRESP[1]。

对于APB发送的PSLVERR信号,转到AHB协议上对应为HRESP=ERROR,也就是将PSLVERR映射到HRESP[0]。

四、总线保护

为了支持复杂系统设计,使用PPROT[2:0]来标识合法的互联和传输,抢占式总线很容易被监听,因此总线保护非常有必要。APB总线提供三层访问保护,PPROT[0]表示正常或私有传输,PPROT[1]表示安全或不安全传输,PPROT[2]表示数据还是指令传输,具体如下表所示。

PPROT[2:0]

保护等级

[0]

1:私有传输

0:一般传输

[1]

1:不安全传输

0:安全传输

[2]

1:指令传输

0:数据传输

上述几种模式按照SoC系统的保护要求进行划分,APB总线用于支持SoC系统中的处理器对于数据传输安全的要求,目前在MCU等嵌入式处理器中该信号仍有一定作用。但是,随着AHB和AXI总线的提出以及处理器的升级换代,该功能逐渐变得有些无用。并且,在有些情况下,该定义无法表示其含义,比如当一个混合指令发送到Slave端,传输包含数据和指令,此时无法标记该次传输为数据或指令都不太合适。目前来看,PPROT主要用于识别安全或非安全传输,而PPROT[0]和PPROT[2]的含义可以有不同的理解。

猜你喜欢

转载自blog.csdn.net/heyuming20062007/article/details/122561836