📄 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 + -