?? cy7c68001.asm
字號:
*********************************************************************************
* CY7C68001.ASM v1.00 *
* 描述:完成對USB的數據與命令的讀寫操作 *
* 版權(c) 2003- 北京合眾達電子技術有限責任公司 *
* 設計者: 段立鋒 *
*********************************************************************************
.file "cy7c68001.asm"
.c_mode
.mmregs
.copy "vc54x.inc" ; VC5402 Memory-Mapped Register Declaration
.copy "dec5416.inc" ; SEED DEC5416 Memory-Mapped Register Declaration
.def _USB_Command_Write
.def _USB_Command_Read
.def _SX2_FifoWrite
.def _SX2_FifoReadSingle
.def _datastart
**常量的定義**
timeout .set 0400H
usbcommand .set 0cH
usbfifo2 .set 08H
usbfifo4 .set 09H
usbfifo6 .set 0aH
usbfifo8 .set 0bH
USB_CLK .set 04007H
;USB_FCLK .set 0f007H
USB_FCLK .set 02007H
.data
**數據緩沖區的定義**
_datastart .word 00
_comwebuf .word 00
_comrdbuf .word 00
_fifowebuf .word 00
_fifordbuf .word 00
_fifolong .word 00
_fifochannel .word 00
.text
*********************************************************************************
* *
* 函數定義:uint _USB_Command_Write(uint regdata) *
* 功 能:寫USB的命令寄存器與節點0 *
* *
* 入口參數: A---- port:USB命令寄存器要寫入的數據 *
* 出口參數: 無 *
* 資源使用:AR0,B *
* *
*********************************************************************************
**USB命令接口寫的過程**
****1、命令接口的地址為0x4,僅用來寫寄存器與Endpoint0
****2、數據線的Bit7:為1時為地址操作
**** 為0時為數據操作
****3、數據線的Bit6:為1時為讀操作
**** 為0時為寫操作
****4、數據線的Bit[5:0]:為寄存器的地址與數據鎖存,其中數據只占低四位
****5、寫操作:
**** 1)寫操作時必需保證在FIFOADR[2:0]上為0x4,并且Ready線為高電平
**** 2)向0x4寫入要操作寄存器的地址
**** 3)等待Ready線為高電平,寫入要操作寄存器數據的高4位
**** 4)等待Ready線為高電平,寫入要操作寄存器數據的低4位
_USB_Command_Write:
PSHM CLKMD ;保存當前的頻率設定
STM #0B,CLKMD ;switch to DIV mode
TstSatuc: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatuc,BNEQ
STM #USB_CLK,CLKMD ;switch to PLL X 10 mode
PllSatuc: LDM CLKMD,B
AND #01B,B
BC PllSatuc,BEQ
PSHM BSCR
STM #0D000H,BSCR
PSHM SWWSR ;保存當前的系統等待時間
LDM SWWSR,B
AND #01fffH,B ;設置系統為5個等待
STLM B,SWWSR
STM #0,AH
STM #_comwebuf,AR0 ;獲取緩沖區的首地址
; PSHM SWWSR ;保存當前的系統等待時間
; LDM SWWSR,B
; AND #06fffH,B ;設置系統為14個等待
; STLM B,SWWSR
STL A,*AR0 ;緩存當前的操作數據
PORTW *AR0,usbcommand ;將數據寫入到命令寄存器
NOP
NOP
NOP
POPM SWWSR ;恢復當前的系統軟件等待時間
POPM BSCR
STM #0B,CLKMD ;switch to DIV mode
TstSatuc1: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatuc1,BNEQ
POPM CLKMD ;switch to PLL X 10 mode
PllSatuc1: LDM CLKMD,B
AND #01B,B
BC PllSatuc1,BEQ
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:uint _USB_Command_Read() *
* 功 能:寫USB的命令寄存器與節點0 *
* *
* 入口參數: A---- port:USB命令寄存器要寫入的數據 *
* 出口參數: 無 *
* 資源使用:AR0,B *
* *
*********************************************************************************
_USB_Command_Read:
STM #0,AH
STM #_comrdbuf,AR0 ;獲取緩沖區的首地址
PSHM SWWSR ;保存當前的系統等待時間
LDM SWWSR,B
AND #06fffH,B ;設置系統為4個等待
STLM B,SWWSR
PORTR usbcommand,*AR0 ;將數據讀入緩存區
LD *AR0,A ;返回讀取的值
POPM SWWSR ;恢復當前的系統軟件等待時間
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:void SX2_FifoWriteSingle(int channel,uint * address,uint longth ) *
* 功 能:寫USB的FIFO數據緩沖區 *
* *
* 入口參數: A---- port:USB's FIFO在IO空間寄存器的地址channel *
* 出口參數: 無 *
* 資源使用:AR0,B *
* *
*********************************************************************************
*關于USBFIFO寫時序的產生:
****依據USB器件CY7C68001的FIFO的寫時序(見其 data sheet 的30頁),
****片選與WR#信號的低有效期應在50~70ns之間;
****為了滿足數據保持的有效期最小10ns的要求,清空當前流水線(加三個空操作);
****這個USB的寫程序是基于DSP的主頻為160MHz時的設置:
********設置寄存器BSCR為0x9000,將CLKOUT設為三分頻。
********IO系統的等待周期為2個,寄存器SWWSR設為0x1fff,寄存器SWCR設為0x1。
********在每次寫之后加三個空操作,清空流水線,保持外部的數據狀態。
_SX2_FifoWrite:
STM #0,AH ;A中是要寫入FIFO的通路
STM #_fifowebuf,AR0 ;獲取寫緩沖區的地址
PSHM AR1 ;AR1壓棧
PSHM AR2 ;AR2壓棧
.if __far_mode
LDU 3H,B
.else
LDU 2H,B
.endif
STLM B,AR1 ;獲取FIFO緩沖區的首地址
STM #_fifolong,AR2
.if __far_mode
LDU 5H,B
.else
LDU 4H,B
.endif
STL B,*AR2 ;保存要寫FIFO的長度
STM #_fifochannel,AR0
STL A,*AR0 ;保存當前的通路值
CMPM *AR0,#0 ;是不是FIFO2
BC fifo4,NTC
;是FIFO2,寫入數據
fifo2: PSHM BSCR
STM #0F000H,BSCR ;設置CLOCK為4分頻
PSHM CLKMD ;保存當前的頻率設定
STM #0B,CLKMD ;switch to DIV mode
TstSatu2: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu2,BNEQ
STM #USB_FCLK,CLKMD ;switch to PLL X 5 mode
PllSatu2: LDM CLKMD,B
AND #01B,B
BC PllSatu2,BEQ
PSHM SWWSR ;保存當前的系統等待時間
ANDM #01fffH,*(SWWSR) ;設置一個等待
NOP
fifo2w: PORTW *AR1+,usbfifo2 ;寫入數據
ADDM #-1,*AR2
CMPM *AR2,#0
BC fifo2w,NTC
;寫入結束
POPM SWWSR ;恢復等待時間
STM #0B,CLKMD ;switch to DIV mode
TstSatu21: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu21,BNEQ
POPM CLKMD ;switch to PLL X 10 mode
PllSatu21: LDM CLKMD,B
AND #01B,B
BC PllSatu21,BEQ
POPM BSCR ;恢復CLOCK分頻
B fifoWriteExit
;寫入FIFO4
fifo4: CMPM *AR0,#1
BC fifo6,NTC
PSHM BSCR
STM #0F000H,BSCR ;設置CLOCK為4分頻
PSHM CLKMD ;保存當前的頻率設定
STM #0B,CLKMD ;switch to DIV mode
TstSatu4: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu2,BNEQ
STM #USB_FCLK,CLKMD ;switch to PLL X 5 mode
PllSatu4: LDM CLKMD,B
AND #01B,B
BC PllSatu2,BEQ
PSHM SWWSR ;保存當前的系統等待時間
ANDM #01fffH,*(SWWSR) ;設置一個等待
NOP
fifo4w: PORTW *AR1+,usbfifo4 ;寫入數據
ADDM #-1,*AR2
CMPM *AR2,#0
BC fifo4w,NTC
;寫入結束
POPM SWWSR ;恢復等待時間
STM #0B,CLKMD ;switch to DIV mode
TstSatu41: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu41,BNEQ
POPM CLKMD ;switch to PLL X 10 mode
PllSatu41: LDM CLKMD,B
AND #01B,B
BC PllSatu41,BEQ
POPM BSCR ;恢復CLOCK分頻
B fifoWriteExit
fifo6: CMPM *AR0,#2
BC fifo8,NTC
;是FIFO6,寫入數據
PSHM BSCR
STM #0f000H,BSCR ;設置CLOCK為4分頻
PSHM CLKMD ;保存當前的頻率設定
STM #0B,CLKMD ;switch to DIV mode
TstSatu6: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu6,BNEQ
STM #USB_FCLK,CLKMD ;switch to PLL X 5 mode
PllSatu6: LDM CLKMD,B
AND #01B,B
BC PllSatu6,BEQ
PSHM SWWSR ;保存當前的系統等待時間
ANDM #00fffH,*(SWWSR) ;設置一個等待
NOP
fifo6w: PORTW *AR1+,usbfifo6 ;寫入數據
ADDM #-1,*AR2
CMPM *AR2,#0
BC fifo6w,NTC
;寫入結束
POPM SWWSR ;恢復等待時間
STM #0B,CLKMD ;switch to DIV mode
TstSatu61: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu61,BNEQ
POPM CLKMD ;switch to PLL X 10 mode
PllSatu61: LDM CLKMD,B
AND #01B,B
BC PllSatu61,BEQ
POPM BSCR ;恢復CLOCK分頻
B fifoWriteExit
fifo8: CMPM *AR0,#3
BC fifoWriteError,NTC
;是FIFO8,寫入數據
PSHM BSCR
STM #0f000H,BSCR ;設置CLOCK為4分頻
PSHM CLKMD ;保存當前的頻率設定
STM #0B,CLKMD ;switch to DIV mode
TstSatu8: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu8,BNEQ
STM #USB_FCLK,CLKMD ;switch to PLL X 5 mode
PllSatu8: LDM CLKMD,B
AND #01B,B
BC PllSatu8,BEQ
PSHM SWWSR ;保存當前的系統等待時間
ANDM #01fffH,*(SWWSR) ;設置一個等待
NOP
fifo8w: PORTW *AR1+,usbfifo8 ;寫入數據
ADDM #-1,*AR2
CMPM *AR2,#0
BC fifo8w,NTC
;寫入結束
POPM SWWSR ;恢復等待時間
STM #0B,CLKMD ;switch to DIV mode
TstSatu81: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu81,BNEQ
POPM CLKMD ;switch to PLL X 10 mode
PllSatu81: LDM CLKMD,B
AND #01B,B
BC PllSatu81,BEQ
POPM BSCR ;恢復CLOCK分頻
B fifoWriteExit
fifoWriteExit: OR #1,A
B fifoWriteEnd
fifoWriteError: AND #0,A
fifoWriteEnd: POPM AR2
POPM AR1
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:unsigned int SX2_FifoReadSingle(int channel) *
* 功 能:寫USB的FIFO數據緩沖區 *
* *
* 入口參數: A---- port:USB's FIFO在IO空間寄存器的地址channel *
* 出口參數: 無 *
* 資源使用:AR0,B *
* *
*********************************************************************************
_SX2_FifoReadSingle:
STM #0,AH
STM #_fifordbuf,AR0 ;獲取緩沖區的地址
PSHM SWWSR ;保存當前的系統等待時間
LDM SWWSR,B
AND #06fffH,B ;設置系統為5個等待
STLM B,SWWSR
fifo_r1st: PSHM AL
PSHM AH
SUB #0,A
BC fifo_r2sec,ANEQ
PORTR usbfifo2,*AR0 ;寫endpoint 2 one byte
POPM AH
POPM AL
B fifoReadExit
fifo_r2sec: POPM AH
POPM AL
PSHM AL
PSHM AH
SUB #1,A
BC fifo_r3rd,ANEQ
PORTR usbfifo4,*AR0 ;寫endpoint 4 one byte
POPM AH
POPM AL
B fifoReadExit
fifo_r3rd: POPM AH
POPM AL
PSHM AL
PSHM AH
SUB #2,A
BC fifo_r4fou,ANEQ
PORTR usbfifo6,*AR0 ;寫endpoint 6 one byte
POPM AH
POPM AL
B fifoReadExit
fifo_r4fou: POPM AH
POPM AL
PSHM AL
PSHM AH
SUB #3,A
BC fifoWriteExit,ANEQ
PORTR usbfifo8,*AR0 ;寫endpoint 8 one byte
POPM AH
POPM AL
fifoReadExit: POPM SWWSR ;恢復當前的系統軟件等待時間
LD *AR0,A ;返回讀取的值
.if __far_mode
FRET
.else
RET
.endif
.end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -