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