📄 main.asm
字号:
;===================================================
;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 + -