11.22.2006

Philip USB 2.0 : ISP1583/2

ISP 1582 的Access Mode 只有 Generic Processor Mode。bus寬度是16 bit。當要存取sigle byte時,請自動將high byte捨棄。
這一點值得商榷,因為demo電路從A0開始連接,所以是byte addressable。要測試看看對奇數位址read時,是不是也OK。
因為內部register的address都是偶數,所以即使沒有bank selection (enable) pin也沒有關係。

和USB 的Endpoint相關的register只有一組,利用Endpoint index register來決定mapping到哪一個endpoint(有一點像PIC的 bank selection register)。


Address Register (00h)

在power-on reset,soft reset 和 bus reset 後,DEVADDR[6:0]會被clear。
在power-on reset,soft reset 後 DEVEN 會clear,bus reset後會set。


Endpoint Index Register (2Ch)

決定以下registers mapping到哪一個endpoint:
  • Buffer Length
  • Buffer Status
  • Control Function
  • Data Port
  • Endpoint MaxPackSize
  • Endpoint Type
DMA Register也有一個Endpoint index register,這兩個 index register不可以同時指到同一個endpoint (chip's bug ?)

Endpoint 0 有 兩個buffer : SETUP,Data。Index Register 的EP0SETUP 可以用來決定是要對哪一個buffer動作。
在存取其他Endpoint時,EP0SETUP 要是0。


Control Function Register (28)


用來控制該Endpoint的狀態:
  • CLBUF : Clear RX Buffer (FIFO ?)。
    平時不用作,因為在對FIFO作read動作時,會自動紀錄FIFO 剩餘資料的長度,當==0時也就自動clear了。
    這個bit只有在需要強制將RX buffer清除時才有用。
  • VENDP : 強制將FIFO 內的資料送到SIE中,等待in token 後送出。
    平時不用作,因為每次wirte FIFO,FIFO counter 會自動增加,當FIFO counter = MaxPacketSize時,就會自動將FIFO data送到SIE中。
    這個bit只有在送出 data length < MaxPacketSize 的資料時,才需要設定。
  • DSEN : 將 controller設定為DATA Stage,處於這個Stage時,controller會follow In/Out Token 的內容動作,
    否則,
    Controller會回應NAK給所有Token,直到programmer 主動回應SETUP Command為止。
    然後呢?回應SETUP Command後,programmer需不需要自己設定DSEN這個bit呢?還是controller會自行改變?
  • STATUS : Status Acknowledge,這個bit決定SETUP command 中STATUS Stage的動作。
    0 : 回應NAK
    1 : 回應一個空packet 給IN Token,回應 ACK給OUT token。
    當Status Stage結束時,這個bit會被自動clear。
  • STALL : Stall Endpoint,中斷這個Endpoint的動作。
    任意中斷傳送會導致NRZ 邏輯錯誤,所以每次中斷後, 要再恢復時,要reset 這個endpoint : disable - enable 這個endpoint 一次。


Data Port Register (20h)

提供該Endpoint 內部 FIFO 的對外介面(對這個register作讀取就等於對該Endpoint的FIFO讀取)。
Endpoint FIFO 的寬度是16bit,所以每次R/W,FIFO count 會自動+-2。

如果是Write動作,當FIFO counter == MaxPacketSze,就會自動將FiFO 的內容送到SIE controller去,等待USB 的IN Token 進來後,自動送出。
同理。
如果是Read動作,當FIFO couter == 0,在下一個 OUT token 時,就會將USB 資料自動放到FIFO中。


Buffer Length Register (1Ch)

內含Endpoint的PacketSize (DATACOUNT)。
這個register很奇怪,好像是用來"validate" 每次pacjet sent。剛剛的register說道,當FIFO counter == MaxPacketSize 時,就會自動validate和送出。
所以要傳送一個MaxPacketSize 整數倍的資料長度時,是OK的。
但是如果...MaxPacketSize 設為64,要傳送 510 bytes的資料,那在最後一個packet時,記得要將Buffer Length Register設為62,這樣FIFO才不會一直等FIFO counter == 64 才送出。
不能改MaxPacketSize嗎?

EndPoint MaxPacketSize register (04h)

這是所有endpoint共用的一個register,決定除了endpoint 0以外,所有endpoint的MaxPacketSize (這就是為甚麼每個Endpoint還要有一個 BufferLength Register的原因了)。


Interrupt register (18h)

Endpoint0 ~7 每個Endpoint都有TX/RX兩個 interrupt.
另外 Endpoint0 還有一個獨有的 SETUP interrupt : 代表收到 SETUP Token
VBUS : vbus is on.
DMA : DMA status register 有改變
HS_STAT : 正由full_speed 轉為 high_speed
RESUME : 正由 active 轉為suspend
PSOF : ?


Frame Number Register (74h)

從上一個SOF (Start Of Frame) 到現在,共收到幾個frame,microframe。


Unlock Device Register (7Ch)

為了避免ISP1582 在suspened 時,register 的資料被塗改(?),
當 Mode Register中的 PWRON bit 是 0 的時候,所以write 的動作都是無效的。
配合這個動作,當chip resume,作第一次write 之前,要先作個Unlock 動作:寫入AA37h 到Unlock Device Register。

接下來的說明有點奇怪..

當ModeRegister的PWRON=1時,chip 有power,RD_N,WR_N,CS_N 都正常動作。所以可以直接對chip 作write動作。 不需要作Unlock。

當ModeRegister的PWRON=0時,chip 沒有power,RD_N,WR_N,CS_N都是floating,這時候chip處於suspend狀態,這時如果要作write動作,就要先作Unlock。
又說是resume時要下,又說PWRON時不用作。又說在no power時要作,所以?到底什麼時候要作?
還有..RD_N, CS_N也是floating,所以read動作也沒效呀,怎摩會在Write之前才要作?
再挑剔一點,如果RD.WR,CS都floating,那連Unlock command也寫不進去呀。


Test Mode Regster (84h)

可以強制設定USB D+/- 的pin腳High/Low。作測試用。

Bus Timing..

整個read/write cycle (CS enabled time) min = 50ns。

沒有留言: