Interface
Mandatory I/O Summary
Symbol | Type | Description |
---|---|---|
CS# | 主设备输出,从设备输入 | Chip Select: 当改信号从High变为Low时,HyperBus开始传输。 当该信号从低变为高时, HyperBus结束传输。 |
CK,CK# | 主设备输出,从设备输入 | Differential Clock: command,address和data输出与CK和CK#相关。Differential Clock只用于1.8V I/O设备 Single Ended Clock: 在3.0V 的HyperBus的设备上,只有CK使用, CK#不使用 |
DQ[7:0] | 输入输出 | Data Input/Ouput: command,address和data均在改信号线上进行输入输出 |
RWDS | 输入输出 | Read Write Data Strobe: 在Command/Address传输时段,RWDS用于指示是否需要额外的initial latency。 在Slave Output时段,该信号用于采样DQ[7:0]的数据。 (High = addtional latency, Low = no additional latency) |
Optional I/O Summary
Symbol | Type | Description |
---|---|---|
RESET# | 主设备输出,从设备输入,内部上拉 | Hardware RESET: 当该信号为Low时,从设备会初始化并回到Standby状态。与此同时,RWDS和DQ[7:0]处于高阻状态。从设备的的RESET#引脚有一个内部上拉电阻,默认为High。 |
RSTO# | 主设备输入,从设备输出, Open Drain | Reset Output: RSTO#是从设备输出,当它为Low时,表示从设备复位,改信号可以用来作为系统的复位信号。从设备一旦完成POR,RSTO#可以保持LOW一段时间,改时间可以由用户来配置。 |
INT# | 主设备输入,从设备输出, Open Drain | Interrupt Output: 当INT#为Low时, 意味着hyperflash发生了一个中断。 |
Protocal
当HyperBus处于Idle状态(CK=Low & CK#=High)时,CS#从High变成Low,hyperbus的传输开始进行。最前面的三个时钟周期传输3个word的Command/Address(CA0, CA1, CA2),这三个word的CA用来决定这个传输一些特性。
PS:这里面的word是2个byte,就是16bit。一个时钟周期是指两个clock,至于为什么这样定,我也不知道,Hyperbus的specification就是这么定的
所以3个word的CA信息一共是48个bit。
CA Bit# | Bit Name | Bit Function |
---|---|---|
47 | R/W# | 表示该次传输是读还是写 1=读,0=写 |
46 | Address Space(AS) | 表示该次读写的space是memory还是register。 0=memory 空间, 1=register空间。 register空间用来读取Device ID和一些配置的register。 |
45 | Burst Type | 表示传输的burst是liner还是warpped。 0=warpped burst,1=linear burst。 我也不知道该位怎么用,一般设置为1。 |
44-16 | Row & Upper Column Address | Row的大小是跟设备相关的。 以Cypress的S26KS512S hyperflash为例。128Mbit的flash使用CA[35:16]作为Row & Upper Column Address。改Address用来寻找Memory Array中的一个Half-Page |
15-3 | Reserved | 保留位 |
2-0 | Lower Column Address | 和upper column address一起用来选择一个Half-Page的位置的偏移量 |
当传输完CA信息后,bus上需要传输一些dummy clock初始化RWDS信号。RWDS就是CK加了一些延迟的信号,用作高速读操作时的DQS。
当数据传输开始,读数据是在RWDS的边沿进行采样,写数据是在Single-ended clock(即3.0V的CK)的边沿采样,或者在Differential clock(即1.8V CK和CK#)模式下,在CK和CK#交叉点进行数据采样。
一旦完成数据传输,host就可以把CS#拉高并且把clock置为IDLE状态。当clock已经是IDLE状态了,拉嘎CS#就能结束一次传输。
读时序
下面贴出一个实际的读数据的时序, 读数据的地址是0x400。CA[48:0] = 0xA000004000。其中CA[47] = 1代表读,CA[46] = 0, CA[45] =1代表linear burst,ROW & Upper Column Address = 0x0000040 = 0x400 / 0x10, Lower Column Address=0x0 = 0x400 % 0x10。在插入了一些dummy的时钟周期后,进行了数据的采集。
其中, 插入在CA和数据之间的dummy clock的个数是随设备不同而不同的,同时也跟Hyperbus的采样频率有关,这个需要参考不同的Hyberbus设备的手册才能知道。
写时序
写时序分为Write Transactions with Initial Latency和Write Transactions without Initial Latency。由于我并没有涉及太多的写设备的工作,所以这里就不多讲了。有Initial Latency的时序跟读时序差不多,只不过需要注意的是采样的时钟并不是RWDS即DQS,而是CK和CK#。而没有Initial Latency的就更简单了,直接数据就跟在CA后面,下面贴出官方Specification的是时序图。