一、发展历史
APB(Advanced Peripheral Bus)高级外围总线,现在主要用于连接低速外设如UART,SPI、IIC、timer等。ARM公司于1999年发布了APB2,在2003年发布了APB3并且2004年发布了APB3的修订版,又于2010年发布了APB4。因为APB总线首次发布至今已经二十多年,现在已有更先进的AHB、AXI等总线,故其高级一词已经名不副实。
APB2是APB总线的基础版本,ARM官网上并无APB版本。APB3在APB2的基础上增加了PREADY和PSLVERR信号,PREADY用于反压,PSLVERR代表传输是否发生错误。APB4又在APB3的基础上增加了PPROT和PSTRB信号,PPROT为保护信号,PSTRB信号代表字节选通,允许稀疏的写。
二、端口列表
表2-1 APB3端口列表
PCLK,来自时钟源,时钟信号,上升沿同步。
PRESETn,来自系统复位,复位信号,低有效,通常将该信号直接连接到系统总线的复位信号。
PADDR,来自APB桥,地址信号,最多可达32位,被APB桥接单元驱动。
PSELx,来自APB桥,选通信号,选择指定的从机进行传输,当信号拉高则意味着要发起以此传输了。
PENABLE,来自APB桥,使能信号,表示以此APB的传输第二个周期及其后续周期。
PWRITE,来自APB桥,读写标志信号,高电平表示写数据,低电平表示读数据。
PWDATA,来自APB桥,写数据总线,主设备在PWRITE为高时进行驱动,最高可达32位。
PREADY,来自从设备,从设备状态标志信号,对于写操作来说,用于表示从设备是否准备好接收数据,对于读操作来说,用于表示从设备是否准备好 返回给主设备数据。该信号可以延长一次传输的时间,直到从设备准备好再进行传输。
PRDATA,来自从设备,读数据总线,从设备在PWRITE为低时进行驱动,最高可达32位。
PSLVERR,来自从设备,从设备返回给主设备传输错误标志信号。
三、信息传输
APB3相对于APB2增加了PREADY信号,从而使得从机可任意反压主机,增加了从机对通信的控制能力,从而避免主机写的数据从机没收到或者主机读出从机尚未准备好的数据的情况。
3.1 写操作
APB3无等待传输的写操作由两个时钟周期完成,其时序如图3-1所示。
在T1周期,PSEL信号拉高,意味着要发起一次新的传输了;PWRITE为高意味着这是一次写传输;PWDATA和PADDR分别为要传输的数据和地址,两者直到此次传输结束之前应该维持不变;PENABLE在这个时钟周期为0,PREADY信号此时的状态并不影响传输过程。
在T2周期,PSEL信号继续拉高;PWRITE,PADDR,PWDATA保持不变;PENABLE信号拉高表示这是传输的第二个周期;PREADY信号拉高表示从设备已经准备好接收这一笔数据。
两个时钟后数据完成传输。如果在同一时钟给出地址和数据理论上一个时钟就可以完成传输,为什么非要用两个时钟完成传输呢?主要时最初的APB受限于当时的技术所限制而这样设计的,而后面的APB版本为了向前兼容,所以导致这一问题一直延续至今。而APB的主要用途是连接低速外设配置寄存器等操作,因此多花一个时钟也可以忍受。
图3-1 无等待状态的传输
APB3有等待传输的写操作需要的时钟周期有PREADY信号控制,其时序如图3-1所示。
在T1周期,PSEL信号拉高,意味着要发起一次新的传输;PWRITE为高意味着这是一次写传输;PWDATA和PADDR分别为要传输的数据和地址;PENABLE在这个时钟周期为0,PREADY信号此时的状态并不影响传输过程。
在T2周期,PSEL信号继续拉高;PWRITE,PADDR,PWDATA保持不变;PENABLE信号拉高表示这是传输的第二个周期;PREADY信号为低表示从设备还没有准备好接收这一笔数据。
在T3周期,PREADY信号继续为低电平表示从设备依然没有准备好接收这一笔数据,故这一笔传输不能进行,而此时其他信号维持不变,直到PREADY拉高表示从设备可以准备接收这一笔数据的那个周期。
在T4周期,PREADY信号拉高,表示从设备准备好接收数据了,于是这个周期进行完成写传输的操作,此次传输结束。值得注意的是,在整个传输过程中,PADDR,PWRITE,PSEL,PWDATA都应该保持不变。
从时序图3-2可以看出来,有了PREADY信号,从机就可以反压主机,更好的控制传输过程,使得主从之间的传输更加可靠。
图3-2 有等待状态的传输
3.2 读操作
读操作与写操作基本类似,雷同内容此处就不再赘述。无等待和有等待的读操作分别如图3-3和图3-4所示。
图3-3 无等待的读操作
图3-4有等待的读操作
与写操作相比,读操作的过程中,PRDATA和PREADY信号在同一个周期发生变化,可以理解为从机此时提供的PRDATA才是有效的数据。
3.3 错误响应
PSLVERR信号用来表示一次APB传输是否出现错误,其为高电平时表示出现错误。至于为什么会产生错误,这是由slave自己定义的,比如读写了错误地址,或者访问超时等。
PSLVERR只在一次APB传输的最后一个周期才被认为有效,即PSEL,PENABLE和PREADY同时为高的周期。协议中推荐在PSEL,PENABLE和PREADY同时为低的周期时,PSLVERR也为低,不过这不是强制的。
接收到错误信号可能改变了外设的状态,也可能没有改变,这是特定于外设的,两者都可以接受。当写操作接收到错误时,这并不意味着外设内的寄存器没有更新。读操作接收到错误时则可能返回的是错误的数据。
APB外设不需要支持PSLVERR引脚,如果外设不包括PSLVERR引脚,则此信号固定连接到低电平上。
图3-5 写传输失败示例
图3-6 读传输失败示例
四、APB状态机模型
APB3中的状态机模型如图4-1所示。APB3共有三个状态:
IDLE: 空闲状态,PSEL和PENABLE都为0,此状态为默认状态。
SETUP:发起传输状态,PSEL变为1,PENABLE仍为0。此状态表明要发起一次传输。
ACCESS:等待接受数据状态,PSEL为1,PENABLE变为1。此状态表明此时处于一次传输的第二个及第二个以上周期,PENABLE已经拉高,数据已经在总线上准备好,至于什么时候完成当次传输取决于PREADY信号什么时候拉高,当处于这个状态且PREDY为高电平状态时完成当次数据传输。
图4-1 传输状态机模型
为什么前面一直说是状态机模型而不是状态机呢,因为这个状态机模型只是方便我们理解的,这个模型也仅仅是解释了传输过程。对于设计实现APB master和APB slave来说,其可以完全不用状态机的方式来实现。
五、不同协议版本APB的连接
5.1 APB3和APB2
APB3由于比APB2多了PREADY信号使得slave可以反压数据,而APB2却没有这一机制导致两者的传输过程可能会有巨大的差异,两个不同协议的master和slave一起使用会非常困难,因此最好不要一起用这两个协议。
5.2 APB3和APB4
APB3与APB4相比少了PSTRB和PPROT两个信号,而这两个信号只要起到的功能要在两个不同版本协议的APB之间实现传输,也需要一些复杂的转换逻辑,因此也最好改为使用同一版本的协议。
六、参考资料
1. AMBA3 APB协议
2.lawlite知乎专栏《深入理解AMBA总线协议》APB部分