MAX3420E可與任何SPI主控制器相連,以構成全速USB外設器件。盡管一般都由MAX3420來管理底層USB信令,但是需要處理USB事件時,SPI主控制器必須參與處理,當MAX3420的INT引腳指示有中斷發生時,SPI主控制器將讀取14個中斷請求位,以確定需要服務的中斷,一般情況下,主要由這些中斷請求(IRQ)位確定MAX3420E的工作過程,在選擇器件時,SPI主控制器可以是微控制器、DSP、ASIC或具備SPI端口的其他器件,并應能提供SCLK信號。 MAX3420E的中斷邏輯 ◇ IRQ位 圖1所示為MAX3420E中斷邏輯。陰影部分是可通過SPI訪問的寄存器位,圖中有一個IRQ位,實際上,每一個中斷都有一個用于鎖存服務請求的觸發器。觸發器的輸出即為IRQ,它出現在MAX3420E寄存器中,IRQ位提供兩種功能:一是讀取一個IRQ位,然后返回IRQ觸發器的狀態;二是寫入一個“1”至IRQ位,以清除IRQ觸發器,而寫入“0”至IRQ位,則不改變觸發器狀態。 事實上,可以在任意時刻讀取IRQ位,它反映了IRQ觸發器的狀態,當按照寫入1而不是0來清除所選的IRQ位時,這一過程不需要讀-修改-寫周期,假設MAX3420E的IRQ位與普通的寄存器位一樣,即寫1置位,寫0清除,那么,清除USBIRQ寄存器的USESIRQ位的操作代碼如下: #define rUSBIRQ 13 //register 13 #define bmURESIRQ 0x08 //URESIRQ is bit4,bm means“bit mask” unsigned char dum; dum=rreg(rUSBIRQ); //read the register dum=dum&—bmURESIRQ; //chear one bit wreg(Rusbirq,dum); //write it back 由于SPI主控制器可通過寫1來清除一個MAX3420E IRQ位,而寫0則不改變其他寄存器位,因此,SPI主控制器可直接寫入位屏蔽值以清除URESIRQ位。這樣,上述代碼中的最后三條語句便可由下面的單條語句所替代: wreg(rUSBIRQ,bmURESIRQ);//1 cheras an IRQ bit,0 leaves it alone ◇ IEN位 14個MAX3420E中斷的每一個都有相應的中斷使能(IEN)位,IEN位和IRQ觸發器輸出進行“與”操作,可決定是否向INT引腳傳送中斷請求。14個IRQ觸發器通過門控電路后再進行“或”操作,也會形成一個內部中斷請求信號,并傳送至中斷引腳邏輯模塊。 實際上,無論IEN位的狀態如何,IRQ位都指示中斷懸掛狀態,這樣,即使中斷不觸發INT引腳,固件仍可以檢查該懸掛中斷,如果您的程序需要檢查一個IRQ寄存器“是否懸掛中斷”,比較簡單的方法是讀取IRQ和IEN寄存器,并對它們進行“與”操作,然后檢查“等待和被使能的IRQ”位,零值表示沒有使能的中斷,系統處于懸掛狀態。 ◇ IE位 SIP主控制器通過IE位來使能或者禁止INT引腳,由于該位影響到所有的中斷,因此通常稱之為全局中斷使能,不論IRQ或者IEN位的狀態如何,當IE為0時,INT引腳均無效。 可用兩個寄存器位INTLEVEL(參考下面的討論)和POSINT來控制INT引腳的工作方式,在設置IE為1之間,應先設置這兩個配置位。其操作如下: [tr]
中斷請求位BAV 該器件的三個緩沖區就緒(BAV)IRQ位可用于指示是否可以將SPI主控制器裝入一個IN端點FIFO,芯片復位或者IN數據由端點緩沖區成功地發送給主機后,MAX3420將置位這些IRQ位,此后該IRQ將通知SPI主控制器緩沖區可以裝入新數據。 與所有的MAX3420E IRQ位一樣,也可以通過寫入1來三個清除BAV IRQ位,但是千萬不要這樣做,相反,應通過寫入IN端點的字節計數寄存器來清除BAV IRQ位,這是因為MAX3420E要使用一個IN端點的BAV中斷請求位作為鎖定機制。 事實上,上述機制可以確保SPI主控制器和MAX3420E的串行接口引擎(SIE)不會同時使用端點緩沖區。例如,如果清除BAV位,然后以兩條單獨指令裝入字節計數器。那么當您更新字節計數寄存器時,可能已經開始了數據包傳輸,從而導致數據出錯。 |