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

📄 main.asm

📁 一个以DSP为CPU读取飞利浦D12USB芯片的通讯程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;===================================================
;D12芯片ID:  1210
D12_COM					.set	0001H	;命令口地址
D12_DAT					.set	0000H	;数据口地址
;===================================================

;===================================================
;常数定义
;===================================================
D12_NOLAZYCLOCK     	.set	02H
D12_CLOCKRUNNING    	.set 	04H
D12_SOFTCONNECT			.set	10H
D12_CLOCK_12M			.set	03H
D12_CLOCK_4M			.set	0bH
D12_SETTOONE        	.set 	40H

;==================================
;D12中断号
;==================================
D12_INT_ENDP0OUT		.set	0FH;BIT0
D12_INT_ENDP0IN			.set	0EH;BIT1
D12_INT_ENDP1OUT		.set	0DH;BIT2
D12_INT_ENDP1IN			.set	0CH;BIT3
D12_INT_ENDP2OUT		.set	0BH;BIT4
D12_INT_ENDP2IN			.set	0AH;BIT5
D12_INT_BUSRESET		.set	09H;BIT6
D12_INT_SUSPENDCHANGE 	.set	08H;BIT7
D12_INT_EOT				.set	07H;BIT8


STATUS_ERR				.set 	1H
STATUS_OK				.set 	0H
UsbDevDescType			.set 	1H
UsbCfgDescType			.set 	2H
UsbStrDescType			.set 	3H
UsbItfDescType			.set 	4H
UsbEndpDescType			.set 	5H
UsbPwrDescType			.set 	6H
UsbDevDescSize			.set 	18
UsbCfgDescSize			.set 	9H
UsbItfDescSize			.set 	9H
UsbEndpDescSize			.set 	7H
UsbEndpBulk				.set 	2H
UsbEndpInterrupt		.set 	3H		
Ep0PacketSize			.set 	16
Ep1PacketSize			.set 	16
Ep2PacketSize			.set 	64
EndpCnt					.set 	4
UsbTotalCfgDescSize		.set 	002eh	;UsbCfgDescSize+UsbItfDescSize+EndpCnt*UsbEndpDescSize
D12EpStall				.set 	1H
;====================================
;常量定义结束
;====================================


;====================================
;中断现场保存DP==0处
;====================================
ST0backup    			.set     60H
ST1backup    			.set     61H
ACCbackup    			.set     62H
PREGbackup   			.set     64H
TREGbackup   			.set     66H   	          

;====================================
;所有的数据均定义在DP==6处
;====================================
COMMAND_BUF				.set	001H	;dp=6,段内偏移地址为1,D12命令缓冲区(输出)
DATA_BUF				.set	002H	;dp=6,段内偏移地址为2,D12数据缓冲区(输出)

READ_BUF				.set	003H	;dp=6,段内偏移地址为3,D12读数据缓冲区(输入)
READ_COMMAND			.set	004H	;dp=6,段内偏移地址为4,D12读命令缓冲区(输入)

READ_DATA				.set	005H	;dp=6;
READ_DATA1				.set	006H	;dp=6;

TEMP_BUF0       		.set    007H	;
TEMP_BUF1       		.set    008H	;
INIT_REG				.set    009H	;中断寄存器保存缓冲区
READ_DATA_POINT			.set    030H	;读数据地址指针(16)
WRITE_DATA_POINT    	.set    050H	;写数据指针	(16)

SetupPkt0				.set    020H	;控制端点接收数据缓冲区
SetupPkt1				.set	021H
SetupPkt2				.set	022H
SetupPkt3				.set	023H
SetupPkt4				.set	024H
SetupPkt5				.set	025H
SetupPkt6				.set	026H
SetupPkt7				.set	027H

usb_remote_wake			.set 	028H
usb_config				.set 	029H
UsbSendDescF			.set 	02AH
send_remain				.set 	02BH
send_ptr 				.set 	02CH
;==============================================
;这个是自己定义的子程序参数
;==============================================
ARR0					.set    00AH	;参数传递缓冲
ARR1					.set    00BH
ARR2					.set    00CH
ARR3					.set    00DH
ARR4					.set    00EH
ARR5					.set    00FH
ARR6					.set    0010H
ARR7					.set    0011H

	.include "F2407REGS.H"
	.def	 _c_int0
;==========================================		
;中断向量定义
;==========================================		
	.sect	 ".vectors"
RSVECT:	B 	 _c_int0
INT1:	B	 EXTERN_INIT1
INT2:   B    NOTHING_INIT
INT3:   B    NOTHING_INIT
INT4:   B    NOTHING_INIT
INT5:   B    NOTHING_INIT
INT6:   B    NOTHING_INIT

;==========================================		
;描述符数据表
;描述符共64个字
;设备描述符18个
;端点描述符和其他共46个
;==========================================		
	.text
table1:								;设备描述符	
	.word 12H;UsbDevDescSize		;设备描述符长度,= 12H
	.word UsbDevDescType			;设备描述符类型,= 01H
	.word 10h						;协议版本,= 1.10
	.word 01h						;协议版本,= 1.10
	
	.word 0dch;//0, 				;测试设备类型, = 0DCH	
	.word 0, 0						;设备子类,设备协议
	.word Ep0PacketSize 			;端点0最大数据包大小,= 10H	
	.word 71h						;PHILIPS公司的设备ID
	.word 04h						;PHILIPS公司的设备ID
	
	.word 66h						;设备制造商定的产品ID
	.word 06h						;设备制造商定的产品ID

	.word 00h						;设备系列号
	.word 01h						;设备系列号

	.word 0, 0, 0					;索引
	.word 1							;可能的配置数

table2:	
									;配置描述符
	.word UsbCfgDescSize			;配置描述符长度,= 09H
	.word UsbCfgDescType			;配置描述符类型,= 02H
	.word UsbTotalCfgDescSize		;描述符总长度, = 002EH
	.word 0
	.word 1							;只支持1个接口
	.word 1							;配置值
	.word 0							;字符串描述符指针(无)
	.word 80h						;自供电,支持远程唤醒
	.word 32h						;最大功耗(100mA)

									;接口描述符
	.word UsbItfDescSize			;接口描述符长度,= 09H
	.word UsbItfDescType			;接口描述符类型,= 04H
	.word 0							;接口数,只有1个
	.word 0							;可选配置,只有1个
	.word EndpCnt					;除端点0的端点索引数目,= 04H
	.word 0dch;UsbClassMassStorage,	;测试设备类型,= 0DCH
	.word 0a0h;UsbSubClassUfi,		;子类代码,= 0A0H	
	.word 0b0h;UsbProtocolBulk,		;协议代码,= 0B0H
	.word 0							;字符串描述符索引
;========================================
									;端点描述符,端点1输入
	.word UsbEndpDescSize			;端点描述符长度,= 07H
	.word UsbEndpDescType			;端点描述符类型,= 05H
	.word 81h						;端点1 IN
	.word UsbEndpInterrupt			;中断传输, = 03H
	.word Ep1PacketSize				;端点最大包的大小,= 0010H
	.word 0							;传输间隔时间,= 10ms
	.word 10
									;端点描述符,端点1输出
	.word UsbEndpDescSize			;端点描述符长度,= 07H
	.word UsbEndpDescType			;端点描述符类型,= 05H
	.word 01h						;端点1 OUT
	.word UsbEndpInterrupt			;中断传输,= 03H
	.word Ep1PacketSize				;端点最大包的大小,= 0010H
	.word 0							;传输间隔时间,= 10ms
	.word 10
;========================================
									;端点2输入
	.word UsbEndpDescSize			;端点描述符长度,= 07H
	.word UsbEndpDescType			;端点描述符类型,= 05H
	.word 82h						;端点2 OUT
	.word UsbEndpBulk				;批量传输,= 02H
	.word Ep2PacketSize				;端点最大包的大小,= 0040H
	.word 0							;批量传输时该设备无效
	.word 10
									;端点2输出
	.word UsbEndpDescSize			;端点描述符长度,= 07H
	.word UsbEndpDescType			;端点描述符类型,= 05H
	.word 2h						;端点2 IN	
	.word UsbEndpBulk				;批量传输,= 02H
	.word Ep2PacketSize				;端点最大包的大小,= 0040H
	.word 0							;批量传输时该设备无效
	.word 10
;******************************************	
;=========================================*
;程序由此开始							  *
;=========================================*
;******************************************	
_c_int0
	SETC	INTM 				;disable all interrupt
	SETC	SXM 				;sign extend enable
	CLRC  	OVM 				;
	CLRC  	CNF 				;B0 mapto datamemory
	
	LDP		#00e0H					
	SPLK	#0281H,SCSR1		;clkin=10M cpuclk=2*clkin
	SPLK	#00E8H,WDCR			;diable watchdog
	
	LDP 	#6
	LACL 	#0108H
	AND 	#0108H
	SACL 	ARR0
	OUT 	ARR0,0ffffh

	LDP		#0
	SPLK	#0000H,IMR			;diable all interrupt.
	SPLK	#0ffffH,IFR			;write '1' clear all intflag.
	LDP		#0e1H					
	SPLK	#0004H,MCRA			;XINT1/PA2 as interrupt input pin.
	
	LDP		#06H					

	LACL 	#00F4H
	SACL 	COMMAND_BUF
	CALL 	OUTPORTC			;read USB interrupt regs. clear intflag bit7/6
	
	CALL 	INPORTD
	CALL 	INPORTD

	LACL 	#0040H
	SACL 	COMMAND_BUF
	CALL 	OUTPORTC			;read USB interrupt regs. clear intflag bit7/6
	CALL 	INPORTD
	

	LACL 	#0041H
	SACL 	COMMAND_BUF
	CALL 	OUTPORTC			;read p0 last out status clear intflag bit5..0
	CALL 	INPORTD
	
	LDP		#0
	SPLK	#0001H,IMR			;enable INT1 interrupt
	LDP		#0E0H
	SPLK	#0001H,XINT1CR		;enable xint1,in INT1,falling_edge

	LDP		#6
	LACL  	#00FDH
	SACL 	COMMAND_BUF
	CALL 	OUTPORTC
	
	CALL 	INPORTD				;read usb ID
	LACL 	READ_DATA
	SACL 	ARR0
	CALL 	INPORTD
	LACL 	READ_DATA
	SACL 	ARR1	
	
	SPLK	#00D8H,1
	OUT 	1,D12_COM 			;set point and enable
	SPLK	#0001H,1	
	OUT 	0001H,D12_DAT 	
	SPLK	#00F3H,1
	OUT 	0001H,D12_COM 	
	SPLK	#000CH,1	
	OUT 	0001H,D12_DAT 		;softconnect off

	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	CALL	DELAY1
	
	SPLK	#00F3H,1
	OUT 	0001H,D12_COM 	
	
	SPLK	#001CH,1	
	OUT 	0001H,D12_DAT 		;softconnect on
	
	SPLK	#000BH,1	
	OUT 	0001H,D12_DAT 	
	
	SPLK	#0F3H,COMMAND_BUF	;输出设置模式指令
	CALL    OUTPORTC
	
	SPLK	#012H,DATA_BUF		;输出配置字节信息
	CALL    OUTPORTD

	SPLK	#043H,DATA_BUF		;输出时钟分频因数字节
	CALL    OUTPORTD
;========================================	
;复制程序表TABLE1地址到RAM380地址处
;========================================	
	AND 	#0
	LACL 	#0380h
	SACL 	ARR7
	LAR     AR0,ARR7			;目标指针首地址进AR0/这里要进行绝对地址转换
	LACL 	#044H				;源地址进累加器(程序表从0X44开始也可以用标号TABLE1)
	LAR     AR1,#63
COPY_LOOP:	
	MAR 	*,AR0				;当前辅助存储器为AR0
								;以下是将数据表由程序存储器转移到数据存储器中
	TBLR	*+					;将A所指地址的数据转移到AR0所指的地址中去 					
	ADD 	#1					;源地址自加
	MAR 	*,AR1				;当前辅助存储器为AR1
	BANZ 	COPY_LOOP	
;==========================================	
	LDP 	#6
	LACL 	#0
	SACL 	ARR6
	LACL 	#0
	SACL 	ARR5
	CLRC	INTM 				;enable interrupt.	
;=======================================
;主循环	
;=======================================
LOOP:
	B		LOOP

;========================================	
;复制程序表TABLE1地址到RAM380地址处
;========================================	
COPY_PROG_TO_RAM:
	LDP		#6
	AND 	#0
	LACL 	#0380h
	SACL 	ARR7
	LAR     AR0,ARR7				;目标指针首地址进AR0/这里要进行绝对地址转换
	LACL 	#044H					;源地址进累加器(程序表从0X44开始也可以用标号TABLE1)
	LAR     AR1,#63
COPY_LOOP1:	
	MAR 	*,AR0					
									;以下是将数据表由程序存储器转移到数据存储器中
	TBLR	*+						;将A所指地址的数据转移到AR0所指的地址中去 					
	ADD 	#1						;源地址自加
	MAR 	*,AR1					;当前辅助存储器为AR1
	BANZ 	COPY_LOOP1	
	RET

DELAY1:
	LAR     AR1,#200
DELAY_LOOP:	
	MAR 	*,AR1					
	BANZ 	DELAY_LOOP
	RET	

;=======================================
; 功能描述: D12中断服务程序
;在此入口判断中断向量PRVR的值
;=======================================
EXTERN_INIT1:
	
    SST     #0,ST0backup                ;save st0 to st0backup(dp=0)
    SST     #1,ST1backup   
    LDP     #0
    SACL    ACCbackup
    SACH    ACCbackup+1
    SPL     PREGbackup
    SPH     PREGbackup+1
    MPY     #1            	            ;treg*1->preg
    SPL     TREGbackup    	          
										;外部中断1向量入口
	;保护现场
	SETC	INTM						;关中断
	LDP		#6
	
	CALL    D12_ReadInterruptRegister	;读取PDIUSBD12中断寄存器值
	
	BIT		INIT_REG,D12_INT_BUSRESET
	BCND    INIT_DMA,NTC

INIT_BUS_RESET:							;总线复位处理
	CALL 	bus_reset					

INIT_DMA:								;DMA传输技术处理
	BIT		INIT_REG,D12_INT_EOT
	BCND    INIT_USB_SUSPEND,NTC
	CALL 	dma_eot						

INIT_USB_SUSPEND:						;总线挂起改变
	BIT		INIT_REG,D12_INT_SUSPENDCHANGE
	BCND    INIT_EP0_TXDDONE,NTC
	CALL 	usb_suspend					

INIT_EP0_TXDDONE:						;控制端点发送数据处理
	BIT		INIT_REG,D12_INT_ENDP0IN
	BCND    INIT_EP0_RXDDONE,NTC
	CALL 	ep0_txdone					

INIT_EP0_RXDDONE:						;控制端点接收数据处理
	BIT		INIT_REG,D12_INT_ENDP0OUT
	BCND    INIT_USB_WriteISR1,NTC
	CALL 	ep0_rxdone					
	
INIT_USB_WriteISR1:						;端点 1发送数据处理
	BIT		INIT_REG,D12_INT_ENDP1IN
	BCND    INIT_USB_ReadISR1,NTC
	LACL 	#3
	SACL 	ARR0
	CALL 	D12_ReadLastTransactionStatus;复位中断寄存器

INIT_USB_ReadISR1:						;端点 1接收数据处理
	BIT		INIT_REG,D12_INT_ENDP1OUT
	BCND    INIT_USB_WriteISR2,NTC
	LACL 	#2
	SACL 	ARR0
	LACL 	#15
	SACL 	ARR1
	LACL 	#1
	SACL 	ARR2	
	CALL 	USB_ReadISR					
	
INIT_USB_WriteISR2:						;端点2发送数据处理
	BIT		INIT_REG,D12_INT_ENDP2IN
	BCND    INIT_USB_ReadISR2,NTC
	LACL 	#5
	SACL 	ARR0
	CALL 	D12_ReadLastTransactionStatus;复位中断寄存器

INIT_USB_ReadISR2:						;端点2接收数据处理
	BIT		INIT_REG,D12_INT_ENDP2OUT
	BCND    INIT_RET,NTC
	
	LACL 	#4
	SACL 	ARR0
	LACL 	#64
	SACL 	ARR1
	LACL 	#2
	SACL 	ARR2	
	
	CALL 	USB_ReadISR	
INIT_RET:					
	;恢复现场	
	LDP 	#0E0H
    SPLK 	#8001H,XINT1CR

    LDP     #0
    LT      PREGbackup  	            ;preg_l->treg*1->preg
    MPY     #1             
    LPH     PREGbackup+1
    LT      TREGbackup
    LACC    (ACCbackup+1),16            ;ACC_h->acch
    OR      ACCbackup                   ;ACC_l->accl
    LST     #1,ST1backup
    LST     #0,ST0backup

	CLRC 	INTM
	RET

;=======================================
;未定义的中断处理,假中断服务程序
;=======================================
NOTHING_INIT:
	RET	
		
;=======================================
;连接USB
;=======================================
connect_USB:
	SPLK	#0F3H,COMMAND_BUF			;输出设置模式指令
	CALL    OUTPORTC	
	SPLK	#012H,DATA_BUF				;输出配置字节信息
	CALL    OUTPORTD

	SPLK	#043H,DATA_BUF				;输出时钟分频因数字节
	CALL    OUTPORTD
	RET
		
DELAY2:
	CALL 	DELAY
	CALL 	DELAY
	RET

;=======================================
;延时子程序
;=======================================
DELAY:	
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -