⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cy7c68001.asm

📁 5416完整例程
💻 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 + -