Endpoint 0 是Control Endpoint。 不需要 initialize。
因為 Endpoint 0 的Type 是固定的- Control Type。
所以Chip 也設定好。
Endpoint 0 的 buffer size 也是固定的 :64 byte。
所以Endpoint 0 不用作 initialize 和 enable。
其他的Endpoint 都要initialize。而且為了正確規劃buffer,要follow 以下的程序來作:
- disable all endpoint IN and OUT
- 依序(從前到後,從IN到OUT)依序規劃 endpoint 的 MaxPacketSize。
- MaxPacketSize都設定完後,再從頭,依序設定每一個Endpoint (IN and OUT)的 Type。
- 依序Enable Endpoint
另外要注意DMA的endpoint register,不可以設定和 Endpoint Index register 一樣,否則會也會造成 data corruption。
所以當不使用DMA時,最好把DMA Endpoint Register 設定到不使用(enable)的endpoint上。
即使要用DMA時,也要小心 DMA endpoint register 和 endpoint index register 的值不能相同。
- 必要時,先移開其中一個register的值 -
另一個奇怪的地方
DataSheet 有關 ControlFunction Register 的 CLBUF 說明,是clear RX buffer of the indexed endpoint, TX buffer is not affected.
但是 AN10045,pdf : Clearing an IN buffer 又說要clear IN buffer (TX)。
在IN data stage 拔掉USB Cable會造成下一個stage (也就是重新enumeration )的error。
所以要 設定CLBUF (2次)。
以上是互相衝突的說明。
沒有留言:
張貼留言