這一點值得商榷,因為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
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。
沒有留言:
張貼留言