声明:本文章是本人学习AMBA APB协议的一些个人理解,仅用于学习交流之用。本人学习APB协议时参考的是ARM公司官方的APB协议技术规范文档(编号:IHI0024D)。受限于本人的知识水平,本文章可能缺漏和错误之处,欢迎大家批评指正。
1. APB 协议介绍
APB协议属于AMBA总线协议的一种,是一种低成本,低功耗,结构简单的低速通信总线,通常通过APB桥与AHB总线或者AXI总线连接构成芯片的通信总线系统。APB总线通信有主从设备之分,APB主设备通常是APB桥,从设备通常是一些低速的外设,例如:RTC,TIMER,WDT等。
APB总线是一种低速的,同步总线,不支持流水线操作,每次传输都至少要花费两个时钟周期,第一个周期为设置周期,第二个或者之后几个周期为数据周期。在设置周期当中,APB总线进行地址的传输操作;在数据周期当中,APB总线执行数据的读写操作。
2. APB总线的端口信号描述
在介绍APB端口信号之前,先来看一下图1所示的端口信号连接图以便更好地理解APB的端口信号。按照参考文档中的描述,我把APB主设备称为“Requester”,把从设备称为“Completer”。除了PCLK和PRESETn信号是由系统提供的时钟复位信号,其余信号都用于APB主从设备之间的通信。
下面表1罗列了各种信号及其功能描述。没有标颜色的是APB3.0支持的端口信号,标蓝的是APB4.0新增的端口信号,标黄的是APB5.0新增的端口信号:
在APB4.0协议中,新增了PSTRB信号和PPROT信号。PSTRB信号是写数据有效位指示信号,用于指示哪些数据位有效,通常用在数据位宽与总线位宽不对齐的情况。PPROT信号用来指示数据传输的优先级和安全传输。一般在公司当中只用到APB4.0协议。
在APB5.0协议当中新增了一系列的用户自定义数据信号,但是即使是在ARM公司官方的技术文档当中也并不建议大家使用这些信号因为没有相应的功能函数支持这些信号。
信号名称 | 信号源 | 信号位宽 | 描述 |
PCLK | Clock | 1 | APB总线的时钟信号 |
PRESETn | System bus reset | 1 | APB总线的复位信号,低电平有效,通常与系统总线的reset信号连接在一起。 |
PADDR | Requester | ADDR_WIDTH | APB的地址总线,位宽可以自定义,最大为32比特 |
PSEL | Requester | 1 | APB从设备片选信号,用于使能相应的从设备 |
PENABLE | Requester | 1 | APB的使能信号,用于指示第二个或者之后几个周期的信号传输 |
PWRITE | Requester | 1 | APB读写信号,用于指示一次传输的类型,高写低读 |
PWDATA | Requester | DATA_WIDTH | APB写数据总线,用于写入数据,位宽可选,最大为32比特 |
PREADY | Completer | 1 | 从设备的ready信号,可用来拓展信号传输 |
PRDATA | Completer | DATA_WIDTH | APB读数据总线,用于读出数据,位宽可选,最大为32比特 |
PSLVERR | Completer | 1 | APB错误指示信号,用来指示传输错误 |
PSTRB | Requester | DATA_WIDTH/8 | APB写数据有效位指示信号 |
PPROT | Requester | 3 | APB保护信号,用于指示优先传输和安全传输 |
PWAKEUP | Requester | 1 | 用于指示与APB端口有关的所有操作 |
PAUSER | Requester | USER_REQ_WIDTH | 用户自定义的请求信号 |
PWUSER | Requester | USER_DATA_WIDTH | 用户自定义的写数据总线 |
PRUSER | Completer | USER_DATA_WIDTH | 用户自定义的读数据总线 |
PBUSER | Completer | USER_RESP_WIDTH | 用户自定义的响应信号总线 |
3. 信号传输
APB总线的信号传输可分为写传输和读传输,由PWRITE信号来指示,当PWRITE信号为1时表明这是一次写传输,当PWRITE信号为0时表明这是一次读传输。写传输和读传输分别有独立的数据总线,但是这两种传输不能同时进行。
写传输可分为无等待的写传输和有等待的写传输。读传输也分为无等待的读传输和有等待的读传输。是否有等待由PREADY信号指示。
一次无等待的写传输时序图如图2所示,T1时刻到T2时刻之间为设置周期,T2到T3时刻之间是数据周期,由于这是无等待的写传输,所以只需要2个周期就可以完成传输。T1时刻后PSEL信号变为高电平表示传输开始,PWRITE为1表示这是一次写传输,PENABLE信号在第一个周期为0表示数据还未写入,但是在这一周期APB从设备需要将地址信号读取进来,即在T2时刻将地址读取进来。第二个周期PREADY信号为1说明从设备准备好接收数据,T3时刻数据正确写入,一次无等待写传输结束。
一次有等待写传输时序图如图3所示,T1到T2时刻之间为设置周期,T2到T5时刻之间为3个数据周期,设置周期的信号波形与无等待传输时一致,不同的是在第二个周期和第三个PREADY信号为0,从设备没有准备好接收数据,因此需要将数据信号拓展2个周期,其余信号保持不变。在第四个周期,PREADY信号变为1,数据在T5时刻正确写入,传输结束,本次传输花费了4个时钟周期。值得注意的是,PREADY可以在多个周期持续为0,这样就需要花费更多的时钟周期完成传输。
一次无等待的读传输时序图如图4所示,T1时刻到T2时刻之间为设置周期,T2到T3时刻之间是数据周期,由于这是无等待的读传输,所以只需要2个周期就可以完成传输。T1时刻后PSEL信号变为高电平表示传输开始,PWRITE为0表示这是一次读传输,PENABLE信号在第一个周期为0表示数据还未读出。第二个周期PREADY信号为1说明从设备准备好发送数据,T3时刻数据正确读出,一次读传输结束。
一次有等待读传输时序图如图5所示,T1到T2时刻之间为设置周期,T2到T5时刻之间为3个数据周期,设置周期的信号波形与无等待传输时一致,不同的是在第二个周期和第三个周期PREADY信号为0,从设备没有准备好发送数据,因此需要等待2个周期,其余信号保持不变。在第四个周期,PREADY信号变为1,数据在T5时刻正确读出,传输结束,本次传输花费了4个时钟周期。
有时候数据传输可能会发生错误,这时就需要PSLVERR信号来指示错误发生。一次有错误的写传输时序图如图6所示,这是一次有等待的写传输,共花费了3个时钟周期,但是在最后一个周期PSLVERR信号为1说明此次传输发生了错误。
一次有错误的读传输时序图如图7所示,这是一次有等待的读传输,共花费了3个时钟周期,但是在最后一个周期PSLVERR信号为1说明此次传输发生了错误,数据没有被正确读出。
4. 状态机
APB的状态转换图如图8所示,没有传输发生时APB总线处于IDLE状态,当有传输发生时,跳到SETUP状态执行设置周期所需要执行的操作,SETUP状态结束后跳到ACCESS状态执行数据周期所需要执行的操作。如果PREADY信号为0则将一直维持在ACCESS状态直到PREADY信号为1。PREADY信号变为1后,如果接下来还有传输则跳回SETUP状态开始进行下一次传输,否则跳回IDLE状态。
5. 端口校验保护
APB可以通过一些校验信号来确保端口信号的正确传输,APB的校验信号罗列如下,原则上1位校验信号可覆盖需要校验的端口信号的8位,但是有些端口信号位宽不是8的倍数,这就允许校验信号的最高位覆盖端口信号高有效位的数量可以少于8。校验信号只在APB5.0协议才支持。
校验信号 | 覆盖的端口信号 | 位宽 | 校验使能 |
PADDRCHK | PADDR | ADDR_WIDTH/8 | PSEL |
PCTRLCHK | PPROT,PWRITE | 1 | PSEL |
PSELxCHK | PSELx | 1 | PRESETn |
PENABLECHK | PENABLE | 1 | PSEL |
PWDATACHK | PWDATA | DATA_WIDTH/8 | PSEL&PWRITE |
PSTRBCHK | PSTRB | 1 | PSEL&PWRITE |
PREADYCHK | PREADY | 1 | PSEL&PENABLE |
PRDATACHK | PRDATA | DATA_WIDTH/8 | PSEL&PENABLE&PREADY&!PWRITE |
PSLVERRCHK | PSLVERR | 1 | PSEL&PENABLE&PREADY |
PWAKEUPCHK | PWAKEUP | 1 | PRESETn |
PAUSERCHK | PAUSER | USER_REQ_WIDTH/8 | PSEL |
PWUSERCHK | PWUSER | USER_DATA_WIDTH/8 | PSEL&PWRITE |
PRUSERCHK | PRUSER | USER_DATA_WIDTH/8 | PSEL&PENABLE&PREADY&!PWRITE |
PBUSERCHK | PBUSER | USER_RESP_WIDTH/8 | PSEL&PENABLE&PREADY |