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

📄 can.asm

📁 can总线的dsp程序
💻 ASM
字号:
 		.mmregs	;用CAN通过SPI向PC机发送数据的程序		.def bsp
		.def start
		.def INTERRUPT1_CAN,clear_2510
	
k0	.usect   "out_vars",1	;
k1	.usect   "out_vars",1	;
k2	.usect   "out_vars",1	;
k3	.usect   "out_vars",1	;
k4	.usect   "out_vars",1	;								 	
k5  .usect   "out_field" ,1 	;输出数据缓冲区		
k6  .usect   "out_field" ,1 
k7  .usect   "out_field" ,1 
k8  .usect   "out_field" ,1 
k9  .usect   "out_field" ,1 
k10  .usect   "out_field",1 
k11  .usect   "out_field",1 
k12  .usect   "out_field",1 
j0  .usect   "in_vars" ,1
j1  .usect   "in_vars" ,1
j2  .usect   "in_vars" ,1
j3  .usect   "in_vars" ,1	;
j4  .usect   "in_vars" ,1	;
j5  .usect   "in_field" ,1	;输入数据缓冲区
j6  .usect   "in_field" ,1
j7  .usect   "in_field" ,1
j8  .usect   "in_field" ,1
j9  .usect   "in_field" ,1
j10  .usect   "in_field" ,1
j11  .usect   "in_field" ,1
j12  .usect   "in_field" ,1
func_vars 	.usect   "func_vars",1
rxif_vars 	.usect   "func_vars",1
flag        .usect   "func_vars",1
;*******************************
;使用缓冲串口0
;预定义
;********************************
spsa0 .set 38h ;子地址寄存器
spcd0 .set 39h ;子地址数据寄存器
drr20 .set 20h ;数据接收寄存器2
drr10 .set 21h ;数据接收寄存器1
dxr20 .set 22h ;数据发送寄存器2
dxr10 .set 23h ;数据发送寄存器1
spcr10 .set 00h  ;设置mcbsp的子地址
spcr20 .set 01h
rcr10  .set 02h
rcr20  .set 03h
xcr10  .set 04h
xcr20  .set 05h
srgr10 .set 06h
srgr20 .set 07h
mcr10  .set	08h
mcr20  .set 09h
rcera0 .set 0ah
rcerb0 .set 0bh
xcera0 .set 0ch
xcerb0 .set 0dh
pcr0   .set 0eh
;********************************
;**********************************		
K_IPTR .set 000111000b<<07																																				
K_TEMP .set 1111111b
D_PMST .usect  "bsp_out_vars",1
		
		.sect "prog"
;******************************************
;配置串口为SPI口一帧传#prog位数据
;**********************************				

PROG_BIT  .macro	progword
		stm spcr10,spsa0 ;设置串口控制寄存器1				
		stm #1800h,spcd0
		stm spcr20,spsa0 ;设置串口控制寄存器2
		stm #0000h,spcd0
		stm rcr10, spsa0 ;设置接收控制寄存器1
		stm #:progword:,spcd0
		stm rcr20, spsa0 ;设置接收控制寄存器2
		stm #0001h,spcd0 
		stm xcr10, spsa0 ;设置发送控制寄存器1
		stm #:progword:,spcd0 
		stm xcr20 ,spsa0 ;设置发送控制寄存器2
		stm #0001h,spcd0 
		stm srgr10,spsa0 ;设置采样率发生器寄存器1
		stm #0077h,spcd0 ;对采样率发生器的频率设计
		stm srgr20,spsa0 ;设置采样率发生器寄存器2
		stm #2000h,spcd0
		stm pcr0,  spsa0 ;设置引脚控制寄存器
		stm #0a08h,spcd0
		rpt #09h
		nop	
		stm spcr20,spsa0
		stm #0040h,spcd0
		rpt #09h
		nop	
		stm spcr10,spsa0
		stm #1801h,spcd0
		stm spcr20,spsa0
		stm #0041h,spcd0
		rpt #09h
		nop	
		RPT #0FFFFH
		NOP
		.endm

write_2510 .macro writeword
		stm #0002H,dxr20
    	stm #:writeword:,dxr10
       	rpt #1500h
       	nop
      	ldm drr20,a
      	ldm drr10,a
       	rpt #1500h
       	nop
		.endm	
read_2510 .macro readadr
		stm #0003h,dxr20
		stm #:readadr:,dxr10
		rpt #1500h
		nop
		ldm drr20,a
		ldm drr10,a 
		nop
		rpt #1500h
		nop
		nop
		and #00ffh,a
		nop
		nop
		.endm
BITMODIFY .macro tran_num
		PROG_BIT 00c0h
		stm #052CH,dxr20
		stm #:tran_num:,dxr10
		rpt #3000h
		nop
		PROG_BIT 0080H
		nop
		.endm
				 				 		
;********配置完毕*********************		
start:
		LDM PMST,A	;改变中断向量表
		AND #K_TEMP,A
		OR #K_IPTR,A
		STL A,AR6
		MVDM AR6,PMST

		PROG_BIT 0040H
;***************************************************
;*************设置中断******************************		
		
		stm #0100h,IFR
		nop
		nop
		nop	
		stm #0100h,IMR ;设置中断,开INT3的中断
		nop
		nop
		nop	
;***********************************
;*****对2510复位***************
		stm #0c0c0h,dxr10
		rpt #0FFFFh
		nop
		PROG_BIT 0080H
;********配置完毕*********************
;***************************************		
;*******对2510进行初始化*****************	
		read_2510 2800h	
    	write_2510 0d07h
		write_2510 2802h
		write_2510 29d0h
		write_2510 2a31h
		write_2510 0d07h
		write_2510 0000h
		write_2510 0102h
		write_2510 02ffh
		write_2510 03ffh
		write_2510 2000h
		write_2510 210fh
		write_2510 22ffh
		write_2510 23ffh
		write_2510 0f00h
		write_2510 2b9fh
		write_2510 2c00h
		write_2510 2d00h
		write_2510 3003h
		write_2510 6004h
		write_2510 7000h
;******初始化结束*******************		
;************************************
		read_2510 2800h
		read_2510 2900h
		read_2510 2a00h
;*********以上读测试***********************	
		
		ssbx intm	;开可屏蔽中断
		LD #k0,DP
		st #00h,flag
zhuzhu:
bac:		b TRANSMIT	
	
back2:	
		ld flag,b
    	bc congfa,bneq
		st #0066h,k0	;k0
		st #0020h,k1	;k1
		st #0000h,k2	;k2
		st #0000h,k3	;k3
		st #0008h,k4	;k4
		st #0006h,k5	;k5
		st #0059h,k6	;k6
		st #0001h,k7	;k7		 
		st #0001h,k8	;k8
		st #0001h,k9	;k9
		st #0003h,k10	;k10
		st #0003h,k11	;k11
		st #0067h,k12	;k12
		b fa
congfa:
		stm #j0,ar1
		stm #k0,ar2
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
		ld *ar1+,b
		nop
		nop
		stl b,*ar2+
		nop
		nop
				
fa:		b TRDATA
back1:	nop
		nop
		rsbx intm
		nop
wat:	nop
		nop
		rpt #0ffffh
		nop
		read_2510 2c00h
		ld flag,b
		nop
    	nop
		nop
		bc bac,bneq
		b wat
;******************************************
INTERRUPT1_CAN:				;CAN中断程序
		ssbx intm
		stl a,func_vars
		read_2510 2c00h
		read_2510 2c00h
		stl a,j0
MERRE:  nop
		and #0080h,a
		nop
		bc jiucuo,aneq
TX0IF:	read_2510 2c00h
		stl a,j0	
		and #0004h,a
		nop
		bc TX1IF,aeq
		nop
		call TXCAN
TX1IF:  ldm j0,a
		and #0008h,a
		nop
		bc TX2IF,aeq
		nop
		call TXCAN
TX2IF:  ldm j0,a
		and #0010h,a
		nop
		bc RXNIF,aeq
		nop
		call TXCAN
RXNIF:	nop
		ld j0,a
		nop
		nop
		nop
		and #0001h,a
		nop
		bc RX0IF,aneq	
		ld j0,a
	    and #0002h,a
	    bc RX1IF,aneq  
INTERRUPT1_OUT: 
		nop
		nop
		rsbx intm
		ldm func_vars,a
		ret		;CAN中断程序完
		
;**************************************
RECEIVE:           ;接受数据
				
RX0IF:	xor j0,a
    	st #00ffh,flag
		or #2c00h,a
		stm #0002h,dxr20
		stlm a,dxr10
		rpt #3000h
		nop
		ldm drr20,a
		ldm drr10,a
		nop
		
		ld #000dh,b
		ld #6100h,a
		nop
		nop
		nop
		stm #j0,ar1
		rpt #0ffffh
		nop
************************		
		rpt #0ffffh
		nop
		stm #0003h,dxr20
		stlm a,dxr10
		rpt #0ffffh
		nop
		stl a,rxif_vars 
		nop
		nop
		nop
		ldm drr20,a
		ldm drr10,a
		rpt #0ffffh 
		nop
		and #00ffh,a
		nop
		stl a,*ar1+
		nop
		nop
		ld rxif_vars,a
		rpt #1000h
		nop
		add #0100h,a
		sub #0001h,b
		nop
		rpt #3000h
		nop
******************	
		ld #000dh,b	
		stm #j0,ar1
read_lop:
		rpt #0ffffh
		nop
		stm #0003h,dxr20
		stlm a,dxr10
		rpt #0ffffh
		nop
		stl a,rxif_vars 
		nop
		nop
		nop
		ldm drr20,a
		ldm drr10,a
		rpt #0ffffh 
		nop
		and #00ffh,a
		nop
		stl a,*ar1+
		nop
		nop
		ld rxif_vars,a
		rpt #1000h
		nop
		add #0100h,a
		sub #0001h,b
		nop
		rpt #3000h
		nop
		bc read_lop,bneq	
		nop
		nop	
		b INTERRUPT1_OUT
RX1IF:	xor j0,a
		or #2c00h,a
		stm #0002h,dxr20
		stlm a,dxr10
		rpt #3000h
		nop
		ldm drr20,a
		ldm drr10,a
		nop
		
		read_2510 7500h
		stl a,j0
		add #5h,a
		and #000fh,a
		ld a,b
		ld #7100h,a
		stm #j0,ar1
read_lop1:
		stm #0003h,dxr20
		stlm a,dxr10
		rpt #3000h
		nop
		stl b,rxif_vars 
		nop
		nop
		ldm drr20,b
		ldm drr10,b
		nop
		and #00ffh,b
		nop
		stl b,*ar1+
		nop
		nop
		ld rxif_vars,b
		add #0100h,a
		sub #0001h,b
		nop
		bc read_lop1,bneq
;判断是否是主机地址
PDDZ:	ldm j0,a
		and #001fh,a
		sfta a,3
		ldm j1,b
		and #00e0h,b
		sfta b,3
		or b,a
		sub #0059h,a
		bc kongzideng,aneq
		ld #00ffh,a
		b nxt
kongzideng:
		ld #0000h,a
nxt:	nop
;判断完毕
b_pddz: bc INT1_CAN1,aneq
		call clear_2510		
		b INTERRUPT1_OUT
INT1_CAN1:		
;***********判断校验是否正确*****
		ld j4,a
		and #000fh,a
		ld b,a
		ld #00b9h,a
		stm #j5,ar1
PDJY1:	xor *ar1+,a	
		sub #1,b
		bc PDJY1,bneq
		bc PDJY2,aeq
		ld #0000h,a
PDJY2:	ld #00ffh,a		
;***********判断完**********
		bc INT1_CAN2,aneq
		call clear_2510
		b INTERRUPT1_OUT		
INT1_CAN2:
			;*******处理********	
		b INTERRUPT1_OUT							
;***********纠错*************************
jiucuo:
		read_2510 2c00h
		stl a,j0
		and #0080h,a
		bc jiu1,aeq
		rpt#6000h
		nop
jiu1:	nop
		b TX0IF
;************纠错完********************				
		
;***************************************

TRANSMIT:					;传输函数
		read_2510 2c00h
		stl a,j0
		and #0004h,a	
		bc USETX0IF,aeq
		ld j0,a
		and #0008h,a
		bc USETX1IF,aeq
		and #0010h,a
		bc USETX2IF,aeq
		b back2	
USETX0IF:
		;BITMODIFY 0400H
		PROG_BIT 00A0h
		stm #052CH,dxr20
		stm #0400H,dxr10
		rpt #0FFFFh
		nop
		PROG_BIT 0080H
		nop
		read_2510 2c00h
		rpt #0ffffh
		nop
		ld #3100h,a
		nop
		nop
		B back2 
USETX1IF:
		BITMODIFY 0800H
		read_2510 2b00h
		ld #4100h,a	
		B back2
USETX2IF:
		BITMODIFY 1000H	
		ld #5100h,a	
		B back2
;*********************************
;**********************************									
TRDATA:	
		st #0000h,flag
		ld #000dh,b
		nop
		nop
		stm #k0,ar1
		nop
		nop
lop3:	or *ar1+,a
		nop
		nop
		nop
		stm #0002h,dxr20
		stlm a,dxr10
		rpt #0ffffh
		nop
		rpt #0ffffh
		nop
		sub #1,b
		add #0100h,a
		nop
		and #0ff00h,a
		bc lop3,bneq
		rpt #0ffffh
		nop
		rpt #0ffffh
		nop
		write_2510 300bh
		nop
		nop
		nop
		nop
		b back1		
;******************************
TXCAN:	.text
		xor j0,a
		stl a,j0
		or #002ch,8,a
		stm #0002h,dxr20
		stlm a,dxr10
		rpt #3000h
		nop
		ldm drr20,a
		ldm drr10,a
		nop
		ret			
;*******************************
clear_2510:
  		.text
		ld #0013h,b
		stm #0030h,ar1
lop2:	stm #0000h,*ar1
		sub #0001h,b
		bc lop2,bneq			
		ret	
;*******************************
		.end

⌨️ 快捷键说明

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