📄 chaxunjieshou.asm
字号:
#include "def21060.h"
#define M1 0xa
#define M2 0x3
#define addr 0x10800000
#define buttonstate 0x600000
#define lightstate 0x400000
#define N1 0xa
#define N2 0xa
#define N3 0x18
#define N4 0x10
#define N 0x8
#define N5 0x4
.segment/dm seg_dmda;
.var zw1[1]=0;
.var zw2[1]=0xa;
.var zw3[1]=0x3;
.var REG_TxBuffer[N2]=0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12,0x13; //发送缓冲区地址
.var REG_RxBuffer[N2]=0x14,0x15,0x16,0x17,0x18,0x29,0x20,0x21,0x22,0x23; //接收缓冲区地址
.var CanjsBuffer[48]; //定义一个21060接收数组
.var source[N]=0x0,0x1f,0x4,0x5,0x6,0x7,0x8,0x0;
.var data1[N]=0x01,0x0,0x76,0xff,0x00,0xab,0x1a,0x00;
.endseg;
.segment/pm seg_rth;
nop;nop;nop;nop; //保留的中断矢量地址
_lib_RSTI: nop; //引导时的临时存储单元
jump _main(db); //跳转到正式程序
nop;nop;
nop;nop;nop;nop; //保留的中断矢量地址
_lib_SOVFI: rti;rti;rti;rti;
_lib_TMZHI: rti;rti;rti;rti; //高优先级定时器中断矢量地址
_lib_VIRPTI:rti;rti;rti;rti; //矢量中断的矢量地址
_lib_IRQ2I: rti;rti;rti;rti; //外部中断2的矢量地址
_lib_IRQ1I: rti;rti;rti;rti; //外部中断1的矢量地址
_lib_IRQ0I: rti;rti;rti;rti; //外部中断0的矢量地址
nop;nop;nop;nop; //保留的中断矢量地址
_lib_SPR0I: rti;rti;rti;rti; //串口0接收中断的矢量地址
_lib_SPR1I: rti;rti;rti;rti; //串口1接收/链路0中断矢量地址
_lib_SPT0I: rti;rti;rti;rti; //串口0发送中断的矢量地址
_lib_SPT1I: rti;rti;rti;rti; //串口1发送/链路1中断矢量地址
_lib_LPT2I: rti;rti;rti;rti; //链路2中断矢量地址
_lib_LPT3I: rti;rti;rti;rti; //链路3中断矢量地址
_lib_EPT0I: rti;rti;rti;rti; //外部口0/链路4中断矢量地址
_lib_EPT1I: rti;rti;rti;rti; //外部口1/链路5中断矢量地址
_lib_EPT2I: rti;rti;rti;rti; //外部口2中断矢量地址
_lib_EPT3I: rti;rti;rti;rti; //外部口3中断矢量地址
_lib_LSRQ: rti;rti;rti;rti; //链路服务请求中断矢量地址
_lib_CB7I: rti;rti;rti;rti; //循环缓冲7溢出中断矢量地址
_lib_CB15I: rti;rti;rti;rti; //循环缓冲7溢出中断矢量地址
_lib_TMZLI: rti;rti;rti;rti; //低优先级定时器中断矢量地址
.endseg;
.segment/dm seg_aaa; //定义4个外部段,每段的大小在主程序里面进行设定
.endseg;
.segment/dm seg_bbb;
.endseg;
.segment/dm seg_ccc;
.endseg;
.segment/dm seg_ddd;
.endseg;
.segment/pm seg_pmco;
_main:
r1=0x0000f000;
r2=dm(SYSCON);
R3=R1 OR R2;
DM(SYSCON)=r3; //定义4个外部块的大小
i4=CanjsBuffer; //把这2条放在这里是为了在下一次读数据的时候不会被初始化
m4=1;
r7=0;
r8=0x30;
r10=0xE;
/***********************************************************************************
以下是一个控制接受开始的一个小程序,作用同控制发送开始的小程序一样
**************************************************************************************/
testbutton:
r1=0x0000f000;
r2=dm(SYSCON);
R3=R1 OR R2;
DM(SYSCON)=r3; //定义4个外部块的大小
r1=0x80000000;
r0=dm(buttonstate);
nop;nop;
r0=r0 and r1;
nop;nop;
if eq jump initialcan;
nop;nop;
jump testbutton; //由板子上的最边上一个按键控制,靠近SJA1000的那个
nop;nop;
//**************************************************************************************
initialcan:
r1=0x0000f000;
r2=dm(SYSCON);
R3=R1 OR R2;
DM(SYSCON)=r3; //定义4个外部块的大小
computation:
bit set mode2 FLG0O; //设置flag0输出
bit set mode2 FLG1O; //设置flag1输出
i0=source;
m0=1;
i1=data1;
m1=1;
lcntr=N,do aaa until lce;
bit clr astat FLG0;
bit set astat FLG1;
r0=dm(i0,m0); //从source缓冲区取得数据,事后修改
dm(addr)=r0; //写地址
bit set astat FLG0;
bit clr astat FLG1;
r1=dm(i1,m1); //从data缓冲区取得数据
dm(addr)=r1; //写数据
nop;nop;nop;nop;
bit set astat FLG1; //禁止读写SJA1000,即不选种SJA1000的CS
aaa:nop; //搞清楚循环体的用法
delay1:
lcntr=N4,do bbb until lce;
nop;
bbb:nop;
/*
detectstate:
bit clr astat FLG0;
bit set astat FLG1;
r0=0x2;
dm(addr)=r0;
bit set astat FLG0;
bit clr astat FLG1;
r1=dm(addr);
bit set astat FLG1; //将SJA1000的状态寄存器的值读回来
*/
/******************************************************************************
以下程序是为了软件进入工作模式
********************************************************************************/
/*
bit clr astat FLG0;
bit set astat FLG1;
r0=dm(0);
dm(addr)=r0;
bit set astat FLG0;
bit clr astat FLG1;
r1=0x02;
dm(addr)=r1;
bit set astat FLG1;
*/
test:
i0=source;
r15=1;
bit clr astat FLG0;
bit set astat FLG1;
r2=dm(i0,0);
dm(addr)=r2;
bit set astat FLG0;
bit clr astat FLG1;
r3=dm(addr);
nop;nop;
r3=r3 and r15;
nop;nop;
if NE jump computation; //NE 是指AZ=0,对通用寄存器进行的操作是会影响ASTAT的
nop;nop;
//************************************************************************************
release1:
bit clr astat FLG0;
bit set astat FLG1;
r2=0x1;
dm(addr)=r2;
bit set astat FLG0;
bit clr astat FLG1;
r3=0x4;
dm(addr)=r3;
//*************************************************************************************
ask:
bit clr astat FLG0;
bit set astat FLG1;
R3=0x2;
dm(addr)=r3;
bit set astat FLG0;
bit clr astat FLG1;
r4=dm(addr);
nop;nop;
r4=r4 and r15; //r15等于1,如果接受缓冲器的RBS为空,则说明没有数据被接受到。
nop;nop;nop;
if eq jump delay2; //继续进行查询
/*************************************************************************************
以下是接受程序
**************************************************************************************/
receive:
i3=REG_RxBuffer;
m3=1;
lcntr=N5,do eee until lce;
bit clr astat FLG0;
bit set astat FLG1;
r0=dm(i3,m3);
dm(addr)=r0;
bit set astat FLG0;
bit clr astat FLG1;
r1=dm(addr);
dm(i4,m4)=r1;
nop;nop;
eee:nop;
release2:
bit clr astat FLG0;
bit set astat FLG1;
r2=0x1;
dm(addr)=r2;
bit set astat FLG0;
bit clr astat FLG1;
r3=0x4;
dm(addr)=r3;
nop;nop;
//******************************************************************************************
//以下程序是在接受了40个数据以后就停止接受
r7=r7+1;
nop;nop;
r9=r8-r7;
if eq jump back;
nop;
delay2:
lcntr=4,do ddd until lce;
nop;nop;
ddd:nop;
nop;nop;
jump ask;
nop;nop;
//********************************************************************************************
//以下是把接受的数据用灯闪烁出来
//灯是从D37到D20,这18个灯。因为我们是传的定点数,所以数据最低位是D16
back:
i2=CanjsBuffer;
m2=1;
blink:
r1=dm(i2,m2);
nop;nop;
r1=LSHIFT r1 by r10;
nop;nop;
dm(lightstate)=r1;
delay3:
lcntr=80000000;do ccc until lce;
nop;
ccc:nop;
r11=r11+1;
nop;nop;
r12=r8-r11;
if eq jump over;
nop;
jump blink;
//********************************************************************************
over:
r4=0x00555555;
sss:dm(0x00400000)=r4;
lcntr=5000000; do loop1 until lce;
loop1: nop;
r4=not r4;
dm(0x400000)=r4;
jump sss;
nop;nop;
.endseg;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -